經常在夜鶯社區收到用户反饋,説查詢某個監控指標,昨天的峯值是 xx,今天再次查詢,發現昨天的峯值看不到了,然後開始吐槽,你們這監控怎麼搞的,一點都不準啊。事實真的是這樣嗎?
真實原因
本質上這是因為 Prometheus 生態在查詢歷史數據時提供了一個 step 參數,大多數人對這個知識匱乏導致的疑問。
上圖是 Prometheus 的官方文檔,其他的時序庫比如 VictoriaMetrics、Thanos 都是兼容 Prometheus 接口的,所以邏輯是相同的。其中説明了 step 參數的含義:Query resolution step width in duration format or float number of seconds。
比如 step=15,返回的數據就是每 15 秒一個數據點,如果 step=60,返回的數據就是每分鐘一個數據點。假設原始數據採集的時候,是每 15 秒採集一次,那 step=15 就能完整展示原始數據,如果 step=60,就會有部分數據被丟掉,導致歷史峯值看不到。
怎麼控制 step 參數
大部分用户查詢監控數據的時候,壓根沒有關注這個值,但是仍然可以查詢數據。這是因為,Prometheus、Grafana、Nightingale 等都會根據用户選擇的時間範圍自動計算 step,以保證返回的數據不會太密集太多,也不會太稀疏太少。
不同的監控系統,對於數據稀疏與否的配置不同,以 Nightingale 舉例。比如你要查詢最近 1 小時的數據,Nightingale 自動計算的 step 就是 15:
如果查詢最近 24h 的數據,Nightingale 自動計算的 step 就是 360:
當然,你也可以手工指定 step 的值,比如手工指定為 15:
可以看到,手工指定 step 為 15,返回的數據就是每 15 秒一個數據點,這樣就能完整展示原始數據了,但是數據量會比較大,圖表看起來也很稠密。如果要看一年的數據,仍然強制 step 為 15 話,返回的數據可能會把瀏覽器幹蹦。
如何知道實際採集頻率
Prometheus 這個設計邏輯,一個是可以保證查詢效率,另一個是為了時間戳對齊,方便不同的指標之間做計算,並非是監控不準。如果你想使用原始數據繪圖,那就把 step 的大小設置為監控數據採集時的頻率即可。
但是作為用户,如果採集規則不是你配置的,你不知道採集頻率怎麼辦?此時可以到 Nightingale 的即時查詢頁面,使用 Table 視圖,查看指標一段時間的數據,比如:
Promql 最後加了一個 [5m] 是查詢 5 分鐘的數據,這是 Promql 的知識不展開了。下面的內容展示的是 5 分鐘內的原始數據,並且時間戳自動展示為人類易讀的方式,而且自動計算了時間戳之間的差值,這樣就很方便知道採集頻率了。上圖中可以看到採集頻率是 60 秒一次。
另外,在這個視圖中如果你發現某個指標的採集頻率不固定,那很可能是相同的數據重複採集了,比如同時有兩個 categraf 在採集相同的一個監控目標,這種情況通常是不符合預期的,需要排查。
總結
Prometheus 生態的 step 參數是一個很重要的概念,對於監控數據的查詢有着重要的影響。大部分情況下,用户不需要關心這個參數,因為監控系統會自動計算 step,以保證查詢效率和數據展示的合理性。但是如果你想看原始數據,或者想了解監控數據的採集頻率,那就需要了解 step 參數的含義,以及如何手工指定 step 參數啦。