为何PromQL表达式{__name__ =~ ".*"}报错,{__name__ =~ ".+"}却合法?
PromQL中{name =~ ".*"}报错而{name =~ ".+"}合法的原因
执行PromQL表达式{__name__ =~ ".*"}时会触发如下错误:
执行查询出错:参数“query”无效:1:1:parse error:vector selector must contain at least one non-empty matcher
而{__name__ =~ ".+"}却能正常查询,核心原因在于正则匹配逻辑差异和Prometheus的校验规则:
正则匹配的本质区别
.*匹配零个或多个任意字符,这意味着它会把空字符串纳入匹配范围。但Prometheus中所有合法指标的__name__(指标名称)都不可能是空值,这个匹配器相当于允许了不存在的空指标名,触发了校验报错。.+匹配至少一个任意字符,刚好对应Prometheus指标名非空的要求,只会匹配实际存在的有效指标。
Prometheus的向量选择器校验逻辑
Prometheus在解析向量选择器时,会强制检查每个匹配器是否能筛选出至少一个合法的非空标签值。.*因为允许空值存在,不符合这个校验规则,所以被判定为无效匹配器;而.+确保只匹配非空的指标名,顺利通过了校验。
内容的提问来源于stack exchange,提问作者Sudhakar MNSR
相关产品推荐
相关产品推荐

