如何在另一个 Prometheus 查询中引用查询值
Posted
技术标签:
【中文标题】如何在另一个 Prometheus 查询中引用查询值【英文标题】:How to reference query values inside another Prometheus query 【发布时间】:2022-01-03 03:01:05 【问题描述】:我正在尝试创建一个规则,它将作为记录规则的过滤器输出。
我创建了一个警报规则,用于监控最近的 cronjob 是否失败。 我使用重新编码规则来获取 cronjob 的最后一次运行的时间,并希望使用该值来过滤掉失败状态设置太真实的作业。我尝试了几件事,但接缝好像我无法在下一个查询中引用记录的值。
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:
- record: job_cronjob:job:name
expr: |
kube_cronjob_labelsnamespace="dev-v1", label_cronjob="weekly-availability-reporting-cronjob" * on() kube_cronjob_status_last_schedule_timenamespace="dev-v1"
- alert: CronJobStatusFailed
expr: |
kube_job_failednamespace="dev-v1",condition="true", job_name="weekly-availability-reporting-cronjob- job_cronjob:job:name"==1
# for: 1m
annotations:
description: 'Attempt 1'
有人知道如何在表达式过滤器中正确引用 job_cronjob:job:name 值吗?
【问题讨论】:
【参考方案1】:你不能,警报规则只允许 templating 出现在标签和注释值中,但不允许出现在警报表达式中。
一般情况下,我不会通过名称确定您想要提醒的作业,而只需这样做:
- alert: CronJobStatusFailed
expr: kube_job_failednamespace="dev-v1", condition="true" == 1
annotations:
description: Job $labels.job_name failed.
这样,每当作业失败时,您都会收到警报,包括每次执行 CronJob。
【讨论】:
感谢您的回答。不幸的是,不能在表达式中使用模板。我想确保我只检查最后运行的作业的状态。我相信你分享的表达方式也有效,但它需要将失败工作的历史限制为一个。我想。 是的,每个失败的作业都会有警报,而不仅仅是最后一个。我不知道是否有一种简单的方法可以只选择 CronJob 的最后一个失败的作业。 我已经快速对其进行了测试,限制历史记录会有所帮助,但是当下一个作业成功时,警报仍然会触发。如果后续工作成功完成,我将需要以某种方式确保警报得到解决。 您可以将警报路由到 Alertmanager 中的自定义 webhook receiver,它会在一定时间后删除失败的作业,例如等于 CronJob 间隔。这样,当下一个作业开始时,每个警报都会自动解决。以上是关于如何在另一个 Prometheus 查询中引用查询值的主要内容,如果未能解决你的问题,请参考以下文章