一庆锦、概述
Prometheus 優(yōu)勢(shì)
- 由指標(biāo)名稱和鍵/值對(duì)標(biāo)簽標(biāo)識(shí)的時(shí)間序列數(shù)據(jù)組成的多維數(shù)據(jù)模型。
- 強(qiáng)大的查詢語(yǔ)言 PromQL。
- 不依賴分布式存儲(chǔ)携御;單個(gè)服務(wù)節(jié)點(diǎn)具有自治能力。
- 時(shí)間序列數(shù)據(jù)是服務(wù)端通過(guò) HTTP 協(xié)議主動(dòng)拉取獲得的既绕,也可以通過(guò)中間網(wǎng)關(guān)來(lái)推送時(shí)間序列數(shù)據(jù)啄刹。
- 可以通過(guò)靜態(tài)配置文件或服務(wù)發(fā)現(xiàn)來(lái)獲取監(jiān)控目標(biāo)。
- 支持多種類型的圖表和儀表盤凄贩。
Prometheus 組件
- Prometheus Server:作為服務(wù)端誓军,用來(lái)存儲(chǔ)時(shí)間序列數(shù)據(jù)。
- 客戶端庫(kù)用來(lái)檢測(cè)應(yīng)用程序代碼疲扎。
- 用于支持臨時(shí)任務(wù)的推送網(wǎng)關(guān)昵时。
- Exporter:用來(lái)監(jiān)控 HAProxy,StatsD评肆,Graphite 等特殊的監(jiān)控目標(biāo)债查,并向 Prometheus 提供標(biāo)準(zhǔn)格式的監(jiān)控樣本數(shù)據(jù)。
- alartmanager 用來(lái)處理告警瓜挽。
- 其他各種周邊工具盹廷。
Prometheus 適用于什么場(chǎng)景
Prometheus 適用于記錄文本格式的時(shí)間序列,它既適用于以機(jī)器為中心的監(jiān)控久橙,也適用于高度動(dòng)態(tài)的面向服務(wù)架構(gòu)的監(jiān)控俄占。在微服務(wù)的世界中,它對(duì)多維數(shù)據(jù)收集和查詢的支持有特殊優(yōu)勢(shì)淆衷。Prometheus 是專為提高系統(tǒng)可靠性而設(shè)計(jì)的缸榄,它可以在斷電期間快速診斷問(wèn)題,每個(gè) Prometheus Server 都是相互獨(dú)立的祝拯,不依賴于網(wǎng)絡(luò)存儲(chǔ)或其他遠(yuǎn)程服務(wù)甚带。當(dāng)基礎(chǔ)架構(gòu)出現(xiàn)故障時(shí),你可以通過(guò) Prometheus 快速定位故障點(diǎn)佳头,而且不會(huì)消耗大量的基礎(chǔ)架構(gòu)資源鹰贵。
Prometheus 不適合什么場(chǎng)景
Prometheus 非常重視可靠性,即使在出現(xiàn)故障的情況下康嘉,你也可以隨時(shí)查看有關(guān)系統(tǒng)的可用統(tǒng)計(jì)信息碉输。如果你需要百分之百的準(zhǔn)確度,例如按請(qǐng)求數(shù)量計(jì)費(fèi)亭珍,那么 Prometheus 不太適合你敷钾,因?yàn)樗占臄?shù)據(jù)可能不夠詳細(xì)完整枝哄。這種情況下,你最好使用其他系統(tǒng)來(lái)收集和分析數(shù)據(jù)以進(jìn)行計(jì)費(fèi)阻荒,并使用 Prometheus 來(lái)監(jiān)控系統(tǒng)的其余部分挠锥。
二、數(shù)據(jù)模型
Prometheus 所有采集的監(jiān)控?cái)?shù)據(jù)均以指標(biāo)(metric)的形式保存在內(nèi)置的時(shí)間序列數(shù)據(jù)庫(kù)當(dāng)中(TSDB):屬于同一指標(biāo)名稱侨赡,同一標(biāo)簽集合的瘪贱、有時(shí)間戳標(biāo)記的數(shù)據(jù)流。除了存儲(chǔ)的時(shí)間序列辆毡,Prometheus 還可以根據(jù)查詢請(qǐng)求產(chǎn)生臨時(shí)的、衍生的時(shí)間序列作為返回結(jié)果甜害。
指標(biāo)名稱和標(biāo)簽
每一條時(shí)間序列由指標(biāo)名稱(Metrics Name)以及一組標(biāo)簽(鍵值對(duì))唯一標(biāo)識(shí)舶掖。
指標(biāo)名稱
指標(biāo)(metric name):可以反映被監(jiān)控樣本的含義(例如,http_requests_total — 表示當(dāng)前系統(tǒng)接收到的 HTTP 請(qǐng)求總量)尔店,指標(biāo)名稱只能由 ASCII 字符眨攘、數(shù)字、下劃線以及冒號(hào)組成嚣州,同時(shí)必須匹配正則表達(dá)式 [a-zA-Z_:][a-zA-Z0-9_:]鲫售。
注意:冒號(hào)用來(lái)表示用戶自定義的記錄規(guī)則,不能在 exporter 中或監(jiān)控對(duì)象直接暴露的指標(biāo)中使用冒號(hào)來(lái)定義指標(biāo)名稱该肴。
標(biāo)簽
標(biāo)簽:通過(guò)標(biāo)簽Prometheus 開(kāi)啟了強(qiáng)大的多維數(shù)據(jù)模型情竹。
對(duì)于相同的指標(biāo)名稱,通過(guò)不同標(biāo)簽列表的集合匀哄,會(huì)形成特定的度量維度實(shí)例(例如:所有包含度量名稱為 /api/tracks 的 http 請(qǐng)求秦效,打上 method=POST 的標(biāo)簽,就會(huì)形成具體的 http 請(qǐng)求)涎嚼。該查詢語(yǔ)言在這些指標(biāo)和標(biāo)簽列表的基礎(chǔ)上進(jìn)行過(guò)濾和聚合阱州。改變?nèi)魏味攘恐笜?biāo)上的任何標(biāo)簽值(包括添加或刪除指標(biāo)),都會(huì)創(chuàng)建新的時(shí)間序列法梯。
標(biāo)簽的名稱只能由 ASCII 字符苔货、數(shù)字以及下劃線組成并滿足正則表達(dá)式 [a-zA-Z_][a-zA-Z0-9_]。
其中以 __ 作為前綴的標(biāo)簽立哑,是系統(tǒng)保留的關(guān)鍵字夜惭,只能在系統(tǒng)內(nèi)部使用。標(biāo)簽的值則可以包含任何 Unicode 編碼的字符刁憋。
樣本
在時(shí)間序列中的每一個(gè)點(diǎn)稱為一個(gè)樣本(sample)滥嘴,樣本由以下三部分組成:
- 指標(biāo)(metric):指標(biāo)名稱和描述當(dāng)前樣本特征的 labelsets;
- 時(shí)間戳(timestamp):一個(gè)精確到毫秒的時(shí)間戳至耻;
- 樣本值(value): 一個(gè) folat64 的浮點(diǎn)型數(shù)據(jù)表示當(dāng)前樣本的值若皱。
三镊叁、指標(biāo)類型
Prometheus 的客戶端庫(kù)中提供了四種核心的指標(biāo)類型。但這些類型只是在客戶端庫(kù)(客戶端可以根據(jù)不同的數(shù)據(jù)類型調(diào)用不同的 API 接口)和在線協(xié)議中走触,實(shí)際在 Prometheus server 中并不對(duì)指標(biāo)類型進(jìn)行區(qū)分晦譬,而是簡(jiǎn)單地把這些指標(biāo)統(tǒng)一視為無(wú)類型的時(shí)間序列。
Counter(計(jì)數(shù)器)
Counter 類型代表一種樣本數(shù)據(jù)單調(diào)遞增的指標(biāo)互广,即只增不減敛腌,除非監(jiān)控系統(tǒng)發(fā)生了重置。
Guage(儀表盤)
Guage 類型代表一種樣本數(shù)據(jù)可以任意變化的指標(biāo)惫皱,即可增可減像樊。guage 通常用于像溫度或者內(nèi)存使用率這種指標(biāo)數(shù)據(jù),也可以表示能隨時(shí)增加或減少的“總數(shù)”旅敷,例如:當(dāng)前并發(fā)請(qǐng)求的數(shù)量生棍。
Histogram(直方圖)
Histogram 在一段時(shí)間范圍內(nèi)對(duì)數(shù)據(jù)進(jìn)行采樣(通常是請(qǐng)求持續(xù)時(shí)間或響應(yīng)大小等),并將其計(jì)入可配置的存儲(chǔ)桶(bucket)中媳谁,后續(xù)可通過(guò)指定區(qū)間篩選樣本涂滴,也可以統(tǒng)計(jì)樣本總數(shù),最后一般將數(shù)據(jù)展示為直方圖晴音。
Histogram 類型的樣本會(huì)提供三種指標(biāo)(假設(shè)指標(biāo)名稱為 <basename>):
- 樣本的值分布在 bucket 中的數(shù)量柔纵,命名為 <basename>_bucket{le="<上邊界>"}。解釋的更通俗易懂一點(diǎn)锤躁,這個(gè)值表示指標(biāo)值小于等于上邊界的所有樣本數(shù)量搁料。
// 在總共2次請(qǐng)求當(dāng)中。http 請(qǐng)求響應(yīng)時(shí)間 <=0.005 秒 的請(qǐng)求次數(shù)為0
io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="0.005",} 0.0
// 在總共2次請(qǐng)求當(dāng)中系羞。http 請(qǐng)求響應(yīng)時(shí)間 <=0.01 秒 的請(qǐng)求次數(shù)為0
io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="0.01",} 0.0
// 在總共2次請(qǐng)求當(dāng)中加缘。http 請(qǐng)求響應(yīng)時(shí)間 <=0.025 秒 的請(qǐng)求次數(shù)為0
io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="0.025",} 0.0
io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="0.05",} 0.0
io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="0.075",} 0.0
io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="0.1",} 0.0
io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="0.25",} 0.0
io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="0.5",} 0.0
io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="0.75",} 0.0
io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="1.0",} 0.0
io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="2.5",} 0.0
io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="5.0",} 0.0
io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="7.5",} 2.0
// 在總共2次請(qǐng)求當(dāng)中。http 請(qǐng)求響應(yīng)時(shí)間 <=10 秒 的請(qǐng)求次數(shù)為 2
io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="10.0",} 2.0
io_namespace_http_requests_latency_seconds_histogram_bucket{path="/",method="GET",code="200",le="+Inf",} 2.0
- 所有樣本值的大小總和觉啊,命名為 <basename>_sum
// 實(shí)際含義: 發(fā)生的2次 http 請(qǐng)求總的響應(yīng)時(shí)間為 13.107670803000001 秒
io_namespace_http_requests_latency_seconds_histogram_sum{path="/",method="GET",code="200",} 13.107670803000001
- 樣本總數(shù)拣宏,命名為 <basename>_count。值和 <basename>_bucket{le="+Inf"} 相同杠人。
// 實(shí)際含義: 當(dāng)前一共發(fā)生了 2 次 http 請(qǐng)求
io_namespace_http_requests_latency_seconds_histogram_count{path="/",method="GET",code="200",} 2.0
注意:bucket 可以理解為是對(duì)數(shù)據(jù)指標(biāo)值域的一個(gè)劃分勋乾,劃分的依據(jù)應(yīng)該基于數(shù)據(jù)值的分布。注意后面的采樣點(diǎn)是包含前面的采樣點(diǎn)的嗡善,假設(shè) xxx_bucket{...,le="0.01"} 的值為 10辑莫,而 xxx_bucket{...,le="0.05"} 的值為 30,那么意味著這 30 個(gè)采樣點(diǎn)中罩引,有 10 個(gè)是小于 10 ms 的各吨,其余 20 個(gè)采樣點(diǎn)的響應(yīng)時(shí)間是介于 10 ms 和 50 ms 之間的.
Summary(摘要)
與 Histogram 類型類似,用于表示一段時(shí)間內(nèi)的數(shù)據(jù)采樣結(jié)果(通常是請(qǐng)求持續(xù)時(shí)間或響應(yīng)大小等)袁铐,但它直接存儲(chǔ)了分位數(shù)(通過(guò)客戶端計(jì)算揭蜒,然后展示出來(lái))横浑,而不是通過(guò)區(qū)間來(lái)計(jì)算。
Summary 類型的樣本也會(huì)提供三種指標(biāo)(假設(shè)指標(biāo)名稱為 ):
- 樣本值的分位數(shù)分布情況屉更,命名為 <basename>{quantile="<φ>"}徙融。
// 含義:這 12 次 http 請(qǐng)求中有 50% 的請(qǐng)求響應(yīng)時(shí)間是 3.052404983s
io_namespace_http_requests_latency_seconds_summary{path="/",method="GET",code="200",quantile="0.5",} 3.052404983
// 含義:這 12 次 http 請(qǐng)求中有 90% 的請(qǐng)求響應(yīng)時(shí)間是 8.003261666s
io_namespace_http_requests_latency_seconds_summary{path="/",method="GET",code="200",quantile="0.9",} 8.003261666
- 所有樣本值的大小總和,命名為 <basename>_sum瑰谜。
// 含義:這12次 http 請(qǐng)求的總響應(yīng)時(shí)間為 51.029495508s
io_namespace_http_requests_latency_seconds_summary_sum{path="/",method="GET",code="200",} 51.029495508
- 樣本總數(shù)欺冀,命名為 <basename>_count。
// 含義:當(dāng)前一共發(fā)生了 12 次 http 請(qǐng)求
io_namespace_http_requests_latency_seconds_summary_count{path="/",method="GET",code="200",} 12.0
Histogram 與 Summary 的異同
- 它們都包含了 <basename>_sum 和 <basename>_count 指標(biāo)
- Histogram 需要通過(guò) <basename>_bucket 來(lái)計(jì)算分位數(shù)萨脑,而 Summary 則直接存儲(chǔ)了分位數(shù)的值隐轩。