前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何在Loki中使用LogQL做聚合查询

如何在Loki中使用LogQL做聚合查询

原创
作者头像
云原生小白
修改2021-01-15 10:53:54
4K0
修改2021-01-15 10:53:54
举报
文章被收录于专栏:LokiLoki

自从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的总数

代码语言:txt
复制
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线

代码语言:txt
复制
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_timemax_over_timemin_over_timestdvar_over_timestddev_over_timequantile_over_time下时可以进行分组,这对聚合特定维度的数据非常有用。

例如,如果我们要按群集获取ingress的响应平均延迟,则可以使用:

代码语言:txt
复制
avg_over_time({container="ingress-nginx",service="hosted-grafana"} | json | unwrap response_latency_seconds | __error__=""[1m]) by (cluster)

对于其他操作,我们也可以sum by (..),这和我们用PromeQL一样。

例如,我们要将ingress的不同状态码的请求速率进行分组:

代码语言:txt
复制
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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 常见操作
  • 关于分组
  • 总结
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档