簡體   English   中英

如何使用 Prometheus 警報規則檢測新指標

[英]How to detect a new metrics with Prometheus alerting rule

假設我有用戶的指標request_failures 對於每個用戶,我都會為指標添加一個唯一的標簽值。 因此,對於用戶u1 ,當請求失敗兩次時,我得到以下指標:

    request_failures{user_name="u1"} 2

我還有一個規則,當出現新的故障時會觸發。 其表達式為:

    increase(request_failures[1m]) > 0

這適用於已經遇到故障的用戶。 例如,當 u1 遇到第三次失敗時,規則會觸發。

當對新用戶u2的請求失敗時,我得到的指標為:

    request_failures{user_name="u1"} 2
    request_failures{user_name="u2"} 1

現在的問題是警報規則不會為u2觸發。 似乎該規則無法識別“新指標”,盡管所有三個指標都是相同的request_failures ,只是具有不同的標簽。

任何人都可以指出我應該如何構建規則?

這應該是答案: https : //www.robustperception.io/dont-put-the-value-in-alert-labels

關鍵是標簽不應包含變量值,因為它是指標標識的一部分。 解決方案是添加用戶名作為注釋而不是度量的標簽。

規則不觸發的原因是increase()函數在第一次刮取之前不考慮新創建的計數器為 0。 我沒有找到任何來源,但似乎確實如此。

因此,您要檢測兩種情況:

  • 如果用戶有問題而他以前沒有問題
  • 如果用戶在過去 N 分鍾內有新問題

這可以用相反的邏輯重新表述:

應該為有錯誤的用戶觸發警報,除非該用戶在過去 N 分鍾內的錯誤沒有增加

這很容易轉化為以下 promql:

rule: request_failures > 0 UNLESS increase(request_failures[1m]) == 0

事后看來,關於increase()函數,它不能假設以前的值是 0,因為它是在一個范圍內表示的。 先前的值可能超出范圍並且不等於 0。因此,至少有兩個點具有值是有意義的。

正如@MichaelDoubez 已經提出的那樣, increase()不會將新創建的指標視為價值增加。 不幸的是, changes() 這是有原因的,例如缺少刮擦,但仍然可以通過查詢來解決。

increase(request_failures[10m]) > 0
or
( request_failures unless request_failures offset 10m )

當有新指標時,第二部分(以or開頭)將觸發 10 分鍾(由offset定義)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM