本文介紹時序資料的查詢和分析文法及使用限制。
Log Service提供如下三種時序資料查詢和分析方式:
PromQL文法:使用PromQL(Prometheus的查詢語言)文法簡化對時序資料的查詢和分析。更多資訊,請參見Prometheus官方文檔。
SQL文法:根據時序資料的編碼方式進行查詢和分析。
SQL+PromQL文法:使用SQL文法與Log Service提供5個PromQL函數進行巢狀查詢。使用PromQL文法的同時,您還可以使用Log Service機器學習文法。更多資訊,請參見機器學習文法。
PromQL文法
PromQL文法樣本如下所示。
查詢指標名為http_requests_total,job標籤為apiserver,handler標籤為/api/comments的時間序列。
http_requests_total{job="apiserver", handler="/api/comments"}
查詢過去5分鐘內,按照應用程式app和進程類型proc分組的前3個CPU使用者。
topk(3, sum by (app, proc) (rate(instance_cpu_time_ns[5m])))
尋找不健康的Pod。
min_over_time(sum by (namespace, pod) (kube_pod_status_phase{phase=~"Pending|Unknown|Failed"})[15m:1m]) > 0
查詢K8s DaemonSet CPU 使用率。
sum (rate (container_cpu_usage_seconds_total{pod=~"^x.*$",cluster=~".*",namespace=~".*"}[1m])) / sum (kube_pod_container_resource_limits_cpu_cores{pod=~"^null.*$",cluster=~".*",namespace=~".*"}) * 100
PromQL文法的更多資訊,請參見Prometheus官方文檔,查詢樣本。
SQL文法
SQL文法樣本如下所示。
查詢和分析全部資料。
*| SELECT * FROM "my_metric_store.prom" WHERE __name__ != ''
針對指標 http_request_count,查詢__labels__中'domain'值為www.example.com的資料,並對__value__欄位進行求和計算。
*| SELECT sum(__value__) FROM "my_metric_store.prom" WHERE __name__='http_request_count' and element_at(__labels__, 'domain')='www.example.com'
針對指標 http_request_count,查詢__labels__中 'domain'值為www.example.com的資料,並對__value__欄位按小時粒度執行彙總求和計算。
*| SELECT sum(__value__),date_trunc('hour', __time_nano__/1000000) as t FROM "my_metric_store.prom" WHERE __name__='http_request_count' and element_at(__labels__, 'domain')='www.example.com' GROUP BY t ORDER BY t DESC
SQL+PromQL文法
Log Service提供7個PromQL函數,其中promql_query、promql_labels、promql_label_values和promql_series函數只能在MetricStore的自訂查詢分析頁面中執行。詳細說明如下表所示。
當使用SQL+PromQL文法查詢和分析時序資料時,您FROM的表名固定為metrics。
PromQL函數的詳細介面特性和說明,請參見Prometheus官方文檔。
函數名 | 說明 | 範例 |
promql_query(string) | 即時查詢和分析。查詢離時間區間中結束時間(EndTime)最近的資料。該函數對應Prometheus的/query API,參數為query=<string>,參數time為<EndTime>。 | *| SELECT promql_query('up') FROM metrics |
promql_query_range(string, string) | 查詢特定時間範圍(即時間框中的StartTime與EndTime)內的資料。對應Prometheus的/query_range API,參數為query=<string>、step=<duration>、start=<StartTime>、end=<EndTime>。 | *| SELECT promql_query_range('up', '5m') FROM metrics |
promql_labels() | 返回所有的Label Key。 | *| SELECT promql_labels() FROM metrics |
promql_labels(string) | 支援添加match[]參數,用於返回對應<series_selector>的Label Key。 當前僅支援添加一個match[]參數值,例如 promql_labels('up')。 | *| SELECT promql_labels('up') FROM metrics |
promql_label_values(string) | 返回某個Label的值。 | *| SELECT promql_label_values('__name__') FROM metrics |
promql_label_values(string, string) | 支援添加match[]參數,用於返回對應<series_selector>下特定Label的Value列表。 當前僅支援添加一個match[]參數值,需設定match[]參數在前,Label參數在後,例如promql_label_values('up', '__label_name__') 。 | *| SELECT promql_label_values('up', '__label_name__') FROM metrics |
promql_series(string) | 返回匹配的時間序列。 | *| SELECT promql_series('up') FROM metrics |
PromQL函數相當於UDTF,即返回一個表。
promql_query(string)、promql_query_range(string, string)函數返回的表的結構如下表所示。
欄位名
欄位類型
說明
metric
varchar
時序名稱。如果使用了Group By文法,那麼該值可能為空白。
labels
map<varchar, varchar>
Labels資訊,Map類型。
time
bigint
時間。
value
double
某個時間點對應的值。
查詢樣本如下:
promql_query(string)函數
promql_query_range(string, string)函數
promql_labels()、promql_labels(string)、promql_label_values(string)、promql_label_values(string, string)函數返回的表的結構如下表所示。
欄位
欄位類型
說明
label
varchar
Label Key
查詢樣本如下:
promql_labels()函數
promql_labels(string)函數
promql_label_values(string)函數
promql_label_values(string, string)函數
promql_series(string)函數返回的表的結構如下表所示。
欄位
欄位類型
說明
series
map<varchar, varchar>
時間序列
查詢樣本如下:
使用限制
MetricStore僅支援Prometheus查詢和分析API(例如/query API、/query_range API等),其它API如/admin API、/alerts API、/rules API等均不支援。
使用PromQL文法、SQL+PromQL文法時,最多返回11000個時間點對應的值。
使用PromQL文法、SQL+PromQL文法時,您的Metric name和Label命名應符合命名規範。更多資訊,請參見時序標識。