深入淺出理解 Prometheus,看這篇就夠了~
原文:www.cyningsun.com/02-22-2020/hidden-secret-to-understanding-prometheus.html
背景
概念:Instance、Job、Metric、Metric Name、Metric Label、Metric Value、Metric Type(Counter、Gauge、Histogram、Summary)、DataType(Instant Vector、Range Vector、Scalar、String)、Operator、Function
日常監(jiān)控
假設(shè)需要監(jiān)控 WebServerA 每個API的請求量為例,需要監(jiān)控的維度包括:服務(wù)名(job)、實(shí)例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;
存儲引擎
存儲的數(shù)據(jù)量級十分龐大 大部分時間都是寫入操作 寫入操作幾乎是順序添加,大多數(shù)時候數(shù)據(jù)到達(dá)后都以時間排序 寫操作很少寫入很久之前的數(shù)據(jù),也很少更新數(shù)據(jù)。大多數(shù)情況在數(shù)據(jù)被采集到數(shù)秒或者數(shù)分鐘后就會被寫入數(shù)據(jù)庫 刪除操作一般為區(qū)塊刪除,選定開始的歷史時間并指定后續(xù)的區(qū)塊。很少單獨(dú)刪除某個時間或者分開的隨機(jī)時間的數(shù)據(jù) 基本數(shù)據(jù)大,一般超過內(nèi)存大小。一般選取的只是其一小部分且沒有規(guī)律,緩存幾乎不起任何作用 讀操作是十分典型的升序或者降序的順序讀 高并發(fā)的讀操作十分常見
那么 TSDB 是怎么實(shí)現(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
存儲兩部分?jǐn)?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ù)計算

一次計算,處處查詢

