如何在另一个 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 查询中引用查询值的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Prometheus 中一次调用执行多个查询

如何在 Prometheus 查询中设置返回样本频率?

如何在 Prometheus 查询中对标签进行分组?

如何使用 Prometheus 查询不同的 mySQL 数据库进行业务监控

如何在 Prometheus 中每小时正确抓取和查询指标

如何查询 Prometheus 中所有具有特定标签值的时间序列?