LogQL - label_format 有条件地格式化标签

Posted

技术标签:

【中文标题】LogQL - label_format 有条件地格式化标签【英文标题】:LogQL - label_format conditionally format a label 【发布时间】:2021-09-26 23:36:16 【问题描述】:

我有一个日志流,从中提取一组要设置为标签或指标值的字段。流不是标准格式,所以我使用正则表达式管道命令提取字段,如下所示。

(...)
 | regexp "(?P<api>\\w+)\\sAPI"
 | regexp "\\[performed\\.(?P<action>\\w+)"
 | regexp "duration\\s\\[(?P<duration_ms>\\d+)"
 | regexp "response \\[(?P<response>.*?)\\]"

问题是 api 捕获的字段在某些交互中没有被填充,我想更新这些情况,以便设置默认值 - 用于演示目的。

我已经尝试使用本机 LogLQ 的 contains 和 hasPrefix 模板命令,因为文档表明它们可以与 if else 块一起使用。文档不清楚如何在label_formatline_format 管道命令中构建这些块。但根据方法,它要么返回格式错误,要么不执行任何操作。

一个工作示例将不胜感激。 谢谢。

注意:尝试将此标记为 LogQL 主题,但没有足够的声誉。

【问题讨论】:

在这个问题上运气好吗?我也会感兴趣的。 我实施的解决方法是在稍后的处理阶段执行此操作。我通过 label_replace 函数实现了聚合后的逻辑。它允许正则表达式替换。我对解决方法并不完全满意。我会试试你的方法。 【参考方案1】:

我相信我已经得到了与line_format 合作的东西:

environment=~"$environment",level=~"$level" | json | line_format " if hasSuffix `Exception` .thrown_name   Exception occurred! end .message" |~ "(?i)$grep"

反引号的文档很难找到,方法参数的顺序也有点不同。希望这会有所帮助?

【讨论】:

感谢您的回复。通过您的回复,我能够弄清楚如何按照我需要的方式进行这项工作。请看下面我的回答【参考方案2】:

通过@AnthonyA 的回复,我能够在提取字段后使用label_format 模板函数修改其值。

 (..)
 | regexp "response \\[(?P<response>.*?)\\]"
 (..)
 | label_format api=` if hasPrefix "Error" .response ERRORelse.responseend`
 (..)

这样,如果字段的值以“Error”开头,则该字段的值将替换为ERROR,否则保持其原始值。

【讨论】:

以上是关于LogQL - label_format 有条件地格式化标签的主要内容,如果未能解决你的问题,请参考以下文章

LogQL 中的 Topk 值

是否可以在 LogQL 中将字符串值转换为数字?

Grafana/Loki:如何在 LogQL 中使用多选模板变量?

Grafana Loki LogQL:过滤图例值

LogQL 中的正则表达式 JSON 过滤

通过正则表达式 logql 提取 loki ingress-nginx 标签