深入淺出 Prometheus
背景
對很多人來說,未知、不確定、不在掌控的東西,會有潛意識的逃避。當(dāng)我第一次接觸 Prometheus 的時候也有類似的感覺。對初學(xué)者來說, Prometheus 包含的概念太多了,門檻也太高了。
概念:Instance、Job、Metric、Metric Name、Metric Label、Metric Value、Metric Type(Counter、Gauge、Histogram、Summary)、DataType(Instant Vector、Range Vector、Scalar、String)、Operator、Function
馬云說:“雖然阿里巴巴是全球最大的零售平臺,但阿里不是零售公司,是一家數(shù)據(jù)公司”。Prometheus 也是一樣,本質(zhì)來說是一個基于數(shù)據(jù)的監(jiān)控系統(tǒng)。
日常監(jiān)控
假設(shè)需要監(jiān)控 WebServerA 每個API的請求量為例,需要監(jiān)控的維度包括:服務(wù)名(job)、實例IP(instance)、API名(handler)、方法(method)、返回碼(code)、請求量(value)。

如果以SQL為例,演示常見的查詢操作:
查詢 method=put 且 code=200 的請求量
SELECT?*?from?http_requests_total?WHERE?code=”200”?AND?method=”put”?AND?created_at?BETWEEN?1495435700?AND?1495435710;
查詢 handler=prometheus 且 method=post 的請求量
SELECT?*?from?http_requests_total?WHERE?handler=”prometheus”?AND?method=”post”?AND?created_at?BETWEEN?1495435700?AND?1495435710;
查詢 instance=10.59.8.110 且 handler 以 query 開頭 的請求量
SELECT?*?from?http_requests_total?WHERE?handler=”query”?AND?instance=”10.59.8.110”?AND?created_at?BETWEEN?1495435700?AND?1495435710;
通過以上示例可以看出,在常用查詢和統(tǒng)計方面,日常監(jiān)控多用于根據(jù)監(jiān)控的維度進行查詢與時間進行組合查詢。如果監(jiān)控100個服務(wù),平均每個服務(wù)部署10個實例,每個服務(wù)有20個API,4個方法,30秒收集一次數(shù)據(jù),保留60天。那么總數(shù)據(jù)條數(shù)為:100(服務(wù))* 10(實例)* 20(API)* 4(方法)* 86400(1天秒數(shù))* 60(天) / 30(秒)= 138.24 億條數(shù)據(jù),寫入、存儲、查詢?nèi)绱肆考壍臄?shù)據(jù)是不可能在Mysql類的關(guān)系數(shù)據(jù)庫上完成的。因此 Prometheus 使用 TSDB 作為 存儲引擎。
存儲引擎
TSDB 作為 Prometheus 的存儲引擎完美契合了監(jiān)控數(shù)據(jù)的應(yīng)用場景
存儲的數(shù)據(jù)量級十分龐大
大部分時間都是寫入操作
寫入操作幾乎是順序添加,大多數(shù)時候數(shù)據(jù)到達后都以時間排序
寫操作很少寫入很久之前的數(shù)據(jù),也很少更新數(shù)據(jù)。大多數(shù)情況在數(shù)據(jù)被采集到數(shù)秒或者數(shù)分鐘后就會被寫入數(shù)據(jù)庫
刪除操作一般為區(qū)塊刪除,選定開始的歷史時間并指定后續(xù)的區(qū)塊。很少單獨刪除某個時間或者分開的隨機時間的數(shù)據(jù)
基本數(shù)據(jù)大,一般超過內(nèi)存大小。一般選取的只是其一小部分且沒有規(guī)律,緩存幾乎不起任何作用
讀操作是十分典型的升序或者降序的順序讀
高并發(fā)的讀操作十分常見
那么 TSDB 是怎么實現(xiàn)以上功能的呢?
"labels":?[{
????"latency":????????"500"
}]
"samples":[{
????"timestamp":?1473305798,
????"value":?0.9
}]
原始數(shù)據(jù)分為兩部分 label, samples。前者記錄監(jiān)控的維度(標(biāo)簽:標(biāo)簽值),指標(biāo)名稱和標(biāo)簽的可選鍵值對唯一確定一條時間序列(使用 series_id 代表);后者包含包含了時間戳(timestamp)和指標(biāo)值(value)。
series
^
│.?.?.?.?.?.?.?.?.?.?.?.???server{latency="500"}
│.?.?.?.?.?.?.?.?.?.?.?.???server{latency="300"}
│.?.?.?.?.?.?.?.?.?.???.???server{}
│.?.?.?.?.?.?.?.?.?.?.?.?
v
<--------?time?---------->
TSDB 使用 timeseries:doc:: 為 key 存儲 value。為了加速常見查詢查詢操作:label 和 時間范圍結(jié)合。TSDB 額外構(gòu)建了三種索引:Series, Label Index 和 Time Index。
以標(biāo)簽 latency 為例:
Series
存儲兩部分數(shù)據(jù)。一部分是按照字典序的排列的所有標(biāo)簽鍵值對序列(series);另外一部分是時間線到數(shù)據(jù)文件的索引,按照時間窗口切割存儲數(shù)據(jù)塊記錄的具體位置信息,因此在查詢時可以快速跳過大量非查詢窗口的記錄數(shù)據(jù)
Label Index
每對 label 為會以 index:label: 為 key,存儲該標(biāo)簽所有值的列表,并通過引用指向 Series 該值的起始位置。
Time Index
數(shù)據(jù)會以 index:timeseries:: 為 key,指向?qū)?yīng)時間段的數(shù)據(jù)文件
數(shù)據(jù)計算
強大的存儲引擎為數(shù)據(jù)計算提供了完美的助力,使得 Prometheus 與其他監(jiān)控服務(wù)完全不同。Prometheus 可以查詢出不同的數(shù)據(jù)序列,然后再加上基礎(chǔ)的運算符,以及強大的函數(shù),就可以執(zhí)行 metric series 的矩陣運算。
查詢出不同的數(shù)據(jù)序列:
https://prometheus.io/docs/prometheus/latest/querying/basics/#time-series-selectors
基礎(chǔ)的運算符:
https://prometheus.io/docs/prometheus/latest/querying/operators/
強大的函數(shù):
https://prometheus.io/docs/prometheus/latest/querying/functions/

