深入探索Prometheus Exporter

前言

當(dāng)下開源發(fā)展超乎想象,連騰訊,阿里這種大廠都在不斷追趕各種開源,享受開源的紅利。 開源時代的到來顛覆了傳統(tǒng)IT生命周期發(fā)展的步伐,自研時代的“重開發(fā)”,到開源時代的“重集成”,這種“重集成”的就需要強(qiáng)有力的集成運(yùn)維支撐。開源軟件不像企業(yè)開發(fā)的商業(yè)閉源軟件,商業(yè)軟件一般是自完備的,從功能到安全到性能到監(jiān)控都能自我掌控,開源軟件往往在核心功能外的領(lǐng)域不夠完備,往往需要企業(yè)自己增強(qiáng)。尤其在監(jiān)控領(lǐng)域比較缺失,而Prometheus正好彌補(bǔ)這個空間,提供一種靈活方便的監(jiān)控告警解決方案。

Prometheus vs Zabbix

說到監(jiān)控,幾乎沒人沒聽過Zabbix,Zabbix的成熟度自然非常高,而且配置UI相當(dāng)強(qiáng)大, 但是Prometheus產(chǎn)生于容器時代,具有云原生和時序數(shù)據(jù)庫的特點, 直接彎道超車,漸有取代Zabbix之勢。

看下面網(wǎng)上整理的兩者的區(qū)別:

圖片.png

Zabbix

Zabbix核心組件主要是Agent和Server,其中Agent主要負(fù)責(zé)采集數(shù)據(jù)并通過主動或者被動的方式采集數(shù)據(jù)發(fā)送到Server/Proxy,Zabbix由于使用了關(guān)系型數(shù)據(jù)存儲時序數(shù)據(jù),所以在監(jiān)控大規(guī)模集群時常常在數(shù)據(jù)存儲方面捉襟見肘。所以從Zabbix 4.2版本后開始支持TimescaleDB時序數(shù)據(jù)庫,不過目前成熟度還不高。

圖片.png

Prometheus

Prometheus的基本原理是通過HTTP周期性抓取被監(jiān)控組件的狀態(tài),任意組件只要提供對應(yīng)的HTTP接口并且符合Prometheus定義的數(shù)據(jù)格式,就可以接入Prometheus監(jiān)控。

圖片.png

Prometheus Server負(fù)責(zé)定時在目標(biāo)上抓取metrics(指標(biāo))數(shù)據(jù)并保存到本地存儲里面。Prometheus采用了一種Pull(拉)的方式獲取數(shù)據(jù),不僅降低客戶端的復(fù)雜度,客戶端只需要采集數(shù)據(jù),無需了解服務(wù)端情況,而且服務(wù)端可以更加方便的水平擴(kuò)展。Prometheus自研一套高性能的tsdb時序數(shù)據(jù)庫,在V3版本可以達(dá)到每秒千萬級別的數(shù)據(jù)存儲,通過對接第三方時序數(shù)據(jù)庫擴(kuò)展歷史數(shù)據(jù)的存儲。

圖片.png

Prometheus的本地存儲為官方自研高性能時序數(shù)據(jù)庫。

Prometheus的遠(yuǎn)端存儲可以對接OpenTSDB、InfluxDB、Elasticsearch、M3db、Kafka等,其中M3db是目前非常受歡迎的后端存儲,適用于大量歷史監(jiān)控數(shù)據(jù)的存儲和查詢,。

Exporter接口

Prometheus通過exporter機(jī)制將監(jiān)控metric數(shù)據(jù)收集到服務(wù)端,exporter是一個http(不支持https)服務(wù)端口,由Prometheus server定時拉取,如下示意:

圖片.png

對http返回格式的要求見官方文檔。

Exporter格式

metric_name ["{" label_name "=" `"` label_value `"` { "," label_name "=" `"` label_value `"` } [ "," ] "}"] value [ timestamp ]

metric_name:指標(biāo)的名稱

label:指標(biāo)維度的標(biāo)簽,可以由多個

value:指標(biāo)具體的值

Exporter示例

# HELP http_requests_total The total number of HTTP requests.

# TYPE http_requests_total counter

http_requests_total{method="post",code="200"} 1027 1395066363000

