Prometheus label_replace正则匹配IOS类sysDescr标签失败问题
问题根因分析
基础规则说明
PromQL 的 label_replace 函数使用的正则默认完全匹配整个标签值(等价于自动在正则首尾加了 ^ 和 $ 锚定符),只有整个 sysDescr 标签值完全符合正则规则时,才会捕获分组生成新的 software 标签;匹配失败不会导致指标消失,只是不会新增目标标签。
核心故障原因
你遇到的现象(甚至改正则为 (.*) 都无法匹配第二条)主要有两个常见原因:
- 第二条指标的
sysDescr标签值包含换行符/回车符
Prometheus 内置的 RE2 正则引擎默认关闭 dotall 模式,.不会匹配换行符。如果标签值里有换行,.*只能匹配到换行前的内容,无法覆盖整个标签值,最终全值匹配失败。
你最初写的正则Cisco (IOS|NX-OS).*也会因为换行的存在,无法覆盖标签值的全部内容,导致第二条匹配失败。 - 查询时附加了
software标签的过滤规则
如果你在label_replace之后额外加了{software=~".+"}这类要求software标签存在且非空的过滤条件,匹配失败的指标会被直接过滤,自然看不到第二条样本。
修复方案
- 先确认标签实际值:直接查询原始指标(不加
label_replace逻辑),在 Prometheus UI 中复制第二条指标的sysDescr标签值,确认是否存在前导空格、换行、不可见控制字符。 - 调整正则适配换行场景:将正则修改为
".*Cisco (IOS|NX-OS)[\\s\\S]*",[\\s\\S]可以匹配所有字符包括换行,只要标签值中包含对应关键字就能匹配成功。 - 调试阶段去掉额外过滤:测试时直接执行
label_replace语句不加额外标签过滤,确认第二条指标返回后再按需添加过滤规则。
内容的提问来源于stack exchange,提问作者Peder Zickler
相关产品推荐
相关产品推荐

