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

1,788 阅读3分钟

自从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_timemax_over_timemin_over_timestdvar_over_timestddev_over_timequantile_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的解析器和样本表达式,可以很快的从日志中提取出一套新的度量指标,我们甚至不需要改变代码就能看到系统当前的运行情况。

关注公众号「云原生小白」,获取更多精彩内容