MTProto рдкреНрд░реЙрдХреНрд╕реА рдЖрдБрдХрдбрд╝реЗ рд╕рдВрдЧреНрд░рд╣

рд╕рд╛рдордЧреНрд░реА
  • рдкреНрд░рд╛рдЧрд┐рддрд┐рд╣рд╛рд╕
  • рд╕рд╛рдВрдЦреНрдпрд┐рдХреА рд╕рдВрдЧреНрд░рд╣
  • рдЖрдВрдХрдбрд╝реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ
  • рджреГрд╢реНрдп рдФрд░ рдЖрдБрдХрдбрд╝реЗ
  • рд╕реНрдХреИрди
  • рдирд┐рд╖реНрдХрд░реНрд╖


рдкреНрд░рд╛рдЧрд┐рддрд┐рд╣рд╛рд╕


рд╣рд╛рдп рд╣рдмреНрд░, рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдЕрдм рд▓реЛрдХрдкреНрд░рд┐рдпрддрд╛ рдХреЗ рдЪрд░рдо рдкрд░ рд╣реИрдВ, рд╕рднреА рдШреЛрдЯрд╛рд▓реЛрдВ, рд╕рд╛рдЬрд╝рд┐рд╢реЛрдВ, рддрд╛рд▓реЗ рдЙрд╕рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдШреВрдорддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рд╕рд┐рд▓рд╕рд┐рд▓реЗ рдореЗрдВ рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдиреЗ MTProto Proxy рдирд╛рдордХ рдкреНрд░реЙрдХреНрд╕реА рдХреЗ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд░реЛрд▓ рдХрд┐рдпрд╛, рдЬрд┐рд╕реЗ рд▓реЙрдХ рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЯреЗрд▓реАрдЧреНрд░рд╛рдо MTProto рдкреНрд░реЙрдХреНрд╕реА рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдирд┐рдЧрд░рд╛рдиреА рд╕реЗрд╡рд╛рдПрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдореЗрдВ рдЖрдВрдХрдбрд╝реЛрдВ рдХрд╛ рдЕрд╡рд▓реЛрдХрди рдХрд░рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддреА рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЕрдкрдиреЗ рджрдо рдкрд░ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд░реЗрдВрдЧреЗред

рд╕рд╛рдВрдЦреНрдпрд┐рдХреА рд╕рдВрдЧреНрд░рд╣


рдбреЙрдХрд░ рд╣рдм рдкрд░ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ MTProto рдкреНрд░реЙрдХреНрд╕реА рдкреЗрдЬ рдореЗрдВ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рд╣рдо рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдореМрдЬреВрдж MTProto рдкреНрд░реЙрдХреНрд╕реА рд╕реЗ рд╕реАрдзреЗ docker exec mtproto-proxy curl http://localhost:2398/stats рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП docker exec mtproto-proxy curl http://localhost:2398/stats рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░рд╛ рдХреЛрдб рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛ред

 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 рд╣рдм рдкрд░ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ

рдЖрдВрдХрдбрд╝реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ


рдЕрдЧрд▓рд╛, рд╣рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рд╡рд░реНрддрдорд╛рди рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╕рд░рд▓ рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд░реВрдк рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╣рдо рдЗрд╕реЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ рдХрд░реЗрдВрдЧреЗред

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

init рдХреНрдпрд╛ рд╣реИ
рдореБрдЦреНрдп рдХреЙрд▓ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЗрдирд┐рдЯ рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛

рдЕрдм, рд╣рдорд╛рд░реЗ MTProto рдкреНрд░реЙрдХреНрд╕реА рдХреЗ IP рдкрддреЗ рдкрд░ рдЬрд╛рдХрд░, рд╣рдо рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреА рд╡рд░реНрддрдорд╛рди рд╕рдВрдЦреНрдпрд╛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред

рдЫрд╡рд┐

рджреГрд╢реНрдп рдФрд░ рдЖрдБрдХрдбрд╝реЗ


рдбреЗрдЯрд╛рдбреЙрдЧ , рдЬрд╝реИрдмрд┐рдХреНрд╕ , рдЧреНрд░рд╛рдлрд╛рдирд╛ , рдЧреНрд░реЗрдлрд╛рдЗрдЯ рдХреЗ рдЖрдВрдХрдбрд╝реЛрдВ рдХреЛ рджреЗрдЦрдиреЗ рдФрд░ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВред рдореИрдВ рджрд╛рддрд╛рджреЛрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред рдХрдорд╛рдВрдб go get -u github.com/DataDog/datadog-go/statsd statsd go get -u github.com/DataDog/datadog-go/statsd рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ go get -u github.com/DataDog/datadog-go/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"] 

рд╕реНрдХреИрди


рдкрд╣рд▓реЗ рд╣рдореЗрдВ рдбрд╛рдЯрдбреЙрдЧ рдПрдЬреЗрдВрдЯ рдХреЗ рд╕рд╛рде рдХрдВрдЯреЗрдирд░ рд╢реБрд░реВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛

 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 

рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рд╣рдо рдПрдЬреЗрдВрдЯ рдХреЛ рдЕрдкрдирд╛ рдбреЗрдЯрд╛ рднреЗрдЬ рд╕рдХреЗрдВ, рдЖрдкрдХреЛ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ DD_DOGSTATSD_NON_LOCAL_TRAFFIC рд▓рд┐рдП true рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ

рдЗрд╕рдХреЗ рдмрд╛рдж, docker inspect dd-agent рдХрд░рддреЗ рд╣реБрдП 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 рдкреНрд░реЙрдХреНрд╕реА рдХреЗ рд╕рд╛рде рдХрдВрдЯреЗрдирд░ рдХреЛ рд╢реБрд░реВ рдХрд░рддреЗ рд╕рдордп рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)

рдЫрд╡рд┐

рдФрд░ рдЙрд╕ рдкрд░ рд╣рдорд╛рд░реЗ рдЖрдБрдХрдбрд╝реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВ

рдЫрд╡рд┐

рдЬреАрд╡рд┐рдд рдЙрджрд╛рд╣рд░рдг

рдирд┐рд╖реНрдХрд░реНрд╖


рдЦреБрдж рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдХрд╛рдо рдХреЗ рд▓рд┐рдП рдирдП рдЙрдкрдХрд░рдгреЛрдВ рдХреА рдЦреЛрдЬ рдХреА, рдЙрдирдХреА рдорд╣рд╛рди рд╡рд┐рд╡рд┐рдзрддрд╛ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реБрдЖ рдФрд░ рдореЗрд░реЗ рд╕реНрд╡рд╛рдж рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдХреБрдЫ рдЪреБрдирд╛ред

рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдореИрдВ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рд╣рд░ рдХреЛрдИ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдЕрдкрдиреА рд░рд╛рдп, рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдФрд░ рд╕реБрдЭрд╛рд╡ рд╕рд╛рдЭрд╛ рдХрд░реЗрдВред

рдЧрд┐рддреБрдм рднрдВрдбрд╛рд░

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


All Articles