深入探索Prometheus Exporter

前言

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

圖片.png

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ò)目前成熟度還不高郭计。

圖片.png

Prometheus

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

圖片.png

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ǔ)填渠。

圖片.png

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í)拉取蒿秦,如下示意:

圖片.png

對(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ù)史汗。

圖片.png

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ǔ)言需要加入支持遏片。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市撮竿,隨后出現(xiàn)的幾起案子吮便,更是在濱河造成了極大的恐慌,老刑警劉巖幢踏,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件髓需,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡房蝉,警方通過(guò)查閱死者的電腦和手機(jī)僚匆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)搭幻,“玉大人咧擂,你說(shuō)我怎么就攤上這事√刺#” “怎么了松申?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)俯逾。 經(jīng)常有香客問(wèn)我贸桶,道長(zhǎng),這世上最難降的妖魔是什么桌肴? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任皇筛,我火速辦了婚禮,結(jié)果婚禮上坠七,老公的妹妹穿的比我還像新娘水醋。我一直安慰自己旗笔,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布离例。 她就那樣靜靜地躺著换团,像睡著了一般。 火紅的嫁衣襯著肌膚如雪宫蛆。 梳的紋絲不亂的頭發(fā)上艘包,一...
    開(kāi)封第一講書(shū)人閱讀 49,749評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音耀盗,去河邊找鬼想虎。 笑死,一個(gè)胖子當(dāng)著我的面吹牛叛拷,可吹牛的內(nèi)容都是我干的舌厨。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼忿薇,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼裙椭!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起署浩,我...
    開(kāi)封第一講書(shū)人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤揉燃,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后筋栋,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體炊汤,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年弊攘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了抢腐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡襟交,死狀恐怖迈倍,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情捣域,我是刑警寧澤授瘦,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站竟宋,受9級(jí)特大地震影響提完,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜丘侠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一徒欣、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蜗字,春花似錦打肝、人聲如沸脂新。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)争便。三九已至,卻和暖如春断医,著一層夾襖步出監(jiān)牢的瞬間滞乙,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工鉴嗤, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留斩启,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓醉锅,卻偏偏與公主長(zhǎng)得像兔簇,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子硬耍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 近年來(lái)垄琐,以docker 為首的容器技術(shù)在IT領(lǐng)域尤其是在云計(jì)算和微服務(wù)應(yīng)用領(lǐng)域掀起了一股狂潮,成為當(dāng)下特別流行的一...
    Shaman閱讀 3,407評(píng)論 0 2
  • 監(jiān)控的目標(biāo) 在《SRE: Google運(yùn)維解密》一書(shū)中指出经柴,監(jiān)控系統(tǒng)需要能夠有效的支持白盒監(jiān)控和黑盒監(jiān)控狸窘。通過(guò)白盒...
    逗比的一生閱讀 543評(píng)論 0 1
  • 選型背景 這次采用開(kāi)源監(jiān)控系統(tǒng)主要是為了監(jiān)控一些自定義業(yè)務(wù)并進(jìn)行告警鹃操,所以重點(diǎn)關(guān)注了上傳自定義數(shù)據(jù)、監(jiān)控春哨、顯示荆隘、存...
    Sunrise95閱讀 12,367評(píng)論 0 16
  • 公司的監(jiān)控系統(tǒng)有Zabbix和Prometheus+Grafana,對(duì)于Prometheus這一塊本人不大熟悉赴背。掛...
    super_pcm閱讀 846評(píng)論 0 0
  • 一個(gè)服務(wù)搭建起來(lái)了椰拒,那總得要監(jiān)控其性能指標(biāo),有問(wèn)題的時(shí)候要及時(shí)告警通知凰荚。對(duì)于監(jiān)控類(lèi)似數(shù)據(jù)庫(kù)燃观、消息隊(duì)列、緩存或者系統(tǒng)...
    super_pcm閱讀 7,519評(píng)論 0 0