【Furion】Loki查询之LogQL语句

【Furion】Loki查询之LogQL语句Loki有LogQL查询语句,它就像一个分布式的grep日志聚合查看器和PromeQL一样,LogQL使用标签和运算符进行过滤,它主要分为两个部分:logstreamselector(日志流选择器)filterexpression(过滤器表达式)这两部分可以在Loki中组合出想要的功能,通常情况下有如下功能:根据日志流选择器查看日志内容通过过滤规则在日志流中计算相关的度量指标一、logstreamselector日志流选择器这部分和PromQL的语法一样,主要也是通过采集上来

Loki有LogQL查询语句,它就像一个分布式的grep日志聚合查看器
和PromeQL一样,LogQL使用标签和运算符进行过滤,它主要分为两个部分:

  • log stream selector(日志流选择器)
  • filter expression(过滤器表达式)
    在这里插入图片描述
    这两部分可以在Loki中组合出想要的功能,通常情况下有如下功能:
  • 根据日志流选择器查看日志内容
  • 通过过滤规则在日志流中计算相关的度量指标

一、log stream selector

日志流选择器这部分和PromQL的语法一样,主要也是通过采集上来的日志label来确定你要查询的日志流。通常label的匹配运算支持以下几种:

  • =: 完全匹配
  • !=: 不匹配
  • =~: 正则表达式匹配
  • !~: 正则表达式不匹配

举个例子

{ 
   name=~"mysql.+", env="prod"}
{ 
   name!~"mysql.+", env="prod"}
{ 
   name!~`mysql-\d+`,env="prod"}

以上语句都可以查出所有与之匹配的日志内容

二、filter expression

在查看全文的日志时,通常会用grep等一些工具来查找对应的日志内容。过滤的表达式主要支持如下4种:

  • |=:日志行包含的字符串
  • !=:日志行不包含的字符串
  • |~:日志行匹配正则表达式
  • !~:日志行与正则表达式不匹配

举个例子

{ 
   job="mysql"} |= "error"
{ 
   name="kafka"} |~ "tsdb-ops.*io:2003"
{ 
   name="cassandra"} |~  `error=\w+`
{ 
   instance=~"kafka-[23]",name="kafka"} != "kafka.server:type=ReplicaManager"

如果要进行多次匹配的话,可以像在linux用管道的方式追加规则:

{ 
   job="mysql"} |= "error" != "timeout"

三、日志度量

LogQL同样支持通过函数方式将日志流进行度量,通常可以用它来计算消息的错误率或者排序一段时间内的应用日志输出Top N

3.1 区间向量

LogQL支持有限的区间向量度量语句,使用方式和PromQL类似,常用函数主要是如下4个:

  • rate: 计算每秒的日志条目
  • count_over_time: 对指定范围内的每个日志流的条目进行计数
  • bytes_rate: 计算日志流每秒的字节数
  • bytes_over_time: 对指定范围内的每个日志流的使用的字节数

举个例子:

#计算nginx的qps
rate({ 
   filename="/var/log/nginx/access.log"}[5m]))

#计算kernel过去5分钟发生oom的次数
count_over_time({ 
   filename="/var/log/message"} |~ "oom_kill_process" [5m]))

3.2 聚合函数

LogQL也支持聚合运算,我们可用它来聚合单个向量内的元素,从而产生一个具有较少元素的新向量,当前支持的聚合函数如下:

  • sum:求和
  • min:最小值
  • max:最大值
  • avg:平均值
  • stddev:标准差
  • stdvar:标准方差
  • count:计数
  • bottomk:最小的k个元素
  • topk:最大的k个元素

聚合函数通常我们用如下表达式描述:

<aggr-op>([parameter,] <vector expression>) [without|by (<label list>)]

对于需要对标签进行分组时,可以用without或者by来区分,比如

#计算nginx的qps,并按照pod_name来分组
sum(rate({ 
   filename="/var/log/nginx/access.log"}[5m])) by (pod_name)

只有在使用bottomk和topk函数时,可以对函数输入相关的参数,比如

#计算nginx的qps最大的前5个,并按照pod_name来分组
topk(5,sum(rate({ 
   filename="/var/log/nginx/access.log"}[5m])) by (pod_name))

3.3 数学计算

Loki存的不是日志吗?都是文本怎么计算呢?显然LogQL中的数学运算还是面向区间向量操作的。LogQL中的支持的二进制运算符如下:

  • +: 加法
  • -: 减法
  • *: 乘法
  • /: 除法
  • %: 求模
  • ^: 求幂

比如要找到某个业务日志里面的错误率,就可以按照如下方式计算:

#计算日志内的错误率
sum(rate({ 
   app="foo", level="error"}[1m])) / sum(rate({ 
   app="foo"}[1m]))

3.4 集合运算

集合运算仅在区间向量范围内有效,当前支持

  • and:并且
  • or:或者
  • unless:排除

3.5 比较运算

LogQL支持的比较运算符合PromQL一样,均为以下内容:

  • ==: 等于
  • !=: 不等于
  • : 大于

  • =: 大于或等于

  • <: 小于
  • <=: 小于或等于

通常使用区间向量计算后会做一个阈值的比较,这对应告警是非常有用的,比如:

# 统计5分钟内error级别日志条目大于10的情况
count_over_time({ 
   app="foo", level="error"}[5m]) > 10

当然也可以通过布尔计算来表达,比如:

# 统计5分钟内error级别日志条目大于10为真,反正则为假
count_over_time({ 
   app="foo", level="error"}[5m]) > bool 10

今天的文章【Furion】Loki查询之LogQL语句分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/30593.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注