如何在Prometheus查询中引用记录规则值作为另一查询的过滤条件
解决方案
核心问题说明
你当前的用法存在两处核心错误:
- PromQL查询表达式的标签匹配段(大括号内部的过滤规则)不支持Go模板语法,
{{ job_cronjob:job:name}}这类写法只会被识别为普通字符串,不会解析为你定义的记录规则值。模板语法仅可用于告警规则的annotations和labels字段。 - 你定义的
job_cronjob:job:name记录规则的计算结果是时间戳数值,本身也不是CronJob生成的Job名称后缀,无法用于拼接job_name过滤条件。
正确实现方式
你不需要额外定义记录规则,直接通过PromQL的正则匹配+向量关联逻辑即可实现需求:筛选出指定CronJob生成的、最近一次调度后的失败任务。
修改后的完整PrometheusRule配置如下:
apiVersion: monitoring.coreos.com/v1 kind: PrometheusRule metadata: name: cron-job-alerts namespace: openshift-monitoring labels: openshift.io/prometheus-rule-evaluation-scope: leaf-prometheus spec: groups: - name: kube-cron rules: - alert: CronJobStatusFailed expr: | # 匹配目标CronJob生成的所有失败Job kube_job_failed{ namespace="dev-v1", condition="true", job_name=~"weekly-availability-reporting-cronjob-.*" } == 1 # 关联Job创建时间,仅保留最近一次调度后生成的Job,避免历史失败任务重复告警 * on(namespace, job_name) group_left() ( kube_job_created{namespace="dev-v1"} >= on(namespace) group_left() kube_cronjob_status_last_schedule_time{ namespace="dev-v1", cronjob="weekly-availability-reporting-cronjob" } ) for: 1m annotations: description: 'CronJob weekly-availability-reporting-cronjob 最近一次运行失败'
提示:如果你的集群指标中CronJob名称对应的标签名为
label_cronjob,将kube_cronjob_status_last_schedule_time的过滤条件中cronjob=替换为label_cronjob=即可;如果Job指标自带所属CronJob的标签,还可以直接用该标签过滤,省略job_name的正则匹配规则。
内容的提问来源于stack exchange,提问作者Whiat
相关产品推荐
相关产品推荐

