PromQL类WHERE子句实现方法 按namespace筛选Kubernetes监控查询
报错核心原因
之前的查询触发解析错误,是因为对PromQL ON 操作符的语法规则理解有误:
ON是PromQL二元向量匹配的关键字,后面必须紧跟 括号包裹的匹配维度列表,不能用花括号直接写标签选择器ON本身无法单独实现过滤,必须搭配左右两侧的向量序列完成匹配运算,缺少作为过滤依据的向量序列时必然触发解析错误
可直接使用的实现方案
PromQL实现类WHERE的标签过滤效果,有两种写法可以精准满足筛选仅default、jenkins两个命名空间正常运行应用的需求:
方案1:源头过滤(性能最优,优先推荐)
直接在基础指标up的选择阶段嵌入namespace白名单规则,从计算源头就排除非目标命名空间的冗余序列,不需要额外做向量匹配运算,查询效率最高。
100 * ( count(up{namespace=~"default|jenkins"} == 1) BY (job, namespace, service) ) > 1
- 语法说明:
=~是PromQL正则匹配运算符,用竖线分隔需要保留的命名空间,实现多值白名单筛选 - 执行效果:最终返回结果仅包含
{job="apiserver", namespace="default", service="kubernetes"}、{job="jenkins", namespace="jenkins", service="jenkins"}两个目标序列,完全剔除monitor、kube-system等其他命名空间的冗余监控结果
方案2:聚合后二次过滤
如果需要保留全量聚合的计算逻辑,等聚合计算完成后再做结果筛选,可以修正之前尝试的AND + ON写法,正确语法结构如下:
100 * ( count(up == 1) BY (job, namespace, service) ) > 1 # 按照namespace维度做关联匹配过滤 AND ON(namespace) (namespace=~"default|jenkins")
- 语法说明:
ON(namespace)表示前后两段向量按照namespace标签做关联匹配,括号内填写参与关联的维度列表,修正之前ON后接花括号的语法错误- 后段括号内的序列是作为过滤依据的白名单,只有当聚合结果的
namespace值匹配白名单规则时,才会被最终返回
叠加「运行时长超过1分钟」的筛选逻辑
如果需要落实最初提到的、仅保留运行时长超过1分钟应用的要求,只需要在现有查询逻辑中叠加启动时间判断即可:
100 * ( count(up{namespace=~"default|jenkins"} == 1) BY (job, namespace, service) ) > 1 # 叠加运行时长判断:当前时间减去Pod启动时间大于60秒 AND ON(namespace, job, service) ( time() - kube_pod_start_time > 60 )
内容的提问来源于stack exchange,提问作者Hammed
相关产品推荐
相关产品推荐

