Prometheus专题[8.Prometheus之Alertmanager]

1.概述

Alertmanager与Prometheus是相互分离的两个组件。Prometheus服务器根据报警规则将警报发送给Alertmanager,然后Alertmanager将silencing、inhibition、aggregation等消息通过电子邮件、PaperDuty和HipChat发送通知。

在 Prometheus 中告警分为两部分:

  • Prometheus 服务根据所设置的告警规则将告警信息发送给 Alertmanager。

  • Alertmanager 对收到的告警信息进行处理,包括分组,抑制,静默策略路由告警通知。
    使用告警服务主要的步骤如下:

  • 安装配置 Alertmanager。

  • 通过设置 -alertmanager.url 让 Prometheus 服务与 Alertmanager 进行通信。

  • 在 Prometheus 服务中设置告警规则。

2.Grouping:分组

分组是指当出现问题时,Alertmanager会收到一个单一的通知,而当系统宕机时,很有可能成百上千的警报会同时生成,这种机制在较大的中断中特别有用。

例如,当数十或数百个服务的实例在运行,网络发生故障时,有可能服务实例的一半不可达数据库。在告警规则中配置为每一个服务实例都发送警报的话,那么结果是数百警报被发送至Alertmanager。

但是作为用户只想看到单一的报警页面,同时仍然能够清楚的看到哪些实例受到影响,因此,人们通过配置Alertmanager将警报分组打包,并发送一个相对看起来紧凑的通知。

分组警报、警报时间,以及接收警报的receiver是在配置文件中通过路由树配置的。

3.Inhibition:抑制

抑制是指当警报发出后,停止重复发送由此警报引发其他错误的警报的机制。

例如,当警报被触发,通知整个集群不可达,可以配置Alertmanager忽略由该警报触发而产生的所有其他警报,这可以防止通知数百或数千与此问题不相关的其他警报。

抑制机制可以通过Alertmanager的配置文件来配置。

4.Silences:沉默

沉默是一种简单的特定时间静音提醒的机制。一种沉默是通过匹配器来配置,就像路由树一样。传入的警报会匹配RE,如果匹配,将不会为此警报发送通知。

沉默机制可以通过Alertmanager的Web页面进行配置。

5.route:路由

路由块定义了路由树及其子节点。如果没有设置的话,子节点的可选配置参数从其父节点继承。

每个警报进入配置的路由树的顶级路径,顶级路径必须匹配所有警报(即没有任何形式的匹配)。然后匹配子节点。如果continue的值设置为false,它在匹配第一个孩子后就停止;如果在子节点匹配,continue的值为true,警报将继续进行后续兄弟姐妹的匹配。如果警报不匹配任何节点的任何子节点(没有匹配的子节点,或不存在),该警报基于当前节点的配置处理。

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# The root route with all parameters, which are inherited by the child
# routes if they are not overwritten.
route:
receiver: 'default-receiver'
group_wait: 30s
group_interval: 5m
repeat_interval: 4h
group_by: [cluster, alertname]
# All alerts that do not match the following child routes
# will remain at the root node and be dispatched to 'default-receiver'.
routes:
# All alerts with service=mysql or service=cassandra
# are dispatched to the database pager.
- receiver: 'database-pager'
group_wait: 10s
match_re:
service: mysql|cassandra
# All alerts with the team=frontend label match this sub-route.
# They are grouped by product and environment rather than cluster
# and alertname.
- receiver: 'frontend-pager'
group_by: [product, environment]
match:
team: frontend

6.通过 Email 接收告警

以下介绍如何通过 Email 接受告警。

相关信息说明:

  • Prometheus 版本:prometheus-2.1.0
  • Alertmanager 版本:alertmanager-0.14
  • 发送告警邮件的邮箱:email
    假设该实验运行在本地机器上, Prometheus 默认端口为 9090,Alertmanager 默认端口为 9093。

修改 AlertManager 配置文件
其中一些关键配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
global:
resolve_timeout: 20s
smtp_require_tls: false
smtp_smarthost: 'mail.xxx.com:25'
smtp_from: 'xxx@xxx.com'

templates:
- '/usr/local/alertmanager/template/cloud.tmpl'

route:
group_by: ['instance']
group_wait: 5s
group_interval: 10s
repeat_interval: 72h
receiver: 'team-ops-mails'
routes:
- match:
severity: High
receiver: 'ops'

receivers:
- name: 'team-ops-mails'
email_configs:
- to: 'xxx@xxx.com'
html: '{{ template "email.cloud.html" . }}'
send_resolved: true
- name: 'ops'
webhook_configs:
- url: 'http://192.168.31.102/sendmessage/'
send_resolved: true
email_configs:
- to: 'xxx@xxx.com'
html: '{{ template "email.cloud.html" . }}'
send_resolved: true

在prometheus下添加 alert.rules 文件
文件中写入以下简单规则作为示例。

1
2
3
4
5
6
7
8
9
10
11
groups:
- name: vm_alerts
rules:
- alert: high_cpu_load
expr: node_load1 > 1
for: 1m
labels:
severity: Warning
annotations:
summary: "{{$labels.instance}}: Server under high load"
description: "{{$labels.instance}}: Server is under high load, the avg load 1m is at {{ $value}}."

修改 prometheus.yml 文件
添加以下规则:

1
2
rule_files:
- "rules/alert.yml"

启动AlertManager服务

1
./Alertmanager -config.file=alertmanager.yml

重载prometheus服务

# 推荐文章
  1.深刻理解Docker镜像大小
  2.k8s专题[1.k8s基础概念]
  3.k8s专题[10.使用Spinnaker持续发布应用]
  4.k8s专题[2.k8s设计原则]
  5.k8s专题[3.k8s基础组件]

评论


:D 一言句子获取中...