给路由器写一个prometheus的exporter

简介

最近突然想给路由器做一个监控,最主要就是监控cpu,内存和进出流量什么的,得益于prometheus的灵活性,所以就想给路由器写一个prometheus的exporter来采集路由器上面的这些指标,然后放在grafana上展示。

代码地址

https://github.com/bboysoulcn/tp-link-exporter

路由器型号TL-ER5120G

欢迎star fork watch

思路

其实思路很简单,就是直接登录路由器抓取路由器上的这些接口来采集,所以第一个问题就是要登录路由器,而登录路由器最重要的是获取两个参数一个是获取登录之后的cookie还有就是链接上的stock参数,登录之后直接使用路由器的相关接口获取内存等值就可以了。

下面是路由器的登录接口

登录需要上传的参数

也就是上传账号和密码,密码是加密过的,看了网页的源代码,不知道是使用什么方式去加密的,所以我在代码中就直接传入这个加密之后的密码了,因为加密之后的值是固定的所以我就不理他了

登陆之后响应头会返回一个set-cookie的值,这个;path之前就是登陆之后的cookie

stok是登陆时候response回来的

之后就是获取路由器状态的接口

这个是获取cpu状态的,连接上带了登陆时候返回的stok这个参数

登陆获取数据代码

res = requests.post("http://"+ router_ip +"/cgi-bin/luci/;stok=/login?form=login",headers=header,data=data)

这个地方是登陆的操作

1
2
3
4
5
6
cpu_usage_res = requests.post("http://"+router_ip+"/cgi-bin/luci/;stok=" + stok + "/admin/sys_status?form=cpu_usage",
headers=header2, data=data2)
mem_usage_res = requests.post("http://"+router_ip+"/cgi-bin/luci/;stok=" + stok + "/admin/sys_status?form=mem_usage",
headers=header2, data=data2)
ifstat_res = requests.post("http://"+router_ip+"/cgi-bin/luci/;stok=" + stok + "/admin/ifstat?form=list",
headers=header2, data=data2)

这里是获取数据

写prometheus相关的接口

prometheus的exporter有四个基本数据类型分别是

  • Counter 计数器,只增不减,在prometheus重启时候归零
  • Gauge 计量器, 比如cpu内存网络流量这些值,可增可减的就是这种类型
  • Histogram 柱状图,用于统计一些数据分布的情况。比如100ms-200ms请求的个数,300ms-400ms请求的个数,这些用于统计一些数据分布的情况,用于计算在一定范围内的分布情况可以用到
  • Summary Summary摘要和Histogram柱状图比较类似,主要用于计算在一定时间窗口范围内度量指标对象的总数以及所有对量指标值的总和。

所以对于我们来说有用的就是Gauge这个数据类型,下面是初始化内存,cpu和网络的代码

1
2
3
cpu_usage_prom = Gauge("CPU", "TL-ER5120G cpu value", ["cpunum"])
mem_usage_prom = Gauge("MEM", "TL-ER5120G mem value", ["mem"])
speed_prom = Gauge("interface", "TL-ER5120G interface value", ["interface"])

对于不同cpu和网络的值的值我们可以为他们打上标签来区分,比如

cpu_usage_prom.labels("cpu1").set(cpu1_usage)

最后就是运行脚本,然后把数据加入prometheus,对接到grafana上

欢迎关注Bboysoul的博客www.bboy.app

Have Fun

欢迎关注我的其它发布渠道