http_requests_total{method="post",code="400"} 3 1395066363000

# Escaping in label values:

msdos_file_access_time_seconds{path="C:\\DIR\\FILE.TXT",error="Cannot find file:\n\"FILE.TXT\""} 1.458255915e9

# Minimalistic line:

metric_without_timestamp_and_labels 12.47

# A weird metric from before the epoch:

something_weird{problem="division by zero"} +Inf -3982045

# A histogram, which has a pretty complex representation in the text format:

# HELP http_request_duration_seconds A histogram of the request duration.

# TYPE http_request_duration_seconds histogram

http_request_duration_seconds_bucket{le="0.05"} 24054

http_request_duration_seconds_bucket{le="0.1"} 33444

http_request_duration_seconds_bucket{le="0.2"} 100392

http_request_duration_seconds_bucket{le="0.5"} 129389

http_request_duration_seconds_bucket{le="1"} 133988

http_request_duration_seconds_bucket{le="+Inf"} 144320

http_request_duration_seconds_sum 53423

http_request_duration_seconds_count 144320

# Finally a summary, which has a complex representation, too:

# HELP rpc_duration_seconds A summary of the RPC duration in seconds.

# TYPE rpc_duration_seconds summary

rpc_duration_seconds{quantile="0.01"} 3102

rpc_duration_seconds{quantile="0.05"} 3272

rpc_duration_seconds{quantile="0.5"} 4773

rpc_duration_seconds{quantile="0.9"} 9001

rpc_duration_seconds{quantile="0.99"} 76656

rpc_duration_seconds_sum 1.7560473e+07

rpc_duration_seconds_count 2693

value:指標(biāo)具體的值

四種指標(biāo)

Counter:只增不減的累加指標(biāo)

Counter就是一個計數(shù)器,表示一種累積型指標(biāo),該指標(biāo)只能單調(diào)遞增或在重新啟動時重置為零,例如,您可以使用計數(shù)器來表示所服務(wù)的請求數(shù),已完成的任務(wù)或錯誤。

Gauge:可增可減的測量指標(biāo)

Gauge是最簡單的度量類型,只有一個簡單的返回值,可增可減,也可以set為指定的值。所以Gauge通常用于反映當(dāng)前狀態(tài),比如當(dāng)前溫度或當(dāng)前內(nèi)存使用情況;當(dāng)然也可以用于“可增加可減少”的計數(shù)指標(biāo)。

Histogram:自帶buckets區(qū)間用于統(tǒng)計分布的直方圖

Histogram主要用于在設(shè)定的分布范圍內(nèi)(Buckets)記錄大小或者次數(shù)。

例如http請求響應(yīng)時間:0-100ms、100-200ms、200-300ms、>300ms 的分布情況,Histogram會自動創(chuàng)建3個指標(biāo),分別為:

事件發(fā)送的總次數(shù)<basename>_count:比如當(dāng)前一共發(fā)生了2次http請求

所有事件產(chǎn)生值的大小的總和<basename>_sum:比如發(fā)生的2次http請求總的響應(yīng)時間為150ms

事件產(chǎn)生的值分布在bucket中的次數(shù)<basename>_bucket{le="上限"}:比如響應(yīng)時間0-100ms的請求1次,100-200ms的請求1次,其他的0次

Summary:數(shù)據(jù)分布統(tǒng)計圖

Summary和Histogram類似,都可以統(tǒng)計事件發(fā)生的次數(shù)或者大小,以及其分布情況。

Summary和Histogram都提供了對于事件的計數(shù)_count以及值的匯總_sum,因此使用_count,和_sum時間序列可以計算出相同的內(nèi)容。

同時Summary和Histogram都可以計算和統(tǒng)計樣本的分布情況,比如中位數(shù),n分位數(shù)等等。不同在于Histogram可以通過histogram_quantile函數(shù)在服務(wù)器端計算分位數(shù)。 而Sumamry的分位數(shù)則是直接在客戶端進(jìn)行定義。因此對于分位數(shù)的計算。 Summary在通過PromQL進(jìn)行查詢時有更好的性能表現(xiàn),而Histogram則會消耗更多的資源。相對的對于客戶端而言Histogram消耗的資源更少。

Exporter選型

Prometheus官方本身提供了很多專業(yè)的Exporter,同時各個廠家為Prometheus開發(fā)的Exporter也非常多,選擇這些現(xiàn)成的Exporter自然是首選??梢源蜷_官方網(wǎng)站看大概由150多種Exporter,包含如下領(lǐng)域:

數(shù)據(jù)庫

操作系統(tǒng)

持續(xù)集成平臺

消息中間件

分布式存儲系統(tǒng)

Http服務(wù)器

日志系統(tǒng)

幾乎涵蓋了目前流行的大部分系統(tǒng),足以見得Prometheus在監(jiān)控界的地位。每一個Exporter啟動侯都是一個http服務(wù),可以已進(jìn)程的形式啟動,也可以以Docker容器的方式啟動。

Exporter開發(fā)

Exporter SDK

對于開源的平臺,我們一般能從官方列表中找到對應(yīng)的Exporter,繼續(xù)我們的拿來主義就行,稍加集成就可以順利接入。對于閉源或者自研的系統(tǒng),提供一個Prometheus Exporter形式監(jiān)控接口則會提升軟件本身的監(jiān)控能力。官方提供了四種語言(Go/Java/Python/Rubby)的正式客戶端庫用來開發(fā)一個集成http server的Exporter庫。非正式的也有一些其它語言的庫。

圖片.png

Exporter庫基本實現(xiàn)了上圖的功能,提供了一個HttpServer,實現(xiàn)GET /metrics接口,這個接口關(guān)聯(lián)到一個Handle訪問CollectorRegistry獲取所有的指標(biāo)信息,序列化為Text文本格式返回。其中ColloecorRetistry需要提前注冊需要獲取的各種指標(biāo)對象。

由于Exporter本身提供了一個REST服務(wù)器,所以不會特別輕量,會帶來一些線程的消耗,如果在一個機(jī)器上啟動過多Exporter實例則需要注意,想辦法減少Exporter實例的數(shù)量。

自研的Exporter的優(yōu)勢是可以在代碼中埋點,精確代碼中的監(jiān)控業(yè)務(wù)數(shù)據(jù)。同時寫好一個Exporter還有一些原則,可以參考網(wǎng)頁。比如要統(tǒng)計http請求的次數(shù),某一種錯誤產(chǎn)生的次數(shù),當(dāng)前active連接的個數(shù)等等。

擴(kuò)展Node Exporter

Node Exporter是Prometheus官方發(fā)布的用來監(jiān)控主機(jī)資源信息的Exporter,這個Exporter本身提供了一個Textfile Collector對外接口,可以用來把一些可以腳本化的監(jiān)控數(shù)據(jù)帶上去,通過--collector.textfile.directory 參數(shù)指定本地文本收集路徑:

/opt/exporter/node_exporter/node_exporter --collector.textfile.directory=/opt/exporter/node_exporter/key

自研Exporter

除了以上2種方式,也可以按照規(guī)范自己開發(fā)Exporter服務(wù),實現(xiàn)一個返回文本指標(biāo)格式的HTTP Server,

比如一個用Python Flask寫的Exporter

Prometheus Roadmap

l 服務(wù)器端支持指標(biāo)元數(shù)據(jù) 目前指標(biāo)的數(shù)據(jù)類型和其它元數(shù)據(jù)只在客戶端使用,沒有在服務(wù)器端持久化和使用。后續(xù)計劃在服務(wù)器端使用這些元數(shù)據(jù),第一步是在內(nèi)存中聚合這些數(shù)據(jù)并且通過API對外提供。

l 適配OpenMetrics****格式指標(biāo)

l 回填時間序列 回填需要加載大批量的過期數(shù)據(jù),并且從其它監(jiān)控系統(tǒng)傳輸舊數(shù)據(jù)

l 服務(wù)端支持SSL****和認(rèn)證 目前Prometheus服務(wù)端,AlertManager和官方Exporter都沒有使用SSL加密,并且沒有認(rèn)證機(jī)制,需要加入SSL和認(rèn)證來保證傳輸安全。

l 支持生態(tài)系統(tǒng) 目前Prometheus支持了一些客戶端庫和exporter,還有好多其它語言需要加入支持。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容