普罗米修斯与正则表达式查询不匹配

Posted

技术标签:

【中文标题】普罗米修斯与正则表达式查询不匹配【英文标题】:prometheus doesn't match regex query 【发布时间】:2019-07-15 17:58:07 【问题描述】:

我正在尝试在 grafana 中编写一个 prometheus 查询,它将选择 visits_totalroute!~"/api/docs/*"

我想说的是,它应该选择路由与/api/docs/*(正则表达式)不匹配的所有实例,但这不起作用。它实际上只是选择所有实例。我试图通过这样做来强制它选择其他人: visits_totalroute=~"/api/order/*" 但它不返回任何东西。我在prometheus的查询基础page中找到了这些运算符。我在这里做错了什么?

【问题讨论】:

可能是因为您在正则表达式中有/。试试visits_totalroute=~".*order.*" 【参考方案1】:

可能是因为您在正则表达式中有/。尝试使用 visits_totalroute=~".*order.*" 之类的东西,看看是否生成了结果。

也试试这个,

visits_totalroute!~"\/api\/docs\/\*"

如果你想排除所有带有docs这个词的东西,你可以在下面使用,

visits_totalroute!~".*docs.*"

【讨论】:

第一个选项有效,但第二个选项出错。我宁愿只排除文档,也不愿手动包含我想要的所有内容。 @ninesalt 您可能还需要转义 *。检查更新的答案。 谢谢。这行得通。我不需要逃避 *.我想排除两件事,所以我就这样做了route!~".*docs.*|.*metrics.*" 我想添加一个文档链接:prometheus.io/docs/prometheus/latest/querying/examples,我想强调一下这句话:“Prometheus 中的所有正则表达式都使用 RE2 语法。”【参考方案2】:

原始查询的主要问题是/api/docs/* 只会匹配/api/docs/api/docs////// 之类的内容;即查询中的 * 将匹配 0 个或多个 / 字符。

我想你的意思是/api/docs/.*

【讨论】:

以上是关于普罗米修斯与正则表达式查询不匹配的主要内容,如果未能解决你的问题,请参考以下文章

Grafana - 在查询中使用自定义变量作为正则表达式

以任何顺序匹配查询中的所有单词的正则表达式

正则表达式将带连字符的单词与无连字符的查询匹配

Nginx中的正则如何匹配数字

promql查询表达式

mysql 正则表达式 查询匹配 某个词