如此,Promtheus體系的能力不弱于監(jiān)控界的“數(shù)據(jù)倉庫”+“計算平臺”。因此,在大數(shù)據(jù)的開始在業(yè)界得到應(yīng)用,就能明白,這就是監(jiān)控未來的方向。
一次計算,處處查詢
當(dāng)然,如此強大的計算能力,消耗的資源也是挺恐怖的。因此,查詢預(yù)計算結(jié)果通常比每次需要原始表達式都要快得多,尤其是在儀表盤和告警規(guī)則的適用場景中,儀表盤每次刷新都需要重復(fù)查詢相同的表達式,告警規(guī)則每次運算也是如此。因此,Prometheus提供了 Recoding rules,可以預(yù)先計算經(jīng)常需要或者計算量大的表達式,并將其結(jié)果保存為一組新的時間序列, 達到一次計算,多次查詢的目的。
一次計算,多次查詢:
https://prometheus.io/docs/prometheus/latest/querying/basics/#avoiding-slow-queries-and-overloads

作者:cyningsun
來源:?https://www.cyningsun.com/02-22-2020/hidden-secret-to-understanding-prometheus.html
如果您覺得這篇文章對您有點用的話,麻煩您為本文來個四連:轉(zhuǎn)發(fā)分享、點贊、點在看、留言,因為這將是我寫作與分享更多優(yōu)質(zhì)文章的最強動力!
本公眾號全部博文已整理成一個目錄,請在公眾號后臺回復(fù)「m」獲?。?/p>
推薦閱讀:
1、GitHub 熱榜:適合初學(xué)者學(xué)習(xí)的 Prometheus 監(jiān)控系統(tǒng)
2、IT運維面試問題總結(jié)-數(shù)據(jù)庫、監(jiān)控、網(wǎng)絡(luò)管理(NoSQL、MongoDB、MySQL、Prometheus、Zabbix)
3、CentOS 7上搭建 Zabbix4.0!
4、運維人員常用到的11款服務(wù)器監(jiān)控工具
5、運維必知必會的監(jiān)控知識體系全梳理
6、值得收藏的 14 個 Linux 下 CPU 監(jiān)控工具
7、Linux 常用監(jiān)控指標(biāo)總結(jié)
8、監(jiān)控系統(tǒng)選型,這篇不可不讀! 關(guān)注微信公眾號「杰哥的IT之旅」,后臺回復(fù)「1024」查看更多內(nèi)容,回復(fù)「加群」備注:地區(qū)-職業(yè)方向-昵稱?即可加入讀者交流群。
推薦閱讀:
2、IT運維面試問題總結(jié)-數(shù)據(jù)庫、監(jiān)控、網(wǎng)絡(luò)管理(NoSQL、MongoDB、MySQL、Prometheus、Zabbix)
3、CentOS 7上搭建 Zabbix4.0!
4、運維人員常用到的11款服務(wù)器監(jiān)控工具
5、運維必知必會的監(jiān)控知識體系全梳理
6、值得收藏的 14 個 Linux 下 CPU 監(jiān)控工具
7、Linux 常用監(jiān)控指標(biāo)總結(jié)
8、監(jiān)控系統(tǒng)選型,這篇不可不讀!
點個[在看],是對杰哥最大的支持!

