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可以接入钉钉等聊天工具。

在这里插入图片描述



告警流程

  1. Prometheus配置监控规则
  2. 监控对象触发阈值
  3. 阈值超出持续时间
  4. 推送告警到Alertmanager
  5. Alertmanager处理告警信息
    1)分组(group):类似告警合并为一个通知。
    2)静默(silences):不通知,系统升级时使用。
    3)抑制(inhibition): 只通知一次,相同内容不再通知。
  6. Alertmanager发送通知到媒体
  7. 邮箱,钉钉,企业微信等接收到通知

部署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_configswebhook接收者设置,如钉钉等
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。为保障企业数据安全,企业微信要求企业内部开发配置的域名必须对应企业主体。
在这里插入图片描述




本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部