Prometheus 計數器指標

深入瞭解最重要的 Prometheus 指標

Prometheus 計數器指標需要一些時間來適應。官方文檔很好地解釋了這個理論,但直到我創建了一些圖表,我才明白這個指標有多麼強大。

本文將理論與圖表相結合,以更好地理解 Prometheus 的計數器指標。我們將看到 PromQL 的功能 rate, increase, irate, 和 resets工作,最重要的是,我們將查看一些由生產數據的計數器指標生成的圖表。

正如您可能從名稱中猜到的那樣,計數器可以計算事物。它以最簡單的方式這樣做,因爲它的值只能增加而不能減少 ¹。

如何理解

雖然無法減少正在運行的計數器的值,但可以重置計數器。應用程序重新啓動時會發生重置。

這種行爲使計數器適合跟蹤只能舉一些上升的事物。一些例子包括:

或者在應用程序開發中:

永遠不要對可以上升或下降的數字使用計數器。例如,您不應該使用計數器來跟蹤數據庫的大小,因爲大小可以擴展或縮小。

使用計數器 (Working with counters)

在本節中,我們將瞭解計數器可以提供的獨特見解。我們將使用一個計算作業執行次數的示例指標。

class Job {

    private val counter = Metrics.counter("job_execution")

    @Scheduled(fixedDelay = 30000)
    fun execute() {
        counter.increment()
    }
}

這段代碼通過名稱定義了一個計數器 job_execution.應用程序度量庫 Micrometer 將此度量導出爲 job_execution_total. 這 execute()方法每 30秒運行一次,每次運行時,它都會將我們的計數器加一。

原始計數器值 (Raw counter values)

在大多數情況下,您從原始計數器值中獲得的見解沒有價值。如果我們繪製原始計數器值,我們會看到一條不斷上升的線。

繪製原始計數器值會產生一條只會上升的線。

這條線會一直上升,直到我們重新啓動應用程序。當應用程序重新啓動時,計數器重置爲零

當應用程序重新啓動時,計數器將重置爲零

幸運的是,PromQLPrometheus 查詢語言)提供了一些函數來從我們的計數器中獲取更有洞察力的數據。

速度 (rate)

prometheus rate函數計算計數器在定義的時間窗口內每秒增加的速率。以下 PromQL 表達式計算最後一分鐘的每秒作業執行率 ²。

rate(job_execution_total[1m])

我們的工作以固定間隔運行,因此將上述表達式繪製在圖形中會產生一條直線。

繪製一分鐘窗口內的作業執行率

從圖中,我們可以看到每秒大約執行 0.036job。將此數字乘以 60 得到 2.16。這比人們預期的要高,因爲我們的工作每 30 秒運行一次,這將是每分鐘兩次。

Prometheus 抓取指標的方式導致預期值和測量值之間存在細微差異。根據時間的不同,結果值可能更高或更低。重要的是要記住 Prometheus 指標不是一門精確的科學。

PromQLrate自動調整計數器重置和其他問題。因此,無論何時應用程序重新啓動,我們都不會像處理原始計數器值那樣看到任何奇怪的下降。

單調性中斷(例如由於目標重新啓動引起的計數器重置)會自動調整。此外,計算會外推到時間範圍的末端,允許遺漏刮擦或刮擦週期與範圍時間段的不完美對齊。— prometheus文檔

最後要注意的一件事 rate功能是我們應該只將它與計數器一起使用。使用意義不大 rate與任何其他 Prometheus指標類型。

增加 (increase)

promethues increase函數計算指定時間範圍內的計數器增加量 ²。以下 PromQL 表達式計算過去 5 分鐘內的job執行次數。

increase(job_execution_total[5m])

由於我們的job30 秒的固定間隔運行,因此我們的圖表應顯示大約 10 的值

繪製過去 5 分鐘內的job執行次數

promethues推斷 increase覆蓋整個指定的時間窗口。因此,儘管計數器僅按整數增量 ¹ 增加,但仍有可能獲得非整數結果。

相似 rate,我們應該只使用 increase與計數器。使用意義不大 increase與任何其他Prometheus指標類型。

Irate

這個指標非常類似於 rate. 就像 rate, irate計算計數器在定義的時間窗口內每秒增加的速率。不同之處在於 irate只看最後兩個數據點。這使得 irate非常適合繪製易變和 / 或快速移動的計數器 ²。

以下 PromQL 表達式返回查找兩個最新數據點兩分鐘前的每秒job執行率。

irate(job_execution_total[2m])

我們應該只使用 Irate與計數器。

重置 (Resets)

promethues resets函數爲您提供指定時間窗口內的計數器重置次數 ²。以下 PromQL 表達式計算過去 5 分鐘內job執行計數器重置的次數。

resets(job_execution_total[5m])

我們應該只使用 resets與計數器。

真實世界的示例圖

到目前爲止,我們看到的圖表對於理解計數器的工作原理很有用,但它們很無聊。

爲了更深入地瞭解這些圖表在生產環境中的樣子,我從工作中的 Grafana儀表板中截取了幾張屏幕截圖。

由於不想泄露公司機密,我已對所有數據進行了匿名處理……

下圖使用 increase計算每分鐘處理的消息數。在 24小時的窗口上繪製此圖時,可以清楚地看到夜間的流量要低得多。

使用增加來繪製我們每分鐘處理的消息數量

這裏我們有相同的指標,但這個指標使用 rate測量每秒處理的消息數。

使用 rate 繪製我們每秒處理的消息數

正如人們所料,這兩個圖看起來相同,只是比例不同。您應該使用哪一種取決於您測量的對象和偏好。

在這個例子中,我更喜歡 rate變體。我認爲看到我們每秒處理6.5 條消息比看到我們每分鐘處理 390 條消息更容易理解。

結論

Prometheus 計數器是一個簡單的指標,但可以通過使用不同的 PromQL 函數來創建有價值的見解,這些函數旨在與計數器一起使用。你應該使用哪個 PromQL 函數取決於被測量的事物和你正在尋找的洞察力。

5.3 參考資料

參考 [1][2][3]

參考資料

[1]

參考: https://prometheus.io/docs/concepts/metric_types/

[2]

參考: https://levelup.gitconnected.com/prometheus-counter-metrics-d6c393d86076

[3]

參考: https://prometheus.io/docs/prometheus/latest/querying/functions/

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/LG2NdybrEesksc7j78uVkw