如何使Prometheus警报描述同时给出比率和绝对数字?

时间:2019-06-18 17:54:38

标签: alert prometheus prometheus-alertmanager

我目前有一个Prometheus警报,当我的成功率下降到85%以下时会触发。

我想将比率的绝对数字添加到警报描述中。我该怎么办?

我的YAML当前看起来像这样(我清理了一些无关的细节):

groups:
  - name: recording_rules
    rules:
    - record: number_of_successes_24h
      expr: avg(sum by(instance)(my_status{kubernetes_name="my-prom",timeRange="1d",status=~"success"}))
    - record: number_of_total_24h
      expr: avg(sum by(instance)(my_status{kubernetes_name="my-prom",timeRange="1d"}))
    - record: success_rate_24h
      expr: clamp_max(number_of_successes_24h / number_of_total_24h * 100, 100)

  - name: alerting_rules
    rules:
    - alert: LowSuccessRate24H
      expr: success_rate_24h < 85
      labels:
        severity: critical
      annotations:
        summary: "CRITICAL: Low success rate 24h"
        description: "Success rate in the last 24 hours went below 85% (value: {{ $value }}%)"

我的问题是,如何在说明中添加number_of_successes_24hnumber_of_total_24h
我在https://prometheus.io/docs/prometheus/latest/configuration/alerting_rules/阅读了官方文档,但迷路了;我搜索了SO,但没有找到任何相关内容。

我读到$labels中还有其他详细信息,因此我尝试打印该示例以查看其中的内容,但是我得到了map[__name__:success_rate_24h],但我不知道该怎么做。看看里面的东西。

欢迎部分答案和指南。谢谢。

1 个答案:

答案 0 :(得分:3)

这是我的TasksMissing警报的简化版本,它在摘要中输出缺少的任务数,任务总数和受影响的实例:

  - alert: TasksMissing
    expr: |
      job_env:up:ratio < .7
    for: 2m
    labels:
      severity: warning
    annotations:
      summary: Tasks missing for {{ $labels.job }} in {{ $labels.env }}
      description:
       '{{ with printf `job_env:up:count{job="%s",env="%s"} - job_env:up:sum{job="%s",env="%s"}` $labels.job $labels.env $labels.job $labels.env | query }}
          {{- . | first | value -}}
        {{ end }}
        of
        {{ with printf `job_env:up:count{job="%s",env="%s"}` $labels.job $labels.env | query }}
          {{- . | first | value -}}
        {{ end }}
        {{ $labels.job }} instances are missing in {{ $labels.env }}:
        {{ range printf `up{job="%s",env="%s"}==0` $labels.job $labels.env | query }}
          {{- .Labels.instance }}
        {{ end }}'

预期结果描述类似于“ prod中缺少3个foo服务实例中的2个:foo01.prod.foo.org:8080 foo02.prod.foo.org:8080”。

这个想法是,您可以使用Go模板来生成查询(通过使用$labels用来自printf的值填充模板),然后将其通过管道传送到Prometheus-defined query function中,并返回一个结果(您可以使用with处理)或多个值(您可以使用range进行迭代)。然后,您可以直接打印时间序列值或某些标签(例如实例名称)。