自从Loki2.0发布以来,LogQL v2凭借丰富的查询功能,让Loki也逐渐具备日志分析的能力。对于有些时候,当研发的同学没有提供Metrics时,我们也能利用LogQL构建基于日志的相关指标,这里面就主要用到了聚合查询。
熟悉PromQL的同学应该知道,常见的聚合查询包括sum、rate,count等等。那么在Loki中,也有两种常见类型的聚合操作
第一种类型,将日志条目作为一个整体来计算数值
支持的操作功能有:
例如,统计MYSQL日志中在一分钟内超时时间大于10s的总数
sum by (host) (rate({job="mysql"} |= "error" != "timeout" | json | duration > 10s [1m]))
第二种类型,样本范围,它可以提取标签的值作为样本
需要注意的是,为了正确的选择标签样本,我们在做日志查询时,必须以一个解包表达式和可选的标签过滤表达式结束,以丢弃错误。比如我们常以| __error__ = ""
来过滤错误解析的日志。
在展开范围内支持的功能包括:
例如:获取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的解析器和样本表达式,可以很快的从日志中提取出一套新的度量指标,我们甚至不需要改变代码就能看到系统当前的运行情况。
微信关注公众号「云原生小白」,回复【入群】进入Loki学习群
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有