前言
當(dāng)下開(kāi)源發(fā)展超乎想象,連騰訊诈茧,阿里這種大廠都在不斷追趕各種開(kāi)源,享受開(kāi)源的紅利捂掰。 開(kāi)源時(shí)代的到來(lái)顛覆了傳統(tǒng)IT生命周期發(fā)展的步伐敢会,自研時(shí)代的“重開(kāi)發(fā)”,到開(kāi)源時(shí)代的“重集成”这嚣,這種“重集成”的就需要強(qiáng)有力的集成運(yùn)維支撐鸥昏。開(kāi)源軟件不像企業(yè)開(kāi)發(fā)的商業(yè)閉源軟件,商業(yè)軟件一般是自完備的姐帚,從功能到安全到性能到監(jiān)控都能自我掌控吏垮,開(kāi)源軟件往往在核心功能外的領(lǐng)域不夠完備,往往需要企業(yè)自己增強(qiáng)。尤其在監(jiān)控領(lǐng)域比較缺失膳汪,而Prometheus正好彌補(bǔ)這個(gè)空間唯蝶,提供一種靈活方便的監(jiān)控告警解決方案。
Prometheus vs Zabbix
說(shuō)到監(jiān)控遗嗽,幾乎沒(méi)人沒(méi)聽(tīng)過(guò)Zabbix粘我,Zabbix的成熟度自然非常高,而且配置UI相當(dāng)強(qiáng)大痹换, 但是Prometheus產(chǎn)生于容器時(shí)代征字,具有云原生和時(shí)序數(shù)據(jù)庫(kù)的特點(diǎn), 直接彎道超車(chē)娇豫,漸有取代Zabbix之勢(shì)匙姜。
看下面網(wǎng)上整理的兩者的區(qū)別:
Zabbix
Zabbix核心組件主要是Agent和Server,其中Agent主要負(fù)責(zé)采集數(shù)據(jù)并通過(guò)主動(dòng)或者被動(dòng)的方式采集數(shù)據(jù)發(fā)送到Server/Proxy冯痢,Zabbix由于使用了關(guān)系型數(shù)據(jù)存儲(chǔ)時(shí)序數(shù)據(jù)氮昧,所以在監(jiān)控大規(guī)模集群時(shí)常常在數(shù)據(jù)存儲(chǔ)方面捉襟見(jiàn)肘。所以從Zabbix 4.2版本后開(kāi)始支持TimescaleDB時(shí)序數(shù)據(jù)庫(kù)系羞,不過(guò)目前成熟度還不高郭计。
Prometheus
Prometheus的基本原理是通過(guò)HTTP周期性抓取被監(jiān)控組件的狀態(tài),任意組件只要提供對(duì)應(yīng)的HTTP接口并且符合Prometheus定義的數(shù)據(jù)格式椒振,就可以接入Prometheus監(jiān)控昭伸。
Prometheus Server負(fù)責(zé)定時(shí)在目標(biāo)上抓取metrics(指標(biāo))數(shù)據(jù)并保存到本地存儲(chǔ)里面。Prometheus采用了一種Pull(拉)的方式獲取數(shù)據(jù)澎迎,不僅降低客戶(hù)端的復(fù)雜度庐杨,客戶(hù)端只需要采集數(shù)據(jù),無(wú)需了解服務(wù)端情況夹供,而且服務(wù)端可以更加方便的水平擴(kuò)展灵份。Prometheus自研一套高性能的tsdb時(shí)序數(shù)據(jù)庫(kù),在V3版本可以達(dá)到每秒千萬(wàn)級(jí)別的數(shù)據(jù)存儲(chǔ)哮洽,通過(guò)對(duì)接第三方時(shí)序數(shù)據(jù)庫(kù)擴(kuò)展歷史數(shù)據(jù)的存儲(chǔ)填渠。
Prometheus的本地存儲(chǔ)為官方自研高性能時(shí)序數(shù)據(jù)庫(kù)。
Prometheus的遠(yuǎn)端存儲(chǔ)可以對(duì)接OpenTSDB鸟辅、InfluxDB氛什、Elasticsearch、M3db匪凉、Kafka等枪眉,其中M3db是目前非常受歡迎的后端存儲(chǔ),適用于大量歷史監(jiān)控?cái)?shù)據(jù)的存儲(chǔ)和查詢(xún)再层,贸铜。
Exporter接口
Prometheus通過(guò)exporter機(jī)制將監(jiān)控metric數(shù)據(jù)收集到服務(wù)端堡纬,exporter是一個(gè)http(不支持https)服務(wù)端口,由Prometheus server定時(shí)拉取蒿秦,如下示意:
對(duì)http返回格式的要求見(jiàn)官方文檔烤镐。
Exporter格式
metric_name ["{" label_name "=" `"` label_value `"` { "," label_name "=" `"` label_value `"` } [ "," ] "}"] value [ timestamp ]
metric_name:指標(biāo)的名稱(chēng)
label:指標(biāo)維度的標(biāo)簽,可以由多個(gè)
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就是一個(gè)計(jì)數(shù)器棍鳖,表示一種累積型指標(biāo)职车,該指標(biāo)只能單調(diào)遞增或在重新啟動(dòng)時(shí)重置為零,例如鹊杖,您可以使用計(jì)數(shù)器來(lái)表示所服務(wù)的請(qǐng)求數(shù),已完成的任務(wù)或錯(cuò)誤扛芽。
Gauge:可增可減的測(cè)量指標(biāo)
Gauge是最簡(jiǎn)單的度量類(lèi)型骂蓖,只有一個(gè)簡(jiǎn)單的返回值,可增可減川尖,也可以set為指定的值登下。所以Gauge通常用于反映當(dāng)前狀態(tài),比如當(dāng)前溫度或當(dāng)前內(nèi)存使用情況叮喳;當(dāng)然也可以用于“可增加可減少”的計(jì)數(shù)指標(biāo)被芳。
Histogram:自帶buckets區(qū)間用于統(tǒng)計(jì)分布的直方圖
Histogram主要用于在設(shè)定的分布范圍內(nèi)(Buckets)記錄大小或者次數(shù)。
例如http請(qǐng)求響應(yīng)時(shí)間:0-100ms馍悟、100-200ms畔濒、200-300ms、>300ms 的分布情況锣咒,Histogram會(huì)自動(dòng)創(chuàng)建3個(gè)指標(biāo)侵状,分別為:
事件發(fā)送的總次數(shù)<basename>_count:比如當(dāng)前一共發(fā)生了2次http請(qǐng)求
所有事件產(chǎn)生值的大小的總和<basename>_sum:比如發(fā)生的2次http請(qǐng)求總的響應(yīng)時(shí)間為150ms
事件產(chǎn)生的值分布在bucket中的次數(shù)<basename>_bucket{le="上限"}:比如響應(yīng)時(shí)間0-100ms的請(qǐng)求1次,100-200ms的請(qǐng)求1次毅整,其他的0次
Summary:數(shù)據(jù)分布統(tǒng)計(jì)圖
Summary和Histogram類(lèi)似趣兄,都可以統(tǒng)計(jì)事件發(fā)生的次數(shù)或者大小,以及其分布情況悼嫉。
Summary和Histogram都提供了對(duì)于事件的計(jì)數(shù)_count以及值的匯總_sum艇潭,因此使用_count,和_sum時(shí)間序列可以計(jì)算出相同的內(nèi)容。
同時(shí)Summary和Histogram都可以計(jì)算和統(tǒng)計(jì)樣本的分布情況戏蔑,比如中位數(shù)蹋凝,n分位數(shù)等等。不同在于Histogram可以通過(guò)histogram_quantile函數(shù)在服務(wù)器端計(jì)算分位數(shù)辛臊。 而Sumamry的分位數(shù)則是直接在客戶(hù)端進(jìn)行定義仙粱。因此對(duì)于分位數(shù)的計(jì)算。 Summary在通過(guò)PromQL進(jìn)行查詢(xún)時(shí)有更好的性能表現(xiàn)彻舰,而Histogram則會(huì)消耗更多的資源伐割。相對(duì)的對(duì)于客戶(hù)端而言Histogram消耗的資源更少候味。
Exporter選型
Prometheus官方本身提供了很多專(zhuān)業(yè)的Exporter,同時(shí)各個(gè)廠家為Prometheus開(kāi)發(fā)的Exporter也非常多隔心,選擇這些現(xiàn)成的Exporter自然是首選白群。可以打開(kāi)官方網(wǎng)站看大概由150多種Exporter硬霍,包含如下領(lǐng)域:
數(shù)據(jù)庫(kù)
操作系統(tǒng)
持續(xù)集成平臺(tái)
消息中間件
分布式存儲(chǔ)系統(tǒng)
Http服務(wù)器
日志系統(tǒng)
幾乎涵蓋了目前流行的大部分系統(tǒng)帜慢,足以見(jiàn)得Prometheus在監(jiān)控界的地位。每一個(gè)Exporter啟動(dòng)侯都是一個(gè)http服務(wù)唯卖,可以已進(jìn)程的形式啟動(dòng)粱玲,也可以以Docker容器的方式啟動(dòng)。
Exporter開(kāi)發(fā)
Exporter SDK
對(duì)于開(kāi)源的平臺(tái)拜轨,我們一般能從官方列表中找到對(duì)應(yīng)的Exporter抽减,繼續(xù)我們的拿來(lái)主義就行,稍加集成就可以順利接入橄碾。對(duì)于閉源或者自研的系統(tǒng)卵沉,提供一個(gè)Prometheus Exporter形式監(jiān)控接口則會(huì)提升軟件本身的監(jiān)控能力。官方提供了四種語(yǔ)言(Go/Java/Python/Rubby)的正式客戶(hù)端庫(kù)用來(lái)開(kāi)發(fā)一個(gè)集成http server的Exporter庫(kù)法牲。非正式的也有一些其它語(yǔ)言的庫(kù)史汗。
Exporter庫(kù)基本實(shí)現(xiàn)了上圖的功能,提供了一個(gè)HttpServer拒垃,實(shí)現(xiàn)GET /metrics接口停撞,這個(gè)接口關(guān)聯(lián)到一個(gè)Handle訪問(wèn)CollectorRegistry獲取所有的指標(biāo)信息,序列化為T(mén)ext文本格式返回悼瓮。其中ColloecorRetistry需要提前注冊(cè)需要獲取的各種指標(biāo)對(duì)象怜森。
由于Exporter本身提供了一個(gè)REST服務(wù)器,所以不會(huì)特別輕量谤牡,會(huì)帶來(lái)一些線(xiàn)程的消耗副硅,如果在一個(gè)機(jī)器上啟動(dòng)過(guò)多Exporter實(shí)例則需要注意,想辦法減少Exporter實(shí)例的數(shù)量翅萤。
自研的Exporter的優(yōu)勢(shì)是可以在代碼中埋點(diǎn)恐疲,精確代碼中的監(jiān)控業(yè)務(wù)數(shù)據(jù)。同時(shí)寫(xiě)好一個(gè)Exporter還有一些原則套么,可以參考網(wǎng)頁(yè)培己。比如要統(tǒng)計(jì)http請(qǐng)求的次數(shù),某一種錯(cuò)誤產(chǎn)生的次數(shù)胚泌,當(dāng)前active連接的個(gè)數(shù)等等省咨。
擴(kuò)展Node Exporter
Node Exporter是Prometheus官方發(fā)布的用來(lái)監(jiān)控主機(jī)資源信息的Exporter,這個(gè)Exporter本身提供了一個(gè)Textfile Collector對(duì)外接口玷室,可以用來(lái)把一些可以腳本化的監(jiān)控?cái)?shù)據(jù)帶上去零蓉,通過(guò)--collector.textfile.directory 參數(shù)指定本地文本收集路徑:
/opt/exporter/node_exporter/node_exporter --collector.textfile.directory=/opt/exporter/node_exporter/key
自研Exporter
除了以上2種方式笤受,也可以按照規(guī)范自己開(kāi)發(fā)Exporter服務(wù),實(shí)現(xiàn)一個(gè)返回文本指標(biāo)格式的HTTP Server敌蜂,
比如一個(gè)用Python Flask寫(xiě)的Exporter箩兽。
Prometheus Roadmap
l 服務(wù)器端支持指標(biāo)元數(shù)據(jù) 目前指標(biāo)的數(shù)據(jù)類(lèi)型和其它元數(shù)據(jù)只在客戶(hù)端使用,沒(méi)有在服務(wù)器端持久化和使用章喉。后續(xù)計(jì)劃在服務(wù)器端使用這些元數(shù)據(jù)汗贫,第一步是在內(nèi)存中聚合這些數(shù)據(jù)并且通過(guò)API對(duì)外提供。
l 適配OpenMetrics****格式指標(biāo)
l 回填時(shí)間序列 回填需要加載大批量的過(guò)期數(shù)據(jù)秸脱,并且從其它監(jiān)控系統(tǒng)傳輸舊數(shù)據(jù)
l 服務(wù)端支持SSL****和認(rèn)證 目前Prometheus服務(wù)端落包,AlertManager和官方Exporter都沒(méi)有使用SSL加密,并且沒(méi)有認(rèn)證機(jī)制摊唇,需要加入SSL和認(rèn)證來(lái)保證傳輸安全妥色。
l 支持生態(tài)系統(tǒng) 目前Prometheus支持了一些客戶(hù)端庫(kù)和exporter,還有好多其它語(yǔ)言需要加入支持遏片。