如何在Prometheus中以时间单位创建警报?如“最近2分钟的平均响应时间超过5秒”

时间:2020-05-18 08:03:46

标签: prometheus prometheus-alertmanager

  - name: app
    rules:
      - alert: ServerHighLatency
        expr: sum by(applicationName) (rate(http_server_requests_seconds_sum{status!~"4..|5.."}[1m]))/sum by(applicationName) (rate(http_server_requests_seconds_count{status!~"4..|5.."}[1m])) >= 5s
        for: 5s
        labels:
          severity: critical
        annotations:
          summary: "{{ $labels.applicationName }} is responding with high latency(5s+)"
          description: "*Host*: {{ $labels.node }}\n*Datacenter*: {{ $labels.datacenter }}\n*Value*: {{ humanize $value }}\n"

但是我在表达式的最后一个s周围遇到了解析错误,因此我认为这是不允许的。当我删除s时,它可以工作,但永远不会触发。我找不到警报示例来检查某个范围内的平均响应时间,而只能按值进行比较,例如“某个百分位数> 0.8”,而没有时间单位。是否有意义?

旁注:{{ $labels.datacenter }}{{ $labels.node }}不能工作,但是{{ $labels.applicationName }}可以工作,为什么?在哪里可以找到Prometheus中一些好的警报语法示例和文档?

2 个答案:

答案 0 :(得分:1)

您不需要(无法准确地)将单位添加到表达式中,只需将数字添加到表达式中即可。如果您的警报从未触发,则表达式可能有问题,或者结果始终小于5。是否在Prometheus控制台中测试了表达式?

答案 1 :(得分:0)

关于“标签未显示”的便笺:

如果使用Prometheus表达式控制台(在/graph下),我们将看到结果中包含的所有标签,以便进行快速调试。

如果我sum(rate(foo([1m]))/sum(rate(bar([1m])),我会看到:

enter image description here

但是如果我使用sum by(tag1, tag2, tag3),我可以在结果中看到标签:

enter image description here

然后,标记的值在最后的annotation部分不再为空:

    rules:
      - alert: HighLatency
        expr: sum by(productName,instance,datacenter) (rate(http_server_requests_seconds_sum{status!~"4..|5.."}[1m]))/sum by(productName,instance,datacenter) (rate(http_server_requests_seconds_count{status!~"4..|5.."}[1m])) >= 5
        for: 5s
        labels:
          severity: critical
        annotations:
          summary: "{{ $labels.productName }} is responding with high latency(5s+)"
          description: "*Instance*: {{ $labels.instance }}\n*Datacenter*: {{ $labels.datacenter }}\n*Value*: {{ humanize $value }}\n"

我可以在Slack频道中看到它们。