You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用RE2正则移除第N个斜杠后内容及查询参数的Prometheus问题

使用RE2正则处理Prometheus http_path标签:保留前N个有效分段并移除查询参数

需求明确

针对Prometheus的http_path标签,需要实现:

  • 移除所有查询参数(?及之后的全部内容)
  • 路径分段仅保留[a-zA-Z0-9_-]组成的有效部分(如/a%处理为/a)
  • 保留前N个有效分段(示例中N=2,即最多保留两段,如/a/b/c处理为/a/b)
  • 自动移除分段结尾的斜杠(如/a/b/处理为/a/b)
  • 根路径/保留为/

解决方案(N=2时)

在Prometheus的label_replace函数中使用以下RE2正则:

label_replace(your_metric, "http_path_grouped", "$1$2", "http_path", "^(/(?:[a-zA-Z0-9_-]+)?)(?:/([a-zA-Z0-9_-]+))?(?:/.*|\\?.*)?$")

正则拆解

  • ^(/(?:[a-zA-Z0-9_-]+)?):捕获根斜杠,可选跟随第一段有效字符(如/或/a)
  • (?:/([a-zA-Z0-9_-]+))?:可选捕获第二段有效字符(如/b),非捕获组包裹避免干扰整体匹配
  • (?:/.*|\\?.*)?:匹配并忽略后续的路径内容或查询参数,不参与捕获

测试验证

针对示例输入,执行后结果完全符合预期:

输入路径输出结果
/a/a
/a/b/c/a/b
/a/b/a/b
/a/b//a/b
/a?query=true/a
/a/b/c?query=true/a/b
/a%/a
//

调整N值

如果需要保留前N个分段,只需扩展捕获组数量:

  • N=3时,正则修改为:
    ^(/(?:[a-zA-Z0-9_-]+)?)(?:/([a-zA-Z0-9_-]+))?(?:/([a-zA-Z0-9_-]+))?(?:/.*|\\?.*)?$
    
    替换字符串改为$1$2$3即可。

原方案问题分析

  1. 方案一(^/(?:[[a-zA-Z0-9_-]+/?){0,2})

    • 存在语法错误(双重[[)
    • 字符集仅包含[a-zA-Z0-9_-],但匹配逻辑是整段匹配,导致包含%等特殊字符的路径(如/a%)无法触发匹配
    • 结尾的/?会保留路径末尾的斜杠,不符合需求
  2. 方案二(.*?/.*?){0,2}/.*

    • 正则逻辑是匹配包含至少两个斜杠的完整路径,而非捕获需要的分段内容
    • 对于仅含一个斜杠的路径(如/a),无法匹配,因此无法捕获有效内容

内容的提问来源于stack exchange,提问作者Arsxy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 09:20:13