9-6 Prometheus告警通知Alertmanager,结合邮箱,钉钉,企业微信实现告警,告警分类发送,告警模板使用
文章目录
- 前言
- 告警流程
- 部署alertermanager
- Alertmanager配置
- Prometheus规则
- Prometheus配置
- 邮箱告警
- 查看Prometheus
- 查看Alertmanager
- 查看邮箱
- 钉钉告警
- prometheus-webhook-dingtalk安装
- alertmanager配置dingtalk
- 企业微信告警
- alertmanager配置wechat
- 告警分类发送
- prometheus规则
- alertermanager配置
- 告警模板使用
- tmpl模板文件
- alertmanager配置
- 排错:企业微信接收不到短信
- python一键检测
- 60020 解决方案
前言
Alertmanager告警管理是Prometheus一个组件,用于告警信息的处理与转发。
Alertmanager接收Prometheus等客户端发来的警报,之后通过分组,删除重复等处理,并将它们通过路由发送给正确的接收器。告警方式可以按照不同的规则发送给不同的模块负责人,Alertmanager支持Wechat, Email, Webhook等告警方式, 其中Webhook可以接入钉钉等聊天工具。
告警流程
- Prometheus配置监控规则
- 监控对象触发阈值
- 阈值超出持续时间
- 推送告警到Alertmanager
- Alertmanager处理告警信息
1)分组(group):类似告警合并为一个通知。
2)静默(silences):不通知,系统升级时使用。
3)抑制(inhibition): 只通知一次,相同内容不再通知。 - Alertmanager发送通知到媒体
- 邮箱,钉钉,企业微信等接收到通知
部署alertermanager
下载二进制文件
wget https://github.com/prometheus/alertmanager/releases/download/v0.24.0/alertmanager-0.24.0.linux-amd64.tar.gztar zxvf alertmanager-0.24.0.linux-amd64.tar.gz
mv alertmanager-0.24.0.linux-amd64 /apps/alertmanager
创建alertermanager服务
vim /etc/systemd/system/alertmanager.service[Unit]
Description=Prometheus alertmanager
After=network.target[Service]
# 注意该行不能有单双引号
ExecStart=/apps/alertmanager/alertmanager --config.file=/apps/alertmanager/alertmanager.yml[Install]
WantedBy=multi-user.target
Tips: 服务启动与二进制启动写法有所不同
二进制启动,3种写法都可以:
/apps/alertmanager/alertmanager --config.file="/apps/alertmanager/alertmanager.yml"
/apps/alertmanager/alertmanager --config.file='/apps/alertmanager/alertmanager.yml'
/apps/alertmanager/alertmanager --config.file=/apps/alertmanager/alertmanager.yml
服务启动,不能有单双引号:
# ExecStart=/apps/alertmanager/alertmanager --config.file="/apps/alertmanager/alertmanager.yml"
# ExecStart=/apps/alertmanager/alertmanager --config.file='/apps/alertmanager/alertmanager.yml'
# ExecStart="/apps/alertmanager/alertmanager --config.file='/apps/alertmanager/alertmanager.yml'"
ExecStart=/apps/alertmanager/alertmanager --config.file=/apps/alertmanager/alertmanager.yml
启动服务,查看端口:
systemctl daemon-reload
systemctl enable --now alertmanager
systemctl status alertmanagernetstat -lntp
tcp6 0 0 :::9093 :::* LISTEN 2225/alertmanager
tcp6 0 0 :::9094 :::* LISTEN 2225/alertmanager
访问 192.168.100.197:9093 为alertmanager管理页面:
Alertmanager配置
官方配置文件说明
https://prometheus.io/docs/alerting/latest/configuration/
配置文件详解,以邮箱告警为例:
vim /apps/alertmanager/alertmanager.yml# 邮件发送者
global:smtp_smarthost: 'smtp.qq.com:465' smtp_from: '123456789@qq.com' smtp_auth_username: '123456789@qq.com' smtp_auth_password: 'myqqpassword' smtp_require_tls: false# 规则配置
route:group_by: ['alertname']group_wait: 10sgroup_interval: 2mrepeat_interval: 5mreceiver: 'email'# 通知接收者
receivers:- name: 'email'email_configs:- to: 'someone@email.com'send_resolved: true- name: 'web.hook'webhook_configs:- url: 'http://127.0.0.1:5001/'# 抑制设置
inhibit_rules:- source_match:severity: 'critical'target_match:severity: 'warning'equal: ['alertname', 'dev', 'instance']
项目 | Value |
---|---|
global | 全局设置,这里为邮件发送者的配置 |
smtp_* | 邮箱smtp设置,先在qq开通,再输入账号密码等 |
group_by | 通过 alertname 的值对告警进行分类 |
group_wait | 第一次产生告警,等待 10s,组内有告警就一起发出,没有其它告警就单独发出 |
group_interval | 第二次产生告警,先等待 2 分钟,2 分钟后还没有恢复就进入 repeat_interval |
repeat_interval | 在最终发送消息前再等待 5 分钟,5 分钟后还没有恢复就发送第二次告警 |
receiver | 接收者,在receivers中选择一个 |
receivers | 定义接收者们,可定义多个 |
name | 接收者名字,将被receiver选择 |
email_configs | 邮箱接收者设置 |
send_resolved | 是否发送告警解决的通知 |
webhook_configs | webhook接收者设置,如钉钉等 |
inhibit_rules | 抑制设置,即哪些告警发通知,哪些不发 |
source_match | 源匹配的告警将被通知 |
severity | 严重程度为critical,重要的告警将被通知 |
target_match | 目标匹配的告警不被通知 |
severity | 严重程度为warning,警告的告警将被通知 |
equal | 匹配哪些对象的告警 |
Prometheus规则
新建规则文件,配置分组信息,告警阈值和时间,告警标签和注释等。
指标表达式采用PromQL语句,多数指标单位为bytes字节,需要转换成KMG,例如2M=2*1024*1024
Prometheus规则文件,对于邮箱,钉钉或企业微信,该文件通用:
vim /apps/prometheus/rules/server_rules.yamlgroups:
- name: alertmanager_pod.rulesrules: - alert: Pod_all_cpu_usageexpr: (sum by(name)(rate(container_cpu_usage_seconds_total{image!=""}[5m]))*100) > 10for: 2mlabels:severity: criticalservice: podsannotations:description: 容器 {{ $labels.name }} CPU 资源利用率大于 10% , (current value is {{ $value }})summary: Dev CPU 负载告警- alert: Pod_all_memory_usage expr: sort_desc(avg by(name)(irate(node_memory_MemFree_bytes {name!=""}[5m]))) > 2*1024*1024*1024 for: 2mlabels:severity: criticalannotations:description: 容 器 {{ $labels.name }} Memory 资 源 利 用 率 大 于 2G , (current value is {{ $value }})summary: Dev Memory 负载告警- alert: Pod_all_network_receive_usageexpr: sum by (name)(irate(container_network_receive_bytes_total{container_name="POD"}[1m])) > 500*1024for: 2mlabels:severity: criticalannotations:description: 容器 {{ $labels.name }} network_receive 资源利用率大于 500K , (current value is {{ $value }}) - alert: pod 内存可用大小expr: node_memory_MemFree_bytes < 100*1024*1024for: 2mlabels:severity: criticalannotations:description: 容器可用内存小于 100m
项目 | Value |
---|---|
groups | 分组 |
name | 分组名称 |
rules | 分组规则,共4个 |
alert | 告警名称 |
expr | 指标表达式,末尾为阈值 |
for | 达到阈值并持续多久,才触发通知 |
labels | 告警的标签,显示在通知 |
severity | 严重程度,critical 非常严重 |
annotations | 告警的注释,显示在通知 |
description | 内容描述,支持变量 |
summary | 内容总结,可选 |
检验规则文件,显示SUCCESS:
/apps/prometheus/promtool check rules rules/server_rules.yaml
Checking rules/server_rules.yamlSUCCESS: 4 rules found
Prometheus配置
配置Prometheus文件,alertmanagers服务器的IP和端口,prometheus服务器规则文件的路径:
vim /apps/prometheus/prometheus.yml# Alertmanager configuration
alerting:alertmanagers:- static_configs:- targets:- 192.168.100.197:9093# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:- "/apps/prometheus/rules/server_rules.yaml"# - "second_rules.yml"
重启Prometheus服务:
systemctl restart prometheus.service
邮箱告警
查看Prometheus
Prometheus首页,Alerts选项,可以查看告警信息:
报警状态分3种
- inactive:没有异常。
- pending:已触发阈值,但未满足告警持续时间(即 rule 中的 for 字段)
- firing:已触发阈值且满足条件并发送至 alertmanager
pending状态,阈值触发了,但再观察2分钟(for: 2m)
firing状态,2分钟过后还超出阈值,则发送至alertmanager
查看Alertmanager
只有在Prometheus中Firing的警告才会传到Alertmanager,进入首页查看
alertmanager的命令行也能查看报警:
sudo /apps/alertmanager/amtool alert --alertmanager.url=http://192.168.100.197:9093
Alertname Starts At Summary State
Pod_all_cpu_usage 2022-10-29 14:32:18 UTC Dev CPU 负载告警 active
Pod_all_cpu_usage 2022-10-29 14:32:18 UTC Dev CPU 负载告警 active
Pod_all_cpu_usage 2022-10-29 14:32:18 UTC Dev CPU 负载告警 active
Pod_all_cpu_usage 2022-10-29 14:32:18 UTC Dev CPU 负载告警 active
Pod_all_cpu_usage 2022-10-29 14:32:18 UTC Dev CPU 负载告警 active
Pod_all_cpu_usage 2022-10-29 14:32:33 UTC Dev CPU 负载告警 active
Pod_all_cpu_usage 2022-10-29 14:32:48 UTC Dev CPU 负载告警 active
Pod_all_cpu_usage 2022-10-29 14:32:48 UTC Dev CPU 负载告警 active
查看邮箱
Prometheus发送告警给alertmanager后,alertmanager根据通知设置,将报警消息通过邮箱发送:
发邮件时,第一次与第二次告警差2分钟,第三次与其以后,每隔6分钟告警一次。(可在配置文件修改)
钉钉告警
在群聊中,群设置 - 智能群助手 - 添加机器人 - 自定义Webhook
安全设置可选关键词,具有关键词的内容才被转发:
创建完成,复制Webhook链接:
测试机器人, 注意content内容一定要包含alertname关键词,否则无法接收。
curl 'https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxx' \-H 'Content-Type: application/json' \-d '{"msgtype": "text","text": {"content":"Here is alertname test"}}'
调用频率限制:
每个机器人每分钟最多发送20条消息到群里,如果超过20条,会限流10分钟。
prometheus-webhook-dingtalk安装
需要再安装prometheus-webhook-dingtalk组件,报警才能顺利转发:
wget https://github.com/timonwong/prometheus-webhook-dingtalk/releases/download/v1.4.0/prometheus-webhook-dingtalk-1.4.0.linux-amd64.tar.gztar zxvf prometheus-webhook-dingtalk-1.4.0.linux-amd64.tar.gz
mv prometheus-webhook-dingtalk-1.4.0.linux-amd64 /apps/webhook-dingtalk
创建prometheus-webhook-dingtalk组件,粘贴上述复制的Webhook链接。
vim /etc/systemd/system/webhook-dingtalk.service[Unit]
Description=Prometheus webhook dingtalk
After=network.target[Service]
# 注意profile后面不能有单双引号
ExecStart=/apps/webhook-dingtalk/prometheus-webhook-dingtalk \
--ding.profile=alertname=https://oapi.dingtalk.com/robot/send?access_token=abcdef1234567890abcdef1234567890[Install]
WantedBy=multi-user.target
开机自启动webhook-dingtalk,服务开启了8060端口:
systemctl daemon-reload
systemctl restart webhook-dingtalk.service
systemctl status webhook-dingtalk.servicenetstat -lntp | grep 8060
tcp6 0 0 :::8060 :::* LISTEN 2295/prometheus-web
alertmanager配置dingtalk
alertmanager配置上prometheus-webhook-dingtalk的url,该url用于发送告警信息:
vim /apps/alertmanager/alertmanager.ymlroute:group_by: ['alertname']group_wait: 30sgroup_interval: 5mrepeat_interval: 1hreceiver: 'web.hook'
receivers:- name: 'web.hook'webhook_configs:# webhook-dingtalk的发送报警页面- url: 'http://192.168.100.197:8060/dingtalk/alertname/send'
inhibit_rules:- source_match:severity: 'critical'target_match:severity: 'warning'equal: ['alertname', 'dev', 'instance']
Prometheus配置没有变,规则文件也没有变:
cat /apps/prometheus/prometheus.yml
...
rule_files:- "/apps/prometheus/rules/server_rules.yaml"
...
钉钉客户端收到报警消息:
企业微信告警
打开企业微信网页端,拥有自己的企业后,再创建一个应用:
完成应用创建,查看详情:
根据上图的红框,要收集3样东西:
- 企业ID:ww12345abcde
- AgentId:1000002
- Secret:xcvnjfsdaUREOIJDLFJ743219742478932
alertmanager配置wechat
在alertmanager配置文件添加wechat_configs:
vim /apps/alertmanager/alertmanager.ymlroute:group_by: ['alertname']group_wait: 30sgroup_interval: 5mrepeat_interval: 1hreceiver: 'wechat'
receivers:- name: 'wechat'wechat_configs:- corp_id: 'ww12345abcde' agent_id: '1000002'api_secret: 'xcvnjfsdaUREOIJDLFJ743219742478932'to_user: '@all'send_resolved: true
inhibit_rules:- source_match:severity: 'critical'target_match:severity: 'warning'equal: ['alertname', 'dev', 'instance']
企业微信与钉钉不太一样,不需要类似prometheus-webhook-dingtalk的组件。
在Alertmanager查看推送过来的报警信息:
在企业微信客户端接收到报警消息:
告警分类发送
告警分类发送就是将告警根据严重程度,项目组等划分类别,不同类别的告警发送给不同的组织。
prometheus规则
修改prometheus规则文件,依据lables标签定义告警的类别:
vim /apps/prometheus/rules/server_rules.yamlgroups:
- name: alertmanager_pod.rulesrules: - alert: Pod_all_cpu_usageexpr: (sum by(name)(rate(container_cpu_usage_seconds_total{image!=""}[5m]))*100) > 10for: 2mlabels:# 该报警严重程度最高,属于web项目组severity: criticalproject: webannotations:description: 容器 {{ $labels.name }} CPU 资源利用率大于 10% , (current value is {{ $value }})summary: Dev CPU 负载告警- alert: Pod_all_memory_usage expr: sort_desc(avg by(name)(irate(node_memory_MemFree_bytes {name!=""}[5m]))) > 2*1024*1024*1024 for: 2mlabels:# 该报警严重程度一般,属于blog项目组severity: warningproject: blogannotations:description: 容 器 {{ $labels.name }} Memory 资 源 利 用 率 大 于 2G , (current value is {{ $value }})summary: Dev Memory 负载告警
alertermanager配置
在alertmanager配置文件修改route告警分发机制:
vim /apps/alertmanager/alertmanager.ymlroute:group_by: ['alertname']group_wait: 30sgroup_interval: 5mrepeat_interval: 1h# 没有匹配子路由的将发送到默认接收者receiver: 'default-receiver'# 子路由一:项目为web或blog的严重警告发送到钉钉- receiver: 'dingtalk'group_wait: 10smatch_re:severity: criticalproject: web|blog # 子路由二:项目为blog的一般警告发送到企业微信- receiver: 'wechat'group_wait: 20smatch_re:severity: warningproject: blog receivers:# 默认接收者- name: 'default-receiver'webhook_configs:- url: 'http://127.0.0.1:5001/'# 钉钉接收者- name: 'dingtalk'webhook_configs:- url: 'http://192.168.100.197:8060/dingtalk/alertname/send'# 企业微信接收者 - name: 'wechat'wechat_configs:- corp_id: 'ww12345abcde' agent_id: '1000002'api_secret: 'xcvnjfsdaUREOIJDLFJ743219742478932'to_party: 2send_resolved: true# 抑制规则
inhibit_rules:- source_match:severity: 'critical'target_match:severity: 'warning'equal: ['alertname', 'dev', 'instance']
重启两个服务,即可实现告警分类发送:
systemctl restart alertmanager.service
systemctl restart prometheus.service
告警模板使用
Alertmanager的通知模板基于Go模板系统。支持变量,HTML格式。不同的接受者可以使用不一样的模板。
tmpl模板文件
创建模板文件,email和钉钉的报警模板,文件名自定义:
vim /apps/alertmanager/alert.tmpl{{ define "email.default.html" }}
{{ range $i, $alert :=.Alerts }}
=== email 监控报警 === <br>
告警状态:{{ .Status }} <br>
告警级别:{{ $alert.Labels.severity }} <br>
告警类型:{{ $alert.Labels.alertname }} <br>
告警应用:{{ $alert.Annotations.summary }} <br>
故障主机: {{ $alert.Labels.instance }} <br>
告警主题: {{ $alert.Annotations.summary }} <br>
触发阀值:{{ $alert.Annotations.value }} <br>
告警详情: {{ $alert.Annotations.description }} <br>
触发时间: {{ $alert.StartsAt.Format "2006-01-02 15:04:05" }} <br>
===========end============ <br><hr>
{{ end }}
{{ end }}{{ define "wechat.default.message" }}
{{ range $i, $alert :=.Alerts }}
=== wechat 监控报警 ===
告警级别:{{ $alert.Labels.severity }}
告警类型:{{ $alert.Labels.alertname }}
故障主机: {{ $alert.Labels.instance }}
===========end============
{{ end }}
{{ end }}
项目 | Value |
---|---|
define | 模板名称,名字固定 |
range | 遍历每个告警 |
.Status | 告警状态,firing |
$alert.Labels.severity | 标签项的严重程度 |
$alert.Annotations.summary | 注释项的严重程度 |
$alert.StartsAt.Format | 触发时间格式,后面跟范例 |
换行符,html格式模板需要,message格式模板不用 |
alertmanager配置
alertmanager配置在原理基础上添加templates选项,指定上述文件路径:
vim /apps/alertmanager/alertmanager.yml
...# 指定模板文件路径
templates:
- '/apps/alertmanager/alert.tmpl'route:group_by: ['alertname']group_wait: 10sgroup_interval: 2mrepeat_interval: 5m# 接收者email,则使用email模板receiver: 'email'...
在自己的邮箱里接收到告警信息:
上图故障主机和触发阈值显示为空,需要到Prometheus规则rule文件中添加标签。
排错:企业微信接收不到短信
Alertmanager配置正确,企业ID,Agentid,Secret都填了,但接收不到信息。很可能没加IP白名单。
可以先通过python脚本,检测一下与API的连接情况:
python一键检测
import requests
import json# 自定义基本信息
corp_id = 'ww12345abcde'
agent_id = '1000002'
api_secret = 'xcvnjfsdaUREOIJDLFJ743219742478932'# 全局变量
get_token_url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken"
send_msg_url1 = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token="def check_wechat_api():# 获取到接入tokenget_token_data = {"corpid": corp_id, "corpsecret": api_secret}r = requests.get(url=get_token_url, params=get_token_data, verify=False)my_token = r.json()['access_token']# 补充发送链接,填写发送内容send_msg_url2 = send_msg_url1 + my_tokensend_data = {"agentid": agent_id,"msgtype": "text","text": {"content": "hello world"},"safe": "0"}# 发送Post请求,获取返回值r = requests.post(url=send_msg_url2, data=json.dumps(send_data), verify=False)return r.json()if __name__ == '__main__':# 打印检测结果print(check_wechat_api())
返回错误代码60020,不安全的访问IP。具体可查看报错信息中的链接。
{'errcode': 60020, 'errmsg': 'not allow to access from your ip, hint: [1667130735303760727212883], from ip: 100.110.120.130, more info at https://open.work.weixin.qq.com/devtool/query?e=60020'}
60020 解决方案
按照提示添加本机IP到企业可信IP。为保障企业数据安全,企业微信要求企业内部开发配置的域名必须对应企业主体。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!