1. 概述
alertmanager是prometheus的报警工具,但是他独立的进程,作为一个独立的报警软件存在,不仅仅能接受来自prometheus的报警,还能够接受多种其他的监控工具发来的报警。由于他是声明式的API,即使是postman或者curl也可以发送报警。或者搭配使用fluentd的alertmanager output插件,对于任何类型的input都可以实现报警功能。
2.安装
2.1. 安装alertmanager
wget https://github.com/prometheus/alertmanager/releases/download/v0.21.0/alertmanager-0.21.0.linux-amd64.tar.gz
解压后,进入到文件夹
tar xf alertmanager-0.21.0.linux-amd64.tar.gz
cd alertmanager-0.21.0.linux-amd64
我们可以看到三个文件,把它们分别放到系统的指定位置
mv alertmanager /usr/local/sbin/
mv amtool /usr/local/sbin/
# 配置文件位置
mkdir /etc/alertmanager
mv alertmanager.yml /etc/alertmanager
# 数据文件位置
mkdir /var/lib/alertmanager
2.2. 配置alertmanager
修改启动文件/etc/systemd/system/node_exporter.service
[Unit]
Description=alertmanager
Documentation=https://prometheus.io/docs/alerting/latest/overview/
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/sbin/alertmanager \
--config.file=/etc/alertmanager/alertmanager.yml \
--storage.path=/var/lib/alertmanager \
--web.external-url=http://你的IP
ExecReload=/bin/kill -HUP
TimeoutStopSec=20s
Restart=always
[Install]
WantedBy=multi-user.target
修改alertmanager的文件alertmanager.yml,他分为下面五个部分
- global:主要是全局配置,比如smtp服务器,wechat的url之类
- templates:可以指定我们发送时候使用的模板,一般是html格式的报警的时候会使用模板来发送报警,我们也可以自定模板,但是需要一些go template的知识
- route:分发规则,根据报警的一些标志,发送给不同的receiver,使用不同的inhibbit_rule
- receivers:发送报警的方式,支持邮件,pageduty,wechat或者直接发送到指定的webhoot
- inhibbit_rules:对报警进行分类,如果某类的报警重复接受,会暂时抑制发送报警给用户
- tls_config:https证书,这次咱们用不到
2.3. 配置prometheus
我们只需要在prometheus.yml文件中指定alertmanager
alerting:
alertmanagers:
- static_configs:
- targets:
- 10.114.2.70:9093
- 10.114.2.71:9093
3. 报警规则
alertmanager的报警规则需要借助于promsql来实现,而且,报警规则是在发送方配置的,也就是prometheus上来配置。为了日后好管理,我们会把报警根据exporter的种类进行分别的存放,在prometheus的配置文件中,使用通配符*来匹配某个目录下的所有规则,比如
rule_files:
- "/etc/prometheus/rules/*.yml"
希望大家的知识比较扎实,这里我就简单的po出一个例子,然后在注释中做讲解
groups:
- name: OS
rules:
# 如果在15分钟内检测是内存使用量高于80%就报警
# 使用这个死递归来让内存使用量增加
# function a() { $(a) ; }
# a &
- alert: MemoryUsage
expr: round(((node_memory_MemTotal_bytes-node_memory_MemAvailable_bytes)/node_memory_MemTotal_bytes) * 100) > 80
for: 15m
labels:
severity: warning
annotations:
summary: "Memory of instance is not enough"
description: "Memory usage of is too much for more than 15 minutes. (current value: %"
# 如果cpu的使用量连续15分钟高于80%就报警
# 使用下面的命令来让CPU使用率增加
# "cat /dev/urandom | md5sum"
- alert: CPUUsage
expr: round((1 - avg(rate(node_cpu_seconds_total{mode="idle"}[15m])) by (instance)) * 100) > 80
for: 15m
labels:
severity: warning
annotations:
summary: "CPU usage of instance is too hight"
description: "CPU usage of is too much for more than 15 minutes. (current value: %"
# 如果某个指定的硬盘设备使用量高于85%就报警
# 使用下面的命令来让硬盘写满
# dd if=/dev/zero of=test bs=1024M count=40
- alert: RootfsUsage
expr: round((node_filesystem_size_bytes{device="rootfs"}-node_filesystem_free_bytes{device="rootfs"})/node_filesystem_size_bytes{device="rootfs"} * 100) > 85
for: 30s
labels:
serverity: warning
annotations:
summary: "Not enough space for root fs on "
description: "Not enough space for root fs on . (current value: )%"
# 进程是否启动,启动为1,不启动为0
- alert: ProcessNodeExporter
expr: up{job="node_exporter"} == 0
for: 15s
labels:
serverity: critical
annotations:
summary: "Node Exporter on is not running"
description: "Node Exporter on is not running"