Prometheus 核心的資料結構非常簡單,只有一種。就是時間序列。
一個時間序列的組成包含:
一般來說指標名稱和標籤是鍵,樣本是值。比方以下表達式
api_http_requests_total{method="POST", handler="/messages"}
表達的是「名為 api_http_request_total,method 是 POST,handler 是 /message」的那個樣本集。數值通常是圖示。
使用上如果一個時間序列不夠存我們關注的資訊,就用兩個。比方說我們可以有
api_http_responses{method="POST", handler="/messages", code="200"}
api_http_responses_total{method="POST", handler="/messages"}
這樣就可以用 PromQL 算出 200 的比率了。
api_http_responses{method="POST", handler="/messages", code="200"} / api_http_responses_total{method="POST", handler="/messages"}
相較於 Prometheus,OpenMetrics 就顯得囉嗦。
它訂義了指標族(MetricFamily),一個指標族的組成包含
樣本序列裡的樣本格式取決於指標族型態。
然而在表示一個指標族時,就是拆成多個 Prometheus 時間序列。
以 Counter 型態為例,樣本包含 total 和 created 屬性。
# TYPE api_http_responses counter
# HELP Http Response Counts
api_http_responses_total{method="POST", handler="/messages"}
api_http_responses_created{method="POST", handler="/messages"}
le
和 quantile
是保留標籤名,它們是做什麼的?上篇提到 Prometheus 提供了 Recording Rule來從舊指標用表達式生出新的指標。
yml 設定檔的最底層是 groups,每個 group 有:
規則列表裡的規則有兩種:
一是 recording_rule,它有:
二是 alerting_rule,它有:
其中覆寫標籤可以使用 Golang 模板語言。
例見官方文件。
警報規則引擎的設定檔就跟 Recording Rule 是同一個,他的原理是用表達式來產生「警報是否觸發」的時間序列,值為 1 代表觸發,反之為 0。
每條警報規則會產生兩條時間序列:
ALERTS{alertname="<alert name>", alertstate="pending"...}
ALERTS{alertname="<alert name>", alertstate="firing"...}
pending 時間序列代表表達式已為真,但持續的時長不足。
firing 時間序列代表表達式已為真,超過時長且尚未消滅。
例見官方文件。
le
和 quantile
是做什麼的?