一、Prometheus告警简介
告警能力在Prometheus的架构中被划分成两个独立的部分。如下所示,通过在Prometheus中定义AlertRule(告警规则),Prometheus会周期性的对告警规则进行计算,如果满足告警触发条件就会向Alertmanager发送告警信息。
在Prometheus中一条告警规则主要由以下几部分组成:
告警名称:用户需要为告警规则命名,当然对于命名而言,需要能够直接表达出该告警的主要内容。
告警规则:告警规则实际上主要由PromQL进行定义,其实际意义是当表达式(PromQL)查询结果持续多长时间(During)后出发告警。
在Prometheus中,还可以通过Group(告警组)对一组相关的告警进行统一定义。当然这些定义都是通过YAML文件来统一管理的。
Alertmanager作为一个独立的组件,负责接收并处理来自Prometheus Server(也可以是其它的客户端程序)的告警信息。Alertmanager可以对这些告警信息进行进一步的处理,比如当接收到大量重复告警时能够消除重复的告警信息,同时对告警信息进行分组并且路由到正确的通知方,Prometheus内置了对邮件,Slack等多种通知方式的支持,同时还支持与Webhook的集成,以支持更多定制化的场景。
例如,目前Alertmanager还不支持钉钉,那用户完全可以通过Webhook与钉钉机器人进行集成,从而通过钉钉接收告警信息。同时AlertManager还提供了静默和告警抑制机制来对告警通知行为进行优化。
二、Alertmanager特性
告警能力在Prometheus的架构中被划分成两个独立的部分。如下所示,通过在Prometheus中定义AlertRule(告警规则),Prometheus会周期性的对告警规则进行计算,如果满足告警触发条件就会向Alertmanager发送告警信息。
1 、分组
分组机制可以将详细的告警信息合并成一个通知。在某些情况下,比如由于系统宕机导致大量的告警被同时触发,在这种情况下分组机制可以将这些被触发的告警合并为一个告警通知,避免一次性接受大量的告警通知,而无法对问题进行快速定位。
例如,当集群中有数百个正在运行的服务实例,并且为每一个实例设置了告警规则。假如此时发生了网络故障,可能导致大量的服务实例无法连接到数据库,结果就会有数百个告警被发送到Alertmanager。
而作为用户,可能只希望能够在一个通知中中就能查看哪些服务实例收到影响。这时可以按照服务所在集群或者告警名称对告警进行分组,而将这些告警内聚在一起成为一个通知。
告警分组,告警时间,以及告警的接受方式可以通过Alertmanager的配置文件进行配置。
2 **、**抑制
抑制是指当某一告警发出后,可以停止重复发送由此告警引发的其它告警的机制。
例如,当集群不可访问时触发了一次告警,通过配置Alertmanager可以忽略与该集群有关的其它所有告警。这样可以避免接收到大量与实际问题无关的告警通知。
抑制机制同样通过Alertmanager的配置文件进行设置。
3 **、**静默
静默提供了一个简单的机制可以快速根据标签对告警进行静默处理。如果接收到的告警符合静默的配置,Alertmanager则不会发送告警通知。
静默设置需要在Alertmanager的Werb页面上进行设置。
Prometheus本身不支持告警功能,主要通过插件alertmanage来实现告警。AlertManager用于接收Prometheus发送的告警并对于告警进行一系列的处理后发送给指定的用户。
Prometheus触发一条告警的过程:
prometheus--->触发阈值--->超出持续时间--->alertmanager--->分组|抑制|静默--->媒体类型--->邮件|钉钉|微信等。
三、实现邮件告警
1 、安装Docker
1)获取阿里Docker源
[root@localhost ~]# yum -y install yum-utils device-mapper-persistent-data lvm2
[root@localhost ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
2)安装Docker
[root@localhost ~]# yum -y install docker-ce docker-ce-cli containerd.io
3)启动Docker
[root@localhost ~]# systemctl enable docker
[root@localhost ~]# systemctl start docker
2、安装Docker-Compose
Linux上我们可以从Github上下载它的二进制包来使用,最新发行的版本地址:https://github.com/docker/compose/releases。
1)运行以下命令以下载Docker Compose的v2.16.0版本
[root@localhost ~]# wget -O /usr/bin/docker-compose https://github.com/docker/compose/releases/download/v2.16.0/docker-compose-linux-x86_64
2)授权可执行权限
[root@localhost ~]# chmod +x /usr/bin/docker-compose
3)测试是否安装成功
[root@localhost ~]# docker-compose -v
Docker Compose version v2.16.0
3 、创建相关服务配置文件
1)创建Prometheus配置文件
[root@localhost ~]# mkdir -p /opt/monitor/conf
[root@localhost ~]# vim /opt/monitor/conf/prometheus.yml
global:
scrape_interval: 15s
evaluation_interval: 15s
alerting:
alertmanagers:
* static_configs:
* targets:
* alertmanager:9093
rule_files:
* "/opt/prometheus/rules/node.yml"
scrape_configs:
*
job_name: 'prometheus'
static_configs:
* targets: ['prometheus:9090']
*
job_name: 'node'
static_configs:
* targets: ['node-exporter:9100']
*
job_name: 'alertmanager'
static_configs:
* targets: ['alertmanager:9093']
2)配置Prometheus告警规则
[root@localhost ~]# vim /opt/monitor/conf/node.yml
groups:
- name: Node Resource Monitoring
rules:
- alert: Node实例已宕机
expr: up{instance =~ ".*:9100"} == 0
for: 30s
labels:
user: root
severity: Emergency
annotations:
summary: "{{ $labels.instance }} 客户端已停止运行,请尽快处理!"
description: "Node_Exporter客户端已停止运行,当前状态:{{ $value }} "
3)创建Alertmanager配置文件
[root@localhost ~]# vim /opt/monitor/conf/alertmanager.yml
global:
# 每2分钟检查一次是否恢复
resolve_timeout: 2m
# 邮箱smtp服务器
smtp_smarthost: 'smtp.qq.com:465'
# 发送邮件名称
smtp_from: 'xxx@qq.com'
# 邮箱名称
smtp_auth_username: xxx@qq.com'
# 邮箱密码或授权码
smtp_auth_password: 'xxx'
smtp_require_tls: false
# 自定义通知模板
templates:
- '/opt/alertmanager/template/email.tmpl'
# route用来设置报警的分发策略
route:
# 采用哪个标签来作为分组依据
group_by: ['instance']
# 组告警等待时间。也就是告警产生后等待10s,如果有同组告警一起发出
group_wait: 10s # 两组告警的间隔时间
group_interval: 10s
# 重复告警的间隔时间,减少相同告警的发送频率
repeat_interval: 1h
# 设置默认接收人
receiver: 'email'
routes:
- receiver: 'email'
continue: true
group_wait: 10s
receivers:
* name: 'email'
email_configs:
* to: 'xxx@163.com'
html: '{{ template "email.to.html" . }}'
headers: { Subject: "Prometheus [Warning] 报警邮件" }
send_resolved: true
smtp_smarthost:是用于发送邮件的邮箱的SMTP服务器地址+端口;
smtp_auth_password:是发送邮箱的授权码而不是登录密码;
smtp_require_tls:不设置的话默认为true,当为true时会有starttls错误,为了简单这里设置为false;
templates:指出邮件的模板路径;
receivers下html指出邮件内容模板名,这里模板名为"email.to.html",在模板路径中的某个文件中定义。
headers:为邮件标题。
4)配置邮件告警模板
[root@localhost ~]# vim /opt/monitor/conf/email.tmpl
{{ define "email.to.html" }}
{{- if gt (len .Alerts.Firing) 0 -}}
{{ range .Alerts }}
告警程序:Prometheus_Alertmanager \<br\>
告警状态:{{ .Status }} \<br\>
告警级别:{{ .Labels.severity }} \<br\>
告警类型:{{ .Labels.alertname }} \<br\>
告警主机:{{ .Labels.instance }} \<br\>
告警详情:{{ .Annotations.description }} \<br\>
触发时间:{{ (.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }} \<br\>
{{ end }}{{ end -}}
{{- if gt (len .Alerts.Resolved) 0 -}}
{{ range .Alerts }}
告警程序:Prometheus_Alertmanager \<br\>
告警状态:{{ .Status }} \<br\>
告警级别:{{ .Labels.severity }} \<br\>
告警类型:{{ .Labels.alertname }} \<br\>
告警主机:{{ .Labels.instance }} \<br\>
告警详情:{{ .Annotations.description }} \<br\>
触发时间:{{ (.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }} \<br\>
恢复时间:{{ (.EndsAt.Add 28800e9).Format "2006-01-02 15:04:05" }} \<br\>
{{ end }}{{ end -}}
{{- end }}
5)创建docker-compose.yml
[root@localhost ~]# vim /opt/monitor/docker-compose.yml
version: '3.3'
services:
prometheus:
image: bitnami/prometheus:2.37.0
container_name: prometheus
hostname: prometheus
restart: always
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--web.enable-lifecycle'
- '--storage.tsdb.retention.time=90d'
volumes:
- /opt/monitor/conf/prometheus.yml:/etc/prometheus/prometheus.yml
- /opt/monitor/conf/node.yml:/opt/prometheus/rules/node.yml
ports:
- "9090:9090"
environment:
- TZ=Asia/Shanghai
networks:
- monitor
alertmanager:
image: bitnami/alertmanager:0.25.0
container_name: alertmanager
hostname: alertmanager
restart: always
command:
- '--config.file=/etc/alertmanager/alertmanager.yml'
volumes:
- /opt/monitor/conf/alertmanager.yml:/etc/alertmanager/alertmanager.yml
- /opt/monitor/conf/email.tmpl:/opt/alertmanager/template/email.tmpl
ports:
- "9093:9093"
environment:
- TZ=Asia/Shanghai
networks:
- monitor
node-exporter:
image: bitnami/node-exporter:1.5.0
container_name: node-exporter
hostname: node-exporter
restart: always
ports:
- "9100:9100"
environment:
- TZ=Asia/Shanghai
networks:
- monitor
networks:
monitor:
driver: bridge
6)启动容器
[root@localhost ~]# cd /opt/monitor
[root@localhost monitor]# docker-compose up -d
7)查看容器运行状态
[root@localhost monitor]# docker-compose ps -a
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
alertmanager bitnami/alertmanager:0.25.0 "/opt/bitnami/alertm..." alertmanager 41 seconds ago Up 41 seconds 0.0.0.0:9093->9093/tcp, :::9093->9093/tcp
node-exporter bitnami/node-exporter:1.5.0 "/opt/bitnami/node-e..." node-exporter 3 minutes ago Up 3 minutes 0.0.0.0:9100->9100/tcp, :::9100->9100/tcp
prometheus bitnami/prometheus:2.37.0 "/opt/bitnami/promet..." prometheus 3 minutes ago Up 3 minutes 0.0.0.0:9090->9090/tcp, :::9090->9090/tcp
4 、验证邮件告警
浏览器访问Prometheus管理界面可以看到如下信息:
1)模拟停止node_exporter服务,触发邮件告警
[root@localhost monitor]# docker-compose stop node-exporter
2)再次查看Prometheus界面的Alerts可以看到告警状态。
绿色表示正常。
黄色状态为PENDING表示Alerts还没有发送至Alertmanager,因为rules里面配置了for: 30s。
30秒后状态由PENDING变为FIRING,此时Prometheus才将告警发给alertmanager,在Alertmanager中可以看到有一个alert。
3)查看Alertmanager
4)查看邮件告警信息
5)启动node_exporter
[root@localhost monitor]# docker-compose start node-exporter
6)查看邮件会收到恢复信息
附:
CPU使用率告警规则:
groups:
- name: CPU
rules:
- alert: CPU使用率过高
expr: (100 - (avg by (instance) (irate(node_cpu{mode="idle"}[5m])) * 100)) > 80
for: 1m
labels:
severity: Warning
annotations:
summary: "{{ $labels.instance }} CPU使用率过高"
description: "{{ $labels.instance }}: CPU使用率超过80%,当前使用率({{ $value }})."
内存使用率告警规则:
groups:
- name: Memory
rules:
- alert: 内存使用率过高
expr: (node_memory_MemTotal - (node_memory_MemFree+node_memory_Buffers+node_memory_Cached )) / node_memory_MemTotal * 100 > 80
for: 1m # 告警持续时间,超过这个时间才会发送给alertmanager
labels:
severity: Warning
annotations:
summary: "{{ $labels.instance }} 内存使用率过高"
description: "{{ $labels.instance }}:内存使用率超过80%,当前使用率({{ $value }})."
继续阅读 Prometheus最后更新:2023-10-10