自从Loki2.0发布以来,LogQL v2凭借丰富的查询功能,让Loki也逐渐具备日志分析的能力。对于有些时候,当研发的同学没有提供Metrics时,我们也能利用LogQL构建基于日志的相关指标,这里面就主要用到了聚合查询。
常见操作
熟悉PromQL的同学应该知道,常见的聚合查询包括sum、rate,count等等。那么在Loki中,也有两种常见类型的聚合操作
第一种类型,将日志条目作为一个整体来计算数值
支持的操作功能有:
- rate(log-range):计算每秒的日志条目数
- count_over_time(log-range):计算给定范围内每个日志流的条目数
- bytes_rate(log-range):计算每个流每秒的字节数
- bytes_over_time(log-range):计算给定范围内每个日志流使用的字节数
例如,统计MYSQL日志中在一分钟内超时时间大于10s的总数
sum by (host) (rate({job="mysql"} |= "error" != "timeout" | json | duration > 10s [1m]))
第二种类型,样本范围,它可以提取标签的值作为样本
需要注意的是,为了正确的选择标签样本,我们在做日志查询时,必须以一个解包表达式和可选的标签过滤表达式结束,以丢弃错误。比如我们常以| __error__ = ""
来过滤错误解析的日志。
在展开范围内支持的功能包括:
- rate(unwrapped-range):计算指定时间间隔内所有值的每秒速率
- sum_over_time(unwrapped-range):指定时间间隔内所有值的总和
- avg_over_time(unwrapped-range):指定间隔内所有点的平均值
- max_over_time(unwrapped-range):指定间隔中所有点的最大值
- min_over_time(unwrapped-range):指定间隔中所有点的最小值
- stdvar_over_time(unwrapped-range):指定间隔内值的总体标准方差
- stddev_over_time(unwrapped-range):指定间隔内值的总体标准偏差
- quantile_over_time(scalar,unwrapped-range):指定间隔内值的φ分位数(0≤φ≤1)
例如:获取ingress中的请求耗时TP99线
quantile_over_time(0.99,
{cluster="ops-tools1",container="ingress-nginx"}
| json
| __error__ = ""
| unwrap request_time [1m])) by (path)
这这里的quantile_over_time大家可能比较熟悉,它与Prometheus中一样,并不是一个估算值。而是将在范围内的所有值进行排序,并计算出第99个百分位数。
关于分组
Loki的分组与Prometheus有所不同,其中它允许我们在没有区间向量的情况下使用分组,比如这些聚合函数avg_over_time
,max_over_time
,min_over_time
,stdvar_over_time
,stddev_over_time
和quantile_over_time
下时可以进行分组,这对聚合特定维度的数据非常有用。
例如,如果我们要按群集获取ingress的响应平均延迟,则可以使用:
avg_over_time({container="ingress-nginx",service="hosted-grafana"} | json | unwrap response_latency_seconds | __error__=""[1m]) by (cluster)
对于其他操作,我们也可以sum by (..),这和我们用PromeQL一样。
例如,我们要将ingress的不同状态码的请求速率进行分组:
sum by (response_status) (
rate({container="ingress-nginx",service="hosted-grafana”} | json | __error__=""[1m])
)
我们可以看到,LogQL通过提取标签用于分组,再进行日志数据的解析和计算生成新的度量功能是比较强大的。当我们在构建具有logfmt和json格式的解析器做度量查询时,我们应该始终记住要使用分组
,因为如不加以控制,我们会在查询的结果包含大量的标签,这很容易达到limits_config中关于labels的限制。
总结
Loki的范围向量操作对于计算日志量来说是非常好用的,我们通过LogQL的解析器和样本表达式,可以很快的从日志中提取出一套新的度量指标,我们甚至不需要改变代码就能看到系统当前的运行情况。
关注公众号「云原生小白」,获取更多精彩内容
网友评论