作者:csz

原文: 点我

Question

Prometheus 可以使用 $value 变量将当前告警规则表达式的数值输出到告警信息里。但是有些浮点数值位数相当长,非常不便于阅读,对于强迫症患者来说更是不可接受的。

如何让告警数值变得 “人类可读” 呢?

Answer

有如下告警规则,对网卡流量进行监控,流量超过 200MB/s 且持续 1 分钟以上则发送告警:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
- name: network_receive.rules
  rules:
  - alert: 网卡接收流量异常
    expr: irate(node_network_receive_bytes_total{device!~"lo|qb.*|qv.*|tap.*"}[5m])/1024/1024 > 200
    for: 1m
    labels:
      severity: warning
    annotations:
      summary: "{{$labels.instance}} {{$labels.device}} 网卡接收流量异常"
      description: "{{$labels.instance}} {{$labels.device}} 流量 {{$value}}MB/s"

- name: network_transmit.rules
  rules:
  - alert: 网卡流出流量异常
    expr: irate(node_network_transmit_bytes_total{device!~"lo|qb.*|qv.*|tap.*"}[5m])/1024/1024 > 200
    for: 1m
    labels:
      severity: warning
    annotations:
      summary: "{{$labels.instance}} {{$labels.device}} 网卡流出流量异常"
      description: "{{$labels.instance}} {{$labels.device}} 流量 {{$value}}MB/s"

微信通知告警模板

1
2
3
4
5
{{ define "wechat.html" }}{{ range $i, $alert := .Alerts.Firing }}
[报警名称]: {{ index $alert.Labels "alertname" }}
[报警明细]: {{ $alert.Annotations.description }}
[开始时间]: {{ $alert.StartsAt.Format "2006-01-02 15:03:05" }}
{{ end }}{{ end }}

当流量超过 200MB/s 时,触发了告警通知。

微信收到的告警通知信息,可以看到流量数值的小数点后长达 10 几位:

1
2
3
[报警名称]: 网卡接收流量异常
[报警明细]: nova26 bond0 流量 204.05376281738282MB/s
[开始时间]: 2019-09-11 09:09:19

格式化下告警规则中的 $value 变量,有三种格式化数值的方法:

1
2
3
4
5
{{ printf "%.2f" $value }}
或
{{ $value | printf "%.2f" }}
或
{{ humanize $value }}

调整后收到的告警通知信息:

1
2
3
[报警名称]: 网卡接收流量异常
[报警明细]: nova26 bond0 流量 201.6MB/s
[开始时间]: 2019-09-12 09:09:34