LogQL:日志查询语言
LogQL Grafana洛基的PromQL-inspired查询语言。如果他们是分布式查询作为grep
总日志来源。LogQL使用标签和运营商进行过滤。
有两种类型的LogQL查询:
二元操作符
算术运算符
在洛基二进制算术运算符存在如下:
+
(添加)- - - - - -
(减法)*
(乘法)/
(部门)%
(模)^
(能力/取幂)
二进制算术运算符被定义在两个文本(标量),文字和一个向量,两个向量。
两个文本之间,这种行为很明显:他们评估另一个文字,是运营商的结果应用于标量操作数(1 + 1 = 2
)。
一个向量和一个文字,运营商之间的值应用于每个数据样本的向量,例如如果一个时间序列向量乘以2,结果是另一个向量,每个样本值的原始矢量乘以2。
两个向量之间的二进制算术操作符应用于每个条目在左边向量及其匹配的元素在右手向量。结果是传播与分组结果向量标签成为输出标签设置。没有匹配条目的条目在右手向量可以找到不结果的一部分。
特别注意<一个href="#order-of-operations">操作顺序一个>当链接算术运算符。
算法的例子
用一个简单的查询:实现一个健康检查
1 + 1
一个日志流率的两倍的条目:
sum(率({应用= " foo "} [1 m])) * 2
得到比例的警告日志错误日志喷火
应用程序
sum(率({应用= " foo ",水平=“警告”}[1 m])) /笔(率({应用=“foo”,水平=“错误”}[1 m]))
逻辑,运营商
这些逻辑/设置二元操作符只有两个向量之间的定义:
和
(十字路口)或
(工会)除非
(补充)
vector1和vector2
导致vector1的元素组成的一个向量的元素在vector2完全匹配标签集。其他元素。
vector1或vector2
结果在一个向量包含所有原始元素vector1(标签集+值),另外所有元素的vector2 vector1没有匹配的标签集。
vector1除非vector2
结果组成的向量元素的vector1没有元素vector2与完全匹配标签集。所有匹配的元素在这两个向量都下降了。
二元操作符的例子
这种人为的查询将返回这些查询的交集,有效率({应用= "栏"})
:
率({应用= ~“foo | bar”}[1])和速度({应用=“酒吧”}[1 m])
比较运算符
= =
(平等)! =
(不平等)>
(大于)> =
(大于或等于)<
(小于)< =
(小于或等于)
比较运算符之间定义标量/标量,矢量/标量和矢量/值对。默认情况下他们过滤器。他们的行为可以通过提供修改bool
操作后,将返回0或1的值而不是过滤。
两个标量之间,这些操作符导致另一个标量,要么是0(假)或1(真),根据比较结果。的bool
修饰符必须不被提供。
1 > = 1
相当于1
矢量和标量,这些操作符的值应用于每个数据样本的向量,向量元素之间的比较结果是假从结果向量得到下降。如果bool
修饰符,向量的元素将会下降而不是值0和向量元素,保持价值1。
过滤器的流记录在最后一分钟至少10行:
count_over_time ({foo =“酒吧”}[1 m]) > 10
附加价值(年代)0
/1
少流,记录/超过10行:
count_over_time ({foo =“酒吧”}[1 m]) > bool 10
两个向量之间,这些运营商的行为作为一个过滤器在默认情况下,应用于匹配条目。向量元素的表达是不正确的或者不找到一个匹配的另一边表达得到下降的结果,而其他结果传播到向量。如果bool
修饰符,向量的元素会被撤销而不是值0和向量元素,保持值1,分组标签再次成为输出标签集。
返回流匹配应用= foo
没有应用程序标签的数量在最后一刻比同行高匹配应用=酒吧
没有应用程序标签:
和没有(app) (count_over_time({应用=“foo”} [1 m])) >和没有(app) (count_over_time({应用=“酒吧”}[1 m]))
同上,但向量的值设置为1
如果他们通过比较或0
如果他们不/否则将被过滤掉:
和没有(app) (count_over_time({应用=“foo”} [1 m])) > bool和没有(app) (count_over_time({应用=“酒吧”}[1 m]))
订单的操作
链接或结合运营商时,你必须考虑运算符优先级:一般来说,你可以假设定期<一个href="https://en.wikipedia.org/wiki/Order_of_operations" target="_blank" rel="noopener noreferrer">数学大会一个>与运营商在同一优先级被left-associative。
可以发现更多细节<一个href="https://golang.org/ref/spec" target="_blank" rel="noopener noreferrer">Golang语言文档一个>。
1 + 2 / 3
等于1 + (2、3)
。
2 * 3% 2
评估是(2 * 3)% 2
。
关键字和忽视
的忽略
在匹配关键字使指定的标签被忽略。语法:
<向量expr > < bin-op >忽略(<标签>)<向量expr >
这个例子将返回的机器总数在最后一分钟内超过平均值的应用喷火
。
马克斯(机器)(count_over_time({应用=“foo”} [1 m])) > bool忽略(机)avg (count_over_time({应用=“foo”} [1 m]))
在关键字减少认为标签指定列表的集合。语法:
<向量expr > < bin-op >(<标签>)<向量expr >
这个例子将返回每台机器总数在最后一分钟内比例应用喷火
:
(机)和(count_over_time({应用=“foo”} [1 m])) /在()和(count_over_time({应用=“foo”} [1 m]))
多对一、一对多向量匹配
多对一、一对多匹配时每个向量元素的“一”一边与多个元素可以匹配“许多”一面。您必须显式地请求匹配使用group_left或group_right修饰符,在左边或右边确定哪些向量基数越高。语法:
<向量expr > < bin-op >忽略(<标签>)group_left(<标签>)<向量expr > <向量expr > < bin-op >忽略(<标签>)group_right(<标签>)<向量expr > <向量expr > < bin-op >(<标签>)上group_left(<标签>)<向量expr > <向量expr > < bin-op >(<标签>)上group_right <向量expr >(<标签>)
该集团提供的标签列表修改器包含额外的标签从“一”包含在结果方面指标。和一个标签应该只出现在一个指定的列表在
和group_x
。每次的结果向量必须标识。分组修饰词只能用于比较和算术。默认情况下,系统匹配和
,除非
,或
操作与所有条目在正确的向量。
下面的例子返回请求分割的利率应用程序
和状态
占总请求。
总和(应用程序、地位)(率({工作=“http服务器”}| json(5米)))/ (app) group_left和上(app)(率({工作=“http服务器”}| json(5米)))= >[{应用=“foo”状态= " 200 "}= > 0.8{应用=“foo”状态= " 400 "}= > 0.1{应用=“foo”状态= " 500 "}= > 0.1)
使用这个版本group_left(<标签>)
包括<标识>
右手边的结果并返回丢弃事件每用户成本,组织,和名称空间:
(用户名称空间)和(率({工作=“事件”}| logfmt |丢弃= " true " [5 m])) *(用户)上group_left(组织)max_over_time({工作=“开销计算器”}| logfmt |打开成本[5 m])通过(用户、组织)= >[{用户=“foo”,名称空间=“开发”,组织= " little-org "} = > 10{用户=“foo”,名称空间=“刺激”,组织= " little-org "} = > 50{用户=“酒吧”,名称空间=“开发”,组织= " big-org "} = > 70{用户=“酒吧”,名称空间=“刺激”,组织= " big-org "} = > 200)
评论
LogQL查询可以使用评论#
性格:
{应用= " foo "} #后,不会被你的查询
使用多行LogQL查询,查询解析器可以排除全部或部分使用#
:
{应用= " foo "} | json #这条线将被忽略|栏=“巴兹”#这检查栏=“记者”
管道的错误
有多种原因导致管道处理错误,如:
- 数字标签过滤器可能无法将标签值转变成一个数字
- 一个度量转换标签可能会失败。
- 一个日志行不是一个有效的json文档。
- 等…
当这些失败发生,洛基不会过滤掉这些日志。他们被传递到下一个阶段的新系统标签命名管道__error__
。过滤掉错误的唯一方法就是通过使用标签筛选器表达式。的__error__
通过语言标签不能被重命名。
例如将json错误:
{集群= " ops-tools1 ",容器=“ingress-nginx”} | json | __error__ ! =“JSONParserErr”
或者你可以删除所有错误使用捕获所有匹配器等__error__ = " "
甚至只显示错误使用__error__ ! = " "
。
过滤器应放置在生成阶段,这个错误。这意味着如果您需要删除错误的打开表达式打开后需要放置。
quantile_over_time(0.99,{容器= " ingress-nginx ",服务=“hosted-grafana”} | json |打开response_latency_seconds | __error__ = "[1]),(集群)
度量查询不能包含错误,如果在执行过程中发现错误,洛基将返回一个错误和适当的状态码。
功能
洛基支持函数来操作数据。
label_replace ()
为每个timeseries在v
,
label_replace (v instant-vector dst_label字符串替换字符串,src_label字符串,正则表达式字符串)
匹配正则表达式正则表达式
对标签src_label
。如果匹配,那么的timeseries返回标签dst_label
取而代之的扩张更换
。
1美元
被替换为第一个匹配的子群,2美元
与第二等等。如果不匹配的正则表达式,然后返回timeseries不变。
这个例子将返回一个与每个时间序列有一个向量喷火
标签的值一个
添加:
label_replace(率({工作= " api-server ",服务= " c:} | =“犯错”[1]),“foo”、“$ 1”、“服务”、“(. *):*”)。