使用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即可。
原方案问题分析
方案一
(^/(?:[[a-zA-Z0-9_-]+/?){0,2})- 存在语法错误(双重
[[) - 字符集仅包含
[a-zA-Z0-9_-],但匹配逻辑是整段匹配,导致包含%等特殊字符的路径(如/a%)无法触发匹配 - 结尾的
/?会保留路径末尾的斜杠,不符合需求
- 存在语法错误(双重
方案二
(.*?/.*?){0,2}/.*- 正则逻辑是匹配包含至少两个斜杠的完整路径,而非捕获需要的分段内容
- 对于仅含一个斜杠的路径(如
/a),无法匹配,因此无法捕获有效内容
内容的提问来源于stack exchange,提问作者Arsxy
相关产品推荐
相关产品推荐

