![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiQDOxEzX3xCZlhXam9VbsUmepNXZy9CXwJWZ3xCdh1mcvZ2Lc1zaHRGcWdUYuVzVa9GczoVdG1mWfVGc5RHLwIzX39GZhh2csATMflHLwEzX4xSZz91ZsAzMfRHLGZkRGZkRfJ3bs92YskmNhVTYykVNQJVMRhXVEF1X0hXZ0xiNx8VZ6l2cssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZwpmL1kTN3czNlRWZ1ETN2ImZyYzXxIjNzcTM2EzLchDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.jpg)
Prometheus通過名額名稱(metrics name)以及對應的一組标簽(labelset)唯一定義一條時間序列( 名額名稱+一組标簽=一條時間序列,一條時間序列下面有很多樣本 )。
名額名稱反映了監控樣本的基本辨別,而label則在這個基本特征上為采集到的資料提供了多種特征次元。使用者可以基于這些特征次元過濾,聚合,統計進而産生新的計算後的一條時間序列。
PromQL是Prometheus内置的資料查詢語言,其提供對時間序列資料豐富的查詢,聚合以及邏輯運算能力的支援。并且被廣泛應用在Prometheus的日常應用當中,包括對資料查詢、可視化、告警處理當中。可以這麼說,PromQL是Prometheus所有應用場景的基礎,了解和掌握PromQL是Prometheus入門的第一課。
過濾時間序列(名額名稱 + 标簽)
當Prometheus通過Exporter采集到相應的監控名額樣本資料後,我們就可以通過PromQL對監控樣本資料進行查詢。
當我們直接使用監控名額名稱查詢時,可以查詢該名額下的所有時間序列。如:
http_requests_total
等同于:
http_requests_total{}
該表達式會傳回名額名稱為http_requests_total的所有時間序列:
http_requests_total{code="200",handler="alerts",instance="localhost:9090",job="prometheus",method="get"}=([email protected])
http_requests_total{code="200",handler="graph",instance="localhost:9090",job="prometheus",method="get"}=([email protected])
PromQL還支援使用者根據時間序列的标簽比對模式來對時間序列進行過濾,目前主要支援兩種比對模式:完全比對和正則比對。
PromQL支援使用
=
和
!=
兩種完全比對模式:
- 通過使用
可以選擇那些标簽滿足表達式定義的時間序列;label=value
- 反之使用
則可以根據标簽比對排除時間序列;label!=value
例如,如果我們隻需要查詢所有http_requests_total時間序列中滿足标簽instance為localhost:9090的時間序列,則可以使用如下表達式:
http_requests_total{instance="localhost:9090"}
反之使用
instance!="localhost:9090"
則可以排除這些時間序列:
http_requests_total{instance!="localhost:9090"}
除了使用完全比對的方式對時間序列進行過濾以外,PromQL還可以支援使用正規表達式作為比對條件,多個表達式之間使用
|
進行分離:
- 使用
表示選擇那些标簽符合正規表達式定義的時間序列label=~regx
- 反之使用
進行排除label!~regx
例如,如果想查詢多個環節下的時間序列序列可以使用如下表達式:
http_requests_total{environment=~"staging|testing|development",method!="GET"}
範圍查詢
直接通過類似于PromQL表達式
http_requests_total
查詢時間序列時,傳回值中隻會包含該時間序列中的最新的一個樣本值,這樣的傳回結果我們稱之為瞬時向量。而相應的這樣的表達式稱之為瞬時向量表達式。
而如果我們想過去一段時間範圍内的樣本資料時,我們則需要使用區間向量表達式。
區間向量表達式和瞬時向量表達式之間的差異在于在區間向量表達式中我們需要定義時間選擇的範圍,時間範圍通過時間範圍選擇器
[]
進行定義。例如,通過以下表達式可以選擇最近5分鐘内的所有樣本資料:
http_requests_total{}[5m]
http_requests_total{code="200",handler="alerts",instance="localhost:9090",job="prometheus",method="get"}=[
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
]
http_requests_total{code="200",handler="graph",instance="localhost:9090",job="prometheus",method="get"}=[
4 @1518096812.326
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
]
- s - 秒
- m - 分鐘
- h - 小時
- d - 天
- w - 周
- y - 年