جمع إحصائيات MTProto الوكيل

المحتويات
  • الخلفية
  • جمع الإحصائيات
  • عرض الإحصائيات
  • التصور والإحصاء
  • مسح
  • الخلاصة


الخلفية


مرحبًا ، البرقيات الآن في ذروة الشعبية ، كل الفضائح ، المؤامرات ، الأقفال تدور حوله ، فيما يتعلق بالبرقية بطرح نسختها الخاصة من الوكيل تسمى MTProto Proxy ، والتي تم تصميمها للمساعدة في تجاوز القفل. ومع ذلك ، فإن خدمات المراقبة التي يقدمها Telegram MTProto Proxy لا تسمح بمراقبة الإحصائيات في الوقت الحقيقي وجمعها لمراقبة التغييرات ، وبالتالي سنحل المشكلة بمفردنا.

جمع الإحصائيات


تنص صفحة MTProto Proxy الرسمية على Docker Hub على أنه يمكننا استخدام الأمر docker exec mtproto-proxy curl http://localhost:2398/stats للحصول على إحصائيات مباشرة من وكيل MTProto الموجود في الحاوية ، لذلك ستبدو الشفرة الخاصة بنا على هذا النحو.

 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 إلى total_special_connections على نفس Docker Hub مثل عدد اتصالات العميل الواردة

عرض الإحصائيات


بعد ذلك ، نحتاج إلى عرض العدد الحالي للمستخدمين في شكل بسيط ومريح ، وسنخرجه إلى المتصفح.

 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) } 

ما هو الحرف الأول
سيتم استدعاء الحرف الأول في أي حال قبل استدعاء الرئيسي

الآن ، بالانتقال إلى عنوان IP لوكيل MTProto الخاص بنا ، يمكننا رؤية العدد الحالي للعملاء.

الصورة

التصور والإحصاء


هناك العديد من الخيارات لتصور الإحصائيات الخاصة بـ Datadog و Zabbix و Grafana و Graphite والاحتفاظ بها . سأستخدم Datadog. باستخدام الأمر go get -u github.com/DataDog/datadog-go/statsd statsd مكتبة statsd في الكود.

 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) } 


يبقى جمع كل شيء في صورة عامل ميناء

 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"] 

مسح


أولاً ، نحتاج إلى بدء الحاوية مع وكيل 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 

هام حتى نتمكن من إرسال بياناتنا إلى الوكيل ، تحتاج إلى تعيين true لمتغير البيئة DD_DOGSTATSD_NON_LOCAL_TRAFFIC

بعد ذلك ، باستخدام الأمر docker inspect dd-agent نحتاج إلى إلقاء نظرة على عنوان IP للحاوية لإرسال البيانات إليها

الصورة

وابدأ وكيل MTProto من خلال ربطه بجسر إلى حاوية الوكيل

 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 

وفي غضون دقيقتين ، يمكننا بالفعل إنشاء رسم بياني عن طريق تحديد المقياس والمصدر المطلوبين (العلامة المحددة عند بدء الحاوية باستخدام MTProto Proxy)

الصورة

وعرض إحصائياتنا عليها

الصورة

مثال حي

الخلاصة


بالنسبة لي ، اكتشفت أدوات جديدة للعمل المريح مع البيانات ، وتعرفت على تنوعها الكبير واخترت شيئًا يناسب ذوقي.

شكرا لكم على اهتمامكم ، أقترح على الجميع مشاركة آرائهم وتعليقاتهم واقتراحاتهم في التعليقات.

مستودع جيثب

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


All Articles