近期發現自己實驗用的 Prometheus 效能出現瓶頸, 經常會出現如下告警:
PrometheusMissingRuleEvaluations
PrometheusRuleFailures
之後慢慢排查發現是由於 Prometheus 的某些 series 的高基數(High Cardinality)導致的. 本文是對 Prometheus 高基數問題的一次全面總結.
基數的基本定義是指一個給定集合中的元素的數量。
在Prometheus和可觀察性的世界裡,標籤基數是非常重要的,因為它影響到你的監控系統的效能和資源使用。
下面這張圖, 可以清晰地反應基數的重要性:
簡單地說。基數 是指一個標籤的總體數值的計數。在上面的例子中,標籤status_code
的基數是5,(即:1xx
2xx
3xx
4xx
5xx
),environment
的基數是2(即prod
dev
),而指標server_responses
的總體基數是10。
一般來說:
還是上面的例子, 如果 status_code
是詳細的code, 如200
404
..., 那它的基數就可能高達數百個, environment
的基數再多一些, 指標server_responses
的總體基數就會迅速膨脹.
這還不夠形象, 再舉 2 個特別典型的例子:
http_request_duration_seconds_bucket
instance
label, 對應 100 個範例;le
label, 對應的是不同的 buckets, 有 10 個 buckets, 如(0.002
0.004
0.008
... =+inf
)url
這個 label, 對應的是不通的 url:
http_method
這個label, 對應有 5 個 http method100*10*400*5=2 000 000
200萬個 series