本文介绍时序数据的查询和分析语法及使用限制。
日志服务提供三种时序数据查询和分析方式:
PromQL语法:使用PromQL(Prometheus的查询语言)语法简化对时序数据的查询和分析。更多信息,请参见Prometheus官方文档。
SQL语法:根据时序数据的编码方式进行查询和分析。
SQL+PromQL语法:使用SQL语法与日志服务提供5个PromQL函数进行嵌套查询。使用PromQL语法的同时,您还可以使用日志服务机器学习语法。更多信息,请参见机器学习语法。
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语法
日志服务提供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命名应符合命名规范。更多信息,请参见时序标识。