給路由器寫一個prometheus的exporter

  • 2019 年 12 月 23 日
  • 筆記

簡介

最近突然想給路由器做一個監控,最主要就是監控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)

這個地方是登陸的操作

    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和網路的程式碼

    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上