前言
當(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ū)別:

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ù)庫,不過目前成熟度還不高。

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

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ù)的存儲。

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定時拉取,如下示意:

對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庫。非正式的也有一些其它語言的庫。

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,還有好多其它語言需要加入支持。