博客/社区

关于LogQL你不知道的10件事

2022年5月12日6分钟

这一期我正在进行的Grafana Loki指南系列,我想提供一些有用的——也许是令人惊讶的——关于使用LogQL (Loki的查询语言)的事实。

如果你是新来的Grafana洛基这是一个创建于2018年的日志聚合系统,Loki团队从那以后就一直与社区合作引入新功能而且让它更容易部署.LogQL在很大程度上受到PromQL的启发,PromQL是一种用于查询指标的语言普罗米修斯即广受欢迎的CNCF项目。

早在2020年,LogQL就收到了许多新的扩展,允许它提取、转换和过滤您的日志。在这篇博文中,我们将看看10个你可能不知道的功能。

1.可以使用拆封速率来计算每秒钟的样例值。

未包装的范围向量聚合是从日志行提取样本值的常用方法。通常你想用它们sum_over_timequantile_over_time范围聚合运算符。但是,速率聚合可用于计算每秒日志数,也可与未包装的范围向量一起使用,以对来自日志行的样本值进行评分。如果日志行包含计数器值,这将非常有用。注意不要使用率(…|打开)可以上升或下降的值,但只会上升的值。

例如,下面的查询对每个命名空间的订单计数进行了统计:

Sum by (namespace) (rate({cluster="dev-us-central-1"} | json | unwrap order_count[$__interval]))

与日志计数的速率不同,unwrapped速率将通过外推值计入计数器重置,就像Prometheus对counter所做的一样。

2.可以计算提取值的长度。

文本模板是LogQL结合使用的模板引擎line_format而且label_format.这门语言包含了大量我们经常忘记的有用函数——包括len,它返回变量的大小—在查询日志时非常有用。

如果你想计算在Cortex中最长的查询,试试这个:

Max_over_time ({namespace="皮质-prod", container="query-frontend"} | logfmt | label_format param_query_count= ' {{.param_query | len}} ' | unwrap param_query_count [$__interval]) by (cluster)

3.有一个新的文本/模板变量。

我们最近增加了__line__,一个用于文本/模板的新变量,将打印或输出实际的日志行。当您想修剪、添加或更改整个日志线时,这非常有用。

移除所有在日志行中,你可以使用:

{name = " query-frontend”,名称空间=“洛基”}| line_format的{{取代__line __ "\\" "" - 1}}’

4.多个解析器是一个选项。

如果LogQL中的解析器解析失败,它们实际上不会过滤数据。这意味着,如果您想从不同的格式进行提取,那么实际上可以在同一个查询中包含多个解析器。

例如,在《洛基》中我们有这样的日志线:

level=debug ts= 22-03-15t10:06:21. 308662138z caller=logging。go:67 traceID=7acfb2b833acb3e2 orgID=29 msg="GET /loki/api/v1/query_range? "start=1647337422075409296&end=1647337442075409296&query=% 7Bstream%3D%22stdout%22%2Cpod%3D% 22lo基- canole -x672l%22%7D&limit=1000 (200) 27.806027ms"

如果希望解析请求信息(方法、状态、持续时间),可以组合使用logfmt模式解析器如下所示:

{name="query-frontend", namespace="loki-ops"} |= "logging. log . "= "gRPC" | logfmt | line_format ' {{. go" !味精}}|模式的<法> < _ >(< >状态)<时间> '

正如您所看到的,诀窍是使用您想要解析的下一个属性来更改日志行line_format

5.可以用距离向量聚合进行分组。

在Prometheus中,范围向量聚合不允许分组通过而且没有;然而,这在Loki中是可能的——有些查询在其他情况下是无法表达的。

例如,如果您想获得每个方法和状态的第99个分位数的延迟,您就不能用by(方法,状态)的和包装分位数,因为延迟分位数不能被求和。然而,你可以直接对分位数使用分组,如下图所示,以达到正确的结果:

Quantile_over_time (0.99, {name="query-frontend", namespace="loki-ops"} |= "logging. log . "执行" | logfmt | line_format '{{。Msg}} ' | pattern '  <_> ()  ' | unwrap duration(duration) | __error__=""[$__interval]) by (method,status)

这对于大多数范围向量聚合也是正确的,除了那些可以求和的,如速率、计数超时时间等。

6.有字节和持续时间标签过滤器。

一旦解析了新的标签,它们就可以用于进一步的过滤使用标签过滤器.这些过滤器的优点是,它们可以使用表达式的字面分支来推断类型。

例如,像下面这样的查询将过滤延迟高于5秒和字节吞吐量低于4gb的请求。

{container="query-frontend"} |= "metrics. "| logfmt | duration >= 5s或吞吐量< 4GB

7.您可以重新格式化日志行。

有时屏幕上的日志很难阅读。洛基line_format它不仅可以帮助您过滤内容,还可以以更可读的方式重新格式化日志行。

我使用这个查询来删除双退格,但也从日志行(使用t),并限制.query变量为100个字符。

{name="query-frontend", namespace="loki"} |= "metrics. "走”| logfmt | label_format查询= "{{取代.query \“\ \ n \ \“\”1}}”| line_format”{{.ts}} {{\ t。\ttraceID = {{. duration}}\traceID}}\t{{ printf \"%100s\" .query }}"
重新格式化了Grafana Loki的日志线

8.有IP过滤。

如果您正在使用网络设备或只是记录ip,这是为您准备的。

我们最近增加了IP过滤在Loki中,虽然技术上,你已经可以使用正则表达式,IP过滤器支持更多的用例,如IP v6, CIDR匹配,范围等。

下面的查询将返回与给定IP范围不匹配的日志。

{job_name =“myapp”}! = ip(“192.168.4.5-192.168.4.20”)

9.你可以在日志里加入表情符号。

Loki和Grafana支持任何UTF-8字符的组合line_format,这可以帮助你创建漂亮的可视化。

在你所有的请求前加上状态表情,试试这个:

{name="query-frontend", namespace="loki-ops"} |= "logging. log . "= "gRPC" | logfmt | line_format ' {{. go" !味精}}’|模式  `<_> <_> (< 状态 >) <_>` | line_format的{{如果情商.status " 500 "}}❌{{其他}}✅{{结束}}{{__line__}}’
在《格拉夫娜·洛基》中添加表情符号

10.数组值可以用JSON访问。

默认情况下,JSON解析器将自动从JSON文档中提取所有可能的属性。但是,它有意跳过数组。如果希望访问此数据,可以使用JSON解析器的另一种变体接受参数。

要从JSON数组中提取第一个服务器,你可以使用这个查询:

{app="infrastructure"} | json first_server="servers[0]"

额外的好处:您可以在LogQL中注释。

最后但同样重要的是,你可以使用而且/ * * /分别注释查询中的一行或多行。这在排除查询故障时非常有用。

在Grafana Loki的LogQL中注释

我希望这些建议对你有用!有关LogQL的更多信息,请访问我们的LogQL文档页面

您也可以参加我们的“用Grafana Loki缩放和保护你的日志在5月19日的网络研讨会上。今天注册免费!

最简单的开始方式Grafana洛基Grafana云.我们对每个用例都有一个慷慨的免费永久层bob体育手机二维码和计划。现在就免费注册