Prometheus監控指標的label注入方法


Prometheus采集監控指標的方式如下圖所示,Prometheus Server經過一定的配置可以從各種Exporter主動采集監控數據。廣義上的Exporter可以是任何以Prometheus標准暴露監控指標的進程。不過嚴格來說可以划分為以下兩類:

 
1. 對於Etcd這類應用程序,它們在代碼中利用Prometheus官方提供的SDK定義了一系列自定義指標供Prometheus Server采集,此類指標一般用於描述該程序自身的運行狀況。一般對於新開發或者改動難度較小的程序,可以用這種對代碼侵入性較大的方式暴露指標。
 
2. 標准意義上的Expoerter本質上就是指標的轉換層,例如Prometheus社區提供了一個名為Node Exporter的組件,該組件的作用為采集節點的CPU,內存等指標並轉換以符合Prometheus標准的格式暴露出去。一般對於代碼改動難度較大或已經有成熟的指標暴露機制的程序,這種方式是較為合適的。

 
Prometheus Server采集指標的方式,本質上是向Exporter發送一個HTTP請求並獲取該Exporter定義的所有指標內容,例如對於Node Expoerter的采集形式如下:
 
# curl http://192.168.0.6:9100/metrics
# HELP node_network_transmit_bytes_total Network device statistic transmit_bytes.
# TYPE node_network_transmit_bytes_total counter
node_network_transmit_bytes_total{device="eth0"} 2.74314960472e+11
node_network_transmit_bytes_total{device="lo"} 7.248889467e+09
# HELP node_boot_time_seconds Node boot time, in unixtime.
# TYPE node_boot_time_seconds gauge
node_boot_time_seconds 1.574417622e+09
...

  

從上述示例可以看到,一次抓取過程返回的內容本質上是純文本,我們截取了其中的兩個指標,`node_network_transmit_bytes_total`和`node_boot_time_seconds`分別表示節點上各個網卡發送的數據的字節數以及節點的啟動時間。對於`node_network_transmit_bytes_total`包含一個key為`device`的label用於區分各個網卡,而`node_boot_time_seconds`並不包含任何指標。
 
事實上,指標中包含的label能夠讓我們從更多維度更好地對指標進行操作。但是很多時候,Exporter指標中原生定義的label是不足以滿足我們的需求的。例如,對於Node Exporter暴露的指標中顯然沒有包含組織信息的label,但是如果有這么一個label存在,加上Prometheus強大的PromQL查詢語句,我們能夠很容易地從組織維度對指標進行划分。
 
那么如何在Exporter暴露的指標中添加額外的label呢?最直接的方式當然是侵入式地修改Exporter的源碼,從而在源頭加上這些“定制化”的labels。當然,這種方式對於一些簡單的自研組件是可行的。但是對於Node Exporter以及Nginx Exporter等較為復雜的Exporter直接修改源碼並不是那么地簡單,而且假如我要為所有指標加上一個公共的label,那么也就意味着要修改所有Exporter的源碼。
 
顯然,我們需要一種更為通用的方式,從上文的分析可知,標准意義的Exporter本質上是一個中間層,用於指標的轉換。那么我們是否可以再加一個中間層,用於自定義label的添加呢?架構如下:
 
 
在Prometheus Server和Exporter之間構建一個中間組件Adapter,此時Prometheus不再直接向Exporter發起HTTP請求抓取監控指標,而是向Adapter發起請求。一旦Adapter接收到請求之后會轉而向Exporter發起請求真正抓取到監控指標。已知指標內容其實就是一些文本,因此只要做一些簡單的插入操作就能將自定義的指標注入。最后,將處理后的內容再返回至Prometheus Server即可。若Adapter注入的指標為{org="dev"},那么經過Adapter處理之后,Prometheus Server真正抓取到的指標如下:
 
# curl http://192.168.0.6:9100/metrics
# HELP node_network_transmit_bytes_total Network device statistic transmit_bytes.
# TYPE node_network_transmit_bytes_total counter
node_network_transmit_bytes_total{device="eth0", org="dev"} 2.74314960472e+11
node_network_transmit_bytes_total{device="lo", org="dev"} 7.248889467e+09
# HELP node_boot_time_seconds Node boot time, in unixtime.
# TYPE node_boot_time_seconds gauge
node_boot_time_seconds{org="dev"} 1.574417622e+09
...

  

通常在Kubernetes環境下,我們會將Adapter以Sidecar的形式部署在Exporter所在的Pod中,如果能夠將Adapter需要注入的指標值從配置文件中讀取並支持動態加載機制,那么我們就能非常靈活地為任意Exporter的指標加入任意的定制化label。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM