Koleksi statistik Proxy MTProto

Isi
  • Latar belakang
  • Koleksi statistik
  • Tampilan statistik
  • Visualisasi dan statistik
  • Pindai
  • Kesimpulan


Latar belakang


Hai habr, telegram sekarang berada di puncak popularitas, semua skandal, intrik, kunci berputar di sekelilingnya, sehubungan dengan mana telegram meluncurkan versi proksi sendiri yang disebut MTProto Proxy, yang dirancang untuk membantu mem-bypass kunci. Namun, layanan pemantauan yang disediakan oleh telegram MTProto Proxy tidak memungkinkan mengamati statistik secara real time dan mengumpulkannya untuk memantau perubahannya, oleh karena itu kami akan menyelesaikan masalah sendiri.

Koleksi statistik


Halaman Proxy MTProto resmi di Docker Hub menyatakan bahwa kita dapat menggunakan perintah docker exec mtproto-proxy curl http://localhost:2398/stats untuk mendapatkan statistik langsung dari MTProto Proxy yang ada dalam wadah, sehingga kode kita akan terlihat seperti ini.

 package main import ( "io/ioutil" "net/http" "strings" "time" ) type User struct { Num string } var Users User func CurrenUsers() (err error) { //   response, err := http.Get(`http://localhost:2398/stats`) if err != nil { return } body, err := ioutil.ReadAll(response.Body) if err != nil { return } defer response.Body.Close() stat := strings.Split(string(body), "\n") for _, item := range stat { //        //     if strings.HasPrefix(item, `total_special_connections`) { Users.Num = strings.Split(item, "\t")[1] } } return nil } func main() { for t := time.Tick(10 * time.Second); ; <-t { if err := CurrenUsers(); err != nil { continue } } } 

total_special_connections diindikasikan pada Docker Hub yang sama dengan jumlah koneksi klien yang masuk

Tampilan statistik


Selanjutnya, kita perlu menampilkan jumlah pengguna saat ini dalam bentuk yang sederhana dan nyaman, kita akan menampilkannya ke browser.

 package main import ( "html/template" "io/ioutil" "net/http" "strings" "time" ) type User struct { Num string } type HTML struct { IndexPage string } var Users User var IndexTemplate = HTML{ IndexPage: `<!DOCTYPE html> <html> <head> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css" integrity="sha384-9gVQ4dYFwwWSjIDZnLEWnxCjeSWFphJiwGPXr1jddIhOegiu1FwO5qRGvFXOdJZ4" crossorigin="anonymous"> <title>Stats</title> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> </head> <body> <div class="container-fluid"> <div class="row justify-content-center text-center" style="margin-top: 20%"> <h1>Count of current users of MTProto Proxy: {{.Num}}</h1> </div> </div> </body> </html>`, } func CurrenUsers() (err error) { //   response, err := http.Get(`http://localhost:2398/stats`) if err != nil { return } body, err := ioutil.ReadAll(response.Body) if err != nil { return } defer response.Body.Close() stat := strings.Split(string(body), "\n") for _, item := range stat { //        //     if strings.HasPrefix(item, `total_special_connections`) { Users.Num = strings.Split(item, "\t")[1] } } return nil } func sendStat(w http.ResponseWriter, r *http.Request) { if r.Method == "GET" { t := template.Must(template.New("indexpage").Parse(IndexTemplate.IndexPage)) t.Execute(w, Users) } } func init() { go func() { for t := time.Tick(10 * time.Second); ; <-t { if err := CurrenUsers(); err != nil { continue } } }() } func main() { http.HandleFunc("/", sendStat) http.ListenAndServe(":80", nil) } 

apa itu init
init bagaimanapun akan dipanggil sebelum memanggil utama

Sekarang, pergi ke alamat IP Proxy MTProto kami, kami dapat melihat jumlah klien saat ini.

gambar

Visualisasi dan statistik


Ada banyak pilihan untuk memvisualisasikan dan memelihara statistik Datadog , Zabbix , Grafana , Graphite . Saya akan menggunakan Datadog. Menggunakan perintah go get -u github.com/DataDog/datadog-go/statsd mengimpor perpustakaan statsd dan menggunakannya dalam kode.

 package main import ( "html/template" "io/ioutil" "net/http" "os" "strconv" "strings" "time" "github.com/DataDog/datadog-go/statsd" ) var ( datadogIP = os.Getenv("DDGIP") tagName = os.Getenv("TGN") t, _ = strconv.Atoi(os.Getenv("TIMEOUT")) timeout = time.Duration(t) * time.Second ) type User struct { Num string } type HTML struct { IndexPage string } var Users User var IndexTemplate = HTML{ IndexPage: `<!DOCTYPE html> <html> <head> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css" integrity="sha384-9gVQ4dYFwwWSjIDZnLEWnxCjeSWFphJiwGPXr1jddIhOegiu1FwO5qRGvFXOdJZ4" crossorigin="anonymous"> <title>Stats</title> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> </head> <body> <div class="container-fluid"> <div class="row justify-content-center text-center" style="margin-top: 20%"> <h1>Count of current users of MTProto Proxy: {{.Num}}</h1> </div> </div> </body> </html>`, } func (u User) convert() int64 { num, _ := strconv.Atoi(u.Num) return int64(num) } func CurrenUsers() (err error) { //   response, err := http.Get(`http://localhost:2398/stats`) if err != nil { return } body, err := ioutil.ReadAll(response.Body) if err != nil { return } defer response.Body.Close() stat := strings.Split(string(body), "\n") for _, item := range stat { //        //     if strings.HasPrefix(item, `total_special_connections`) { Users.Num = strings.Split(item, "\t")[1] } } return nil } func sendStat(w http.ResponseWriter, r *http.Request) { if r.Method == "GET" { t := template.Must(template.New("indexpage").Parse(IndexTemplate.IndexPage)) t.Execute(w, Users) } } func init() { if t == 0 { timeout = 10 * time.Second } go func() { for t := time.Tick(timeout); ; <-t { if err := CurrenUsers(); err != nil { continue } } }() //    Datadog go func() error { c, err := statsd.New(datadogIP + ":8125") if err != nil || len(datadogIP) == 0 { return err } c.Namespace = "mtproto." c.Tags = append(c.Tags, tagName) for t := time.Tick(timeout); ; <-t { c.Count("users.count", Users.convert(), nil, 1) } }() } func main() { http.HandleFunc("/", sendStat) http.ListenAndServe(":80", nil) } 


Masih mengumpulkan semua dalam gambar buruh pelabuhan

 FROM telegrammessenger/proxy COPY mtproto_proxy_stat . RUN echo "$(tail -n +2 run.sh)" > run.sh && echo '#!/bin/bash\n./mtproto_proxy_stat & disown' | cat - run.sh > temp && mv temp run.sh CMD [ "/bin/sh", "-c", "/bin/bash /run.sh"] 

Pindai


Pertama, kita perlu memulai wadah dengan agen Datadog

 docker run -d --name dd-agent -v /var/run/docker.sock:/var/run/docker.sock:ro -v /proc/:/host/proc/:ro -v /sys/fs/cgroup/:/host/sys/fs/cgroup:ro -e DD_DOGSTATSD_NON_LOCAL_TRAFFIC=true -e DD_API_KEY=_ datadog/agent:latest 

PENTING sehingga kami dapat mengirim agen data kami, Anda harus menetapkan true untuk variabel lingkungan DD_DOGSTATSD_NON_LOCAL_TRAFFIC

Selanjutnya, menggunakan docker inspect dd-agent kita perlu melihat IP wadah untuk mengirim data ke sana

gambar

dan mulai Proxy MTProto kami dengan menghubungkannya dengan jembatan ke wadah agen

 docker run -d -p 443:443 -p 80:80 -e WORKERS=16 -e DDGIP=172.17.0.2 -e TGN=mtproto:main --link=dd-agent --name=mtproto --restart=always -v proxy-config:/data trigun117/mtproto_proxy_stat 

Dan dalam beberapa menit kita sudah dapat membuat grafik dengan memilih metrik dan sumber yang diinginkan (tag yang ditentukan saat memulai wadah dengan Proxy MTProto)

gambar

dan tampilkan statistik kami di atasnya

gambar

Contoh hidup

Kesimpulan


Bagi saya sendiri, saya menemukan alat-alat baru untuk pekerjaan yang mudah dengan data, berkenalan dengan variasi besar mereka dan memilih sesuatu yang sesuai dengan selera saya.

Terima kasih atas perhatian Anda, saya sarankan semua orang membagikan pendapat, komentar, dan saran mereka di komentar.

Repositori Github

Source: https://habr.com/ru/post/id416087/


All Articles