Google Cloud Managed Service for Prometheus 中的 PromQL 查詢會在 Monarch 後端進行部分評估,因此查詢結果會出現一些已知差異。本文將說明這些差異。
除了本文列出的差異之外,Managed Service for Prometheus 中的 PromQL 與 Prometheus 2.44 版的 PromQL 相同。系統可能不支援 Prometheus 2.44 版之後新增的 PromQL 函式。
支援 UTF-8
Cloud Monitoring 的 PromQL 支援 UTF-8 查詢。
如果 Prometheus 指標名稱只包含英數字元和 _
或 :
字元,且標籤鍵只包含英數字元和 _
字元,您就可以使用傳統的 PromQL 語法查詢。舉例來說,有效的查詢可能如下所示:
job:my_metric:sum{label_key="label_value"}
。
不過,如果 Prometheus 指標名稱使用 _
或 :
以外的任何特殊字元,或是標籤鍵使用 _
以外的任何特殊字元,則必須根據 PromQL 的 UTF-8 規格建構查詢。
UTF-8 指標名稱必須加上引號,並移至大括號內。如果標籤名稱含有不相容的舊版字元,也必須加上引號。以下有效查詢範例皆相等:
{"my.domain.com/metric/name_bucket", "label.key"="label.value"}
{__name__="my.domain.com/metric/name_bucket", "label.key"="label.value"}
{"__name__"="my.domain.com/metric/name_bucket", "label.key"="label.value"}
依指標名稱比對
系統只支援完全比對指標名稱。查詢中必須包含完全相符的指標名稱。
如果常見情境在 __name__
標籤上使用規則運算式比對器,建議您採取下列因應措施:
- Prometheus 介面卡設定通常會使用
=~
運算子,比對多個指標名稱。如要修正這項用法,請展開設定,為每項指標使用個別政策,並明確命名每項指標。這也能避免您根據非預期的指標,意外自動調度資源。 - 您通常會使用規則運算式,在同一張圖表上繪製多個非維度指標的圖表。舉例來說,如果您有
cpu_servicename_usage
這類指標,可以使用萬用字元將所有服務繪製在同一張圖表上。在 Cloud Monitoring 中,使用這類非維度指標是明顯的錯誤做法,而且會導致查詢效能極差。如要修正這項用量,請將所有維度移至指標標籤,而非將維度嵌入指標名稱。 - 查詢多個指標通常是用來查看可查詢的指標。建議您改用
/labels/__name__/values
呼叫來探索指標。您也可以使用 Cloud Monitoring UI 探索指標。 - 比對多個指標有助於瞭解每個指標的擷取、擷取和計費樣本數。Cloud Monitoring 會在「指標管理」頁面提供這項資訊。您也可以使用擷取的樣本指標或依歸因 ID 寫入的樣本指標,以指標資料的形式存取這項資訊。
過時程度
Monarch 後端不支援過時。
計算 irate
如果 irate
函式的回溯期小於步長,我們會將回溯期增加至步長。Monarch 需要這項變更,確保輸出內容不會完全忽略任何輸入資料。這項差異也適用於 rate
計算。
rate
和 increase
的計算方式
如果 rate
函式的回溯期小於步長,我們會將回溯期增加至步長。Monarch 需要這項變更,確保輸出內容不會完全忽略任何輸入資料。這項差異也適用於 irate
計算。
內插法和外插法的計算方式不同。 Monarch 使用的插補演算法與 Prometheus 不同,因此結果可能略有差異。舉例來說,Monarch 計數器樣本會連同時間範圍一併儲存,而非 Prometheus 使用的單一時間戳記。因此,即使 Prometheus 時間戳記會排除這些樣本,Monarch 仍可將計數器樣本納入速率計算。這通常會產生更準確的費率結果,尤其是在查詢基礎時間序列的開頭或結尾時。
計算 histogram_quantile
如果直方圖沒有樣本,PromQL histogram_quantile
計算會產生 NaN 值。內部查詢語言的計算不會產生任何值,而是會捨棄時間戳記的點。
費率計算差異也可能影響 histogram_quantile
查詢的輸入內容。
不同類型指標的類型專屬函式
雖然上游 Prometheus 是弱型別,但 Monarch 是強型別。也就是說,在 Managed Service for Prometheus 中,您無法對不同類型的指標執行特定類型的函式 (例如對 GAUGE 指標執行 rate()
,或對 COUNTER 或未輸入類型的指標執行 histogram_quantile()
),即使這些函式可在上游 Prometheus 中運作也一樣。