背景知识
嗨哈伯,电报现在正处于普及的顶峰,所有丑闻,阴谋,锁都围绕着他旋转,与此相关的是电报推出了自己的代理版本MTProto Proxy,该版本旨在帮助绕开锁。 但是,电报MTProto Proxy提供的监视服务不允许实时观察统计信息并收集它们以监视其变化,因此我们将自行解决问题。
统计资料收集
Docker Hub上的官方MTProto代理页面指出,我们可以使用
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) {
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) {
什么是初始化无论如何,在调用main之前都会调用init
现在,转到我们的MTProto代理的IP地址,我们可以看到当前的客户端数量。

可视化和统计
有许多选项可用于可视化和维护
Datadog ,
Zabbix ,
Grafana ,
Graphite的统计信息。 我将使用Datadog。 使用命令
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) {
它仍然可以收集docker映像中的所有内容
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
重要提示,以便我们可以向代理发送数据,您需要为环境变量
DD_DOGSTATSD_NON_LOCAL_TRAFFIC
设置为
true
接下来,使用
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启动容器时指定的标签)来构建图形。

并显示我们的统计数据
生活例子结论
对我自己来说,我发现了方便使用数据的新工具,熟悉了它们的多样性,并选择了适合我的口味的工具。
感谢您的关注,建议大家在评论中分享他们的意见,评论和建议。
Github仓库