簡體   English   中英

Prometheus 查詢最后一個局部峰值

[英]Prometheus query for last local peak value

什么 Prometheus 查詢 (PromQl) 可用於識別圖表中最后 X 分鍾內的最后一個局部峰值?

局部峰值是大於其上一個和下一個數據點的點。 (所以當前時間絕對不是局部高峰)

示例圖 (p:峰值點,i:cornjob 間隔,m:錯過執行)

我希望這個值在 cron 作業的執行中發現異常。 正如您在圖片中看到的,我編寫了一個查詢來計算自上次執行作業以來經過的時間。 現在要設置一條警報規則來計算從上次成功執行開始經過的時間並查找錯過的執行,我需要在該時間間隔內上次執行作業的時間量。 這個間隔對於查詢是未知的(換句話說,作業的間隔是由另一個程序指定的),所以我無法將經過的時間與固定時間進行比較。

使用 z-score 檢測異常

如果您知道一個系列的平均值和標准偏差 (σ),您可以使用該系列中的任何樣本來計算 z 分數。 z 分數以與平均值的標准差數來衡量。 因此,z-score 為 0 意味着 z-score 與具有正態分布的數據集中的平均值相同,而 z-score 為 1 與平均值相差 1.0 σ 等。

  1. 使用大樣本量的數據計算指標的平均值和標准差。
# Long-term average value for the series
- record: job:cronjob_duration_time_seconds_count:rate10m:avg_over_time_1w
expr: avg_over_time(sum(rate(cronjob_duration_time_seconds_count[10m]))[1w:])

# Long-term standard deviation for the series
- record: job:cronjob_duration_time_seconds_count:rate5m:stddev_over_time_1w
expr: stddev_over_time(sum(rate(cronjob_duration_time_seconds_count[10m]))[1w:])
  1. 獲得聚合的平均值和標准偏差后,計算 Prometheus 查詢的 z 分數。
# Z-Score for aggregation
(
job:cronjob_duration_time_seconds_count:rate10m -
job:cronjob_duration_time_seconds_count:rate10m:avg_over_time_1w
) /  stddev_over_time(sum(rate(cronjob_duration_time_seconds_count[10m]))[1w:])

根據正態分布的統計原理,您可以假設任何超出大約 +1 到 -1 范圍的值都是異常值。 例如,當我們的聚合超出此范圍超過五分鍾時,您會收到警報。

如果您想要的是在經過的時間超過固定持續時間時觸發警報,您可以設置一個類似於up警報的警報,基於changes > 0表達式,這只是 true (即> 0 )作業運行時。

一個例子是:

  rules:
  - alert: CronJobNotRunning
    expr: |
        changes(
            sum(
                rate(
                    cronjob_duration_time_seconds_count{
                        status="ok", namespace="<namespace>", exported_job="<job>"
                    }[1m]
                )
            )[1m:]
        ) == 0
    for: <alert_duration>

請注意,子查詢 ( [1m:] ) 很昂貴,並且在那里引入記錄規則可以提高性能,尤其是在儀表板中。

此外,在您的情況下,也可以使用自上次二階導數非零以來的時間,因為這發生在作業開始/結束時(圖表中的下降或開始上升時)。

暫無
暫無

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

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