2020-08-25
Prometheus 实现邮件告警(Prometheus+Alertmanager+ *** 邮箱或者网易163邮箱,目前测试过这两种邮箱都可以发送告警邮件)
Prometheus实现邮件告警原理如下:
Prometheus官方有一个附带的中间件:alertmanager,通过设置rules规则和路由转发可以实现邮件告警,前提是你需要有一个可以发送邮件的邮件服务端(可以自建或者使用互联网公司提供的免费邮箱)
告警原理图
Prometheus完整架构图
我之前得出的错误结论如下:
推荐直接在虚拟机操作系统上直接安装Prometheus和Alertmanager,不推荐其中任何一方在容器中运行,因为测试过在容器中运行Prometheus和alertmanager,结果出现如下错误情况
之一种情况是:我的node-exporter掉线跌机了(手动关机,模拟突然掉线跌机),Prometheus却提示节点依然在线?有时候却能够正常显示节点掉线跌机,生成告警发送邮件
第二种情况是:我的node-exporter掉线跌机了(手动关机,模拟突然掉线跌机),Prometheus提示节点掉线,告警生成,但是没有发送邮件,我手动恢复node-exporter后,告警解除,邮件能正常发送邮件提示告警已经解除。。。。
第三种情况是:我的node-exporter掉线跌机了(手动关机,模拟突然掉线跌机),Prometheus提示节点掉线,告警生成,正常成功发送邮件,我手动恢复node-exporter后,告警解除,邮件没有发送出来。。。。
以上三种情况之前经常出现,当时之一步以为是自己设置的scrape_interval不合理导致的,结果调试几次,问题没有解决,第二步以为是自己的服务器时间没有做到精确同步,然后我去设置和阿里云的ntp服务器同步,结果问题依然没有解决,第三步,换个方向,把alertmanager迁移到虚拟机操作系统上安装运行,问题解决!
北京时间是GMT+8小时,有些同志的时间可能是UTC的,但是如果是在要求不太十分精确的情况下,UTC时间是刚刚好等于GMT时间
为了避免时区的混乱,prometheus所有的组件内部都强制使用Unix时间,对外展示使用GMT时间。
要改时区有两个办法
1 .修改源码,重新编译。
2. 使用 docker 运行 Prometheus,挂载本地时区文件
docker run --restart always -e TZ=Asia/Shanghai --hostname prometheus --name prometheus-server -d -p 9090:9090 -v /data/prometheus/server/data:/prometheus -v /data/prometheus/server/conf/prometheus.yml:/etc/prometheus/prometheus.yml -u root prom/prometheus:v2.5.0
正文开始
安装alertmanager
容器安装方式:
docker run -d --name alertmanager -p 9093:9093 -v /usr/local/Prometheus/alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml prom/alertmanager:latest
先在宿主机/usr/local/Prometheus下创建一个文件夹alertmanager,然后在文件夹里创建alertmanager.yml配置文件,待会才能映射到alertmanager容器里的/etc/alertmanager目录下
global:全局配置
resolve_timeout: 问题解决的超时时间
*** tp_from: 发送告警邮件的邮箱账号
*** tp_ *** arthost: 邮箱 *** TP 服务地址,这里是以 *** 邮箱为例,也可以用网易163邮箱,这个和我之前设置zabbix邮件告警时的配置一样
*** tp_auth_username: 如果没有设置邮箱别名,那就是账户名
*** tp_auth_password: 邮箱的授权码,不是 账户密码,你可以在 *** 邮箱或者网易163邮箱网页端设置,开启 POP3/ *** TP 服务时会提示,和配置zabbix邮件告警的时候几乎一样
*** tp_require_tls: 是否使用 tls,根据环境不同,来选择开启和关闭。如果提示报错 email.loginAuth failed: 530 Must issue a STARTTLS command first,那么就需要设置为 true。着重说明一下,如果开启了 tls,提示报错 starttls failed: x509: certificate signed by unknown authority,需要在 email_configs 下配置 insecure_skip_verify: true 来跳过 tls 验证。
templates: 告警模板目录,可以不编写模板,有默认模板
Subject: '{{ template "email.default.subject" . }}'
html: '{{ template "email.default.html" . }}'
route:报警的分发设置
group_by:分组
group_wait: 分组等待时间
group_interval: 5m 每组时间间隔
repeat_interval: 10m 重复间隔
receiver: 接收方式,请注意!这里的名字要对应下面receivers中的任何一个名字,不然会报错,这里其实就是选择方式,有邮箱,企业微信,wehook,victorops等等
receivers:接受方式汇总,即告警方式汇总
例子:
receivers:
- name:'default-receiver'
email_configs:
- to:'whiiip@163.com'
html: '{{ template "alert.html" . }}'
headers: { Subject: "[WARN] 报警邮件test"}
inhibit_rules: 抑制规则
当存在与另一组匹配的警报(源)时,抑制规则将禁用与一组匹配的警报(目标)。
包括源匹配和目标匹配
alertmanager官方是这样说的
Inhibition
Inhibition is a concept of suppressing notifications for certain alerts if certain other alerts are already firing.
Example: An alert is firing that informs that an entire cluster is not reachable. Alertmanager can be configured to mute all other alerts concerning this cluster if that particular alert is firing. This prevents notifications for hundreds or thousands of firing alerts that are unrelated to the actual issue.
Inhibitions are configured through the Alertmanager's configuration file.
当存在与另一组匹配器匹配的警报(源)时,禁止规则会使与一组匹配器匹配的警报(目标)静音。目标警报和源警报的equal列表中的标签名称都必须具有相同的标签值。
在语义上,缺少标签和带有空值的标签是同一件事。因此,如果equal源警报和目标警报都缺少列出的所有标签名称,则将应用禁止规则。
为了防止警报禁止自身,与规则的目标和源端 都 匹配的警报不能被警报(包括其本身)为真来禁止。但是,我们建议选择目标匹配器和源匹配器,以使警报永远不会同时匹配双方。这很容易进行推理,并且不会触发此特殊情况。
接着是规则rules
不解释了,自己研究官方文档
alertmanager的非容器安装方式是
wget
tar xf alertmanager-0.20.0.linux-amd64.tar.gz
mv alertmanager-0.20.0.linux-amd64 /usr/local/alertmanager
vim /usr/lib/systemd/system/alertmanager.service
[Unit]
Description=alertmanager
Documentation=
After=network.target
[Service]
Type=simple
User=root
ExecStart=/usr/local/alertmanager/alertmanager --config.file=/usr/local/alertmanager/alertmanager.yml
Restart=on-failure
[Install]
WantedBy=multi-user.target
Alertmanager 安装目录下默认有 alertmanager.yml 配置文件,可以创建新的配置文件,在启动时指定即可。
其余方式和上面一样
接着是Prometheus,我之前的博客里有写了容器安装和非容器安装的 *** ,自己去翻阅
然后是在prometheus.yml里修改相关配置
首先去掉alertmanager的注释,改成IP加你设置的端口号,默认是9093
接着在rule_files: 下面写下规则文件的绝对路径,可以是具体文件名,也可以是*,也可以分几级文件,*默认是全部匹配
接着是被监控项的设置,这里设置完成可以在Prometheus网页里的targets里看得到
请注意,这里设置的参数名字要和rule规则中设置的参数名字一模一样,否则你的prometheus服务会无法启动,然后报错
如果不在特定的job下设置scrape_interval(优先级高于全局),则默认采用gobal下的scrape_interval
最后模拟节点掉线,手动关闭node-exporter或者Cadvisor
docker stop node-exporter 或者容器ID
docker stop cadvisor 或者容器ID
或者把up{{job='prometheus'}} == 1 设置成1,反向设置,不用关掉服务,就可以看看告警成不成功
说明一下 Prometheus Alert 告警状态有三种状态:Inactive、Pending、Firing。
Inactive:非活动状态,表示正在监控,但是还未有任何警报触发。
Pending:表示这个警报必须被触发。由于警报可以被分组、压抑/抑制或静默/静音,所以等待验证,一旦所有的验证都通过,则将转到 Firing 状态。
Firing:将警报发送到 AlertManager,它将按照配置将警报的发送给所有接收者。一旦警报解除,则将状态转到 Inactive,如此循环。
没有配置告警模板时的默认告警格式是这样的
节点恢复后邮件告知是这样的
写了模板后是这样的
还要重新映射模板文件夹路径到alertmanager容器里的相对路径,然后重启alertmanager,当然,如果目录下没有模板文件,则不显示
告警模板
在alertmanager.yml中修改相关设置
重启alertmanager
docker restart alertmanager
最终效果不是很好
zabbix怎样监控windows邮件服务器
可以配置zabbix使用外部邮件服务器发送报警邮件,然后来随时监控邮件服务器,具体:
1.进入Administration-Media types
配置如下,Script name 要与之前写的发邮件的脚本名字相同
3. 进入Configure-Actions
新建Action
可以修改默认的邮件内容,以下是我修改之后的邮件内容格式:
添加step,别忘了点Add按钮,点上面的Add,再点下面的Add免得添加出错,注意要选择发送邮件给哪一个用户;并选择刚才定义好的Media type名字。
Default operation step duration 表示这次发送邮件后,下一次发邮件是在多少秒之后。
以上我总共添加了三次发送邮件的Action,如果触发器出发了,一直没有人确认触发器,则会发三次邮件,添加完后结果如下图:
4.进入Administration-Users
下图为修改admin的登录密码:
点击Media再添加
Type选择Send alarm email(之前创建的Action),并填写接收的邮箱,
如何实现zabbix报警邮件中可以显示ip地址
说明:
Zabbix监控服务端、客户端都已经部署完成,被监控主机已经添加,Zabiix监控运行正常。
实现目的:
在Zabbix服务端设置邮件报警,当被监控主机宕机或者达到触发器预设值时,会自动发送报警邮件到指定邮箱。
具体操作:
以下操作在Zabbix监控服务端进行
备注:Zabbix监控服务端
操作系统:CentOS
主机名:zabbix.osyunwei.com
邮件报警有两种情况:
1、Zabbix服务端只是单纯的发送报警邮件到指定邮箱,发送报警邮件的这个邮箱账号是Zabbix服务端的本地邮箱账号(例如:root@localhost.localdomain),只能发送,不能接收外部邮件。
2、使用一个可以在互联网上正常收发邮件的邮箱账号(例如:xxx@163.com),通过在Zabbix服务端中设置,使其能够发送报警邮件到指定邮箱。
之一种:使用Zabbix服务端本地邮箱账号发送邮件
一、安装sendmail或者postfix
yum install sendmail #安装
service sendmail start #启动
chkconfig sendmail on #设置开机启动
yum install postfix
service postfix start
chkconfig postfix on
CentOS 5.x 默认已经安装好sendmail
CentOS 6.x 默认已经安装好postfix
sendmail和postfix只需要安装一个即可并开启服务即可。
二、安装邮件发送工具mailx
yum install mailx #安装
CentOS 5.x
编译安装mailx,直接yum安装的mailx版本太旧,使用外部邮件发送会有问题。
yum remove mailx #卸载系统自带的旧版mailx
下载mailx:
tar jxvf mailx-12.4.tar.bz2 #解压
cd mailx-12.4 #进入目录
make #编译
make install UCBINSTALL=/usr/bin/install #安装
ln -s /usr/local/bin/mailx /bin/mail #创建mailx到mail的软连接
ln -s /etc/nail.rc /etc/mail.rc #创建mailx配置文件软连接
whereis mailx #查看安装路径
mailx -V #查看版本信息
echo "zabbix test mail" |mail -s "zabbix"
xxx@163.com
#测试发送邮件,标题zabbix,邮件内容:zabbix test
mail,发送到的邮箱:xxx@163.com
三、配置Zabbix服务端邮件报警
1、打开Zabbix
管理-示警媒介类型-Email
名称:Email
类型:电子邮件
*** TP伺服器:zabbix.sa.huanqiu.com
*** TP HELO:zabbix.sa.huanqiu.com
*** TP电邮:zabbix@zabbix.sa.huanqiu.com
已经用:勾选
存档
备注:zabbix.sa.huanqiu.com为Zabbix监控端主机名称,建议修改,否则使用默认的localhost.localdomain发送邮件会被当做垃圾邮件拦截。
2、设置Zabbix用户报警邮箱地址
组态-用户-Admin (Zabbix Administrator)
切换到示警媒介
添加
类型:Email
收件人:xxx@163.com
其他默认即可,也可以根据需要设置
状态:已启用
存档
3、设置Zabbix触发报警的动作
组态-动作-创建动作
名称:Action-Email
默认接收人:故障{TRIGGER.STATUS},服务器:{HOSTNAME1}发生:
{TRIGGER.NAME}故障!
默认信息:
告警主机:{HOSTNAME1}
告警时间:{EVENT.DATE} {EVENT.TIME}
告警等级:{TRIGGER.SEVERITY}
告警信息: {TRIGGER.NAME}
告警项目:{TRIGGER.KEY1}
问题详情:{ITEM.NAME}:{ITEM.VALUE}
当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}
事件ID:{EVENT.ID}
恢复信息:打钩
恢复主旨:恢复{TRIGGER.STATUS}, 服务器:{HOSTNAME1}:
{TRIGGER.NAME}已恢复!
恢复信息:
告警主机:{HOSTNAME1}
告警时间:{EVENT.DATE} {EVENT.TIME}
告警等级:{TRIGGER.SEVERITY}
告警信息: {TRIGGER.NAME}
告警项目:{TRIGGER.KEY1}
问题详情:{ITEM.NAME}:{ITEM.VALUE}
当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}
事件ID:{EVENT.ID}
已启用:打钩
切换到操作选项
新的
操作类型:送出信息
送到用户:添加
默认信息:打钩
用户:勾选Admin
选择
仅送到:Email
存档
四、测试Zabbix报警
关闭Zabbix客户端服务
service zabbix_agentd stop
查看xxx@163.com邮箱,会收到报警邮件
再开启Zabbix客户端服务
service zabbix_agentd start
查看xxx@163.com邮箱,会收到恢复邮件
使用Zabbix服务端本地邮箱账号发送邮件设置完成。
第二种:使用外部邮箱账号发送报警邮件设置
一、关闭sendmail或者postfix
service sendmail stop #关闭
chkconfig sendmail off #禁止开机启动
service postfix stop
chkconfig postfix off
备注:
使用外部邮箱账号时,不需要启动sendmail或者postfix
如果在sendmail或者postfix启动的同时使用外部邮箱发送报警邮件,首先会读取外部邮箱
配置信息。
二、安装邮件发送工具mailx
yum install mailx #安装
CentOS 5.x 编译安装mailx,直接yum安装的mailx版本太旧,使用外部邮件发送会有问题。
yum remove mailx #卸载系统自带的旧版mailx
下载mailx:
tar jxvf mailx-12.4.tar.bz2 #解压
cd mailx-12.4 #进入目录
make #编译
make install UCBINSTALL=/usr/bin/install #安装
ln -s /usr/local/bin/mailx /bin/mail #创建mailx到mail的软连接
ln -s /etc/nail.rc /etc/mail.rc #创建mailx配置文件软连接
whereis mailx #查看安装路径
mailx -V #查看版本信息
三、配置Zabbix服务端外部邮箱
vi /etc/mail.rc #编辑,添加以下信息
set from=xxx@163.com *** tp= *** tp.163.com
set *** tp-auth-user=xxx@163.com
*** tp-auth-password=123456
set *** tp-auth=login
:wq! #保存退出
echo "zabbix test mail" |mail -s "zabbix" yyy@163.com
#测试发送邮件,标题zabbix,邮件内容:zabbix test
mail,发送到的邮箱:yyy@163.com
#这时候,邮箱yyy@163.com会收到来自xxx@163.com的测试邮件
四、配置Zabbix服务端邮件报警
1、打开Zabbix
管理-示警媒介类型-创建媒体类型
名称:Sendmail
类型:脚本
脚本名称:sendmail.sh
已启用:勾选
存档
2、设置Zabbix用户报警邮箱地址
组态-用户-Admin (Zabbix Administrator)
切换到示警媒介-添加
类型:Sendmail
收件人:xxx@163.com
其他默认即可,也可
以根据需要设置
状态:已启用
存档
3、设置Zabbix触发报警的动作
组态-动作-创建动作
名称:Action-Email
默认接收人:故障{TRIGGER.STATUS},服务器:{HOSTNAME1}发生:
{TRIGGER.NAME}故障!
默认信息:
告警主机:{HOSTNAME1}
告警时间:{EVENT.DATE} {EVENT.TIME}
告警等级:{TRIGGER.SEVERITY}
告警信息: {TRIGGER.NAME}
告警项目:{TRIGGER.KEY1}
问题详情:{ITEM.NAME}:{ITEM.VALUE}
当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}
事件ID:{EVENT.ID}
恢复信息:打钩
恢复主旨:恢复{TRIGGER.STATUS}, 服务器:{HOSTNAME1}:
{TRIGGER.NAME}已恢复!
恢复信息:
告警主机:{HOSTNAME1}
告警时间:{EVENT.DATE} {EVENT.TIME}
告警等级:{TRIGGER.SEVERITY}
告警信息: {TRIGGER.NAME}
告警项目:{TRIGGER.KEY1}
问题详情:{ITEM.NAME}:{ITEM.VALUE}
当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1}
事件ID:{EVENT.ID}
已启用:打钩
切换到操作选项
新的
操作类型:送出信息
送到用户:添加
默认信息:打钩
选择用户:Admin
选择
仅送到:Sendmail
存档
4、添加Zabbix服务端邮件发送脚本
cd /usr/local/zabbix/share/zabbix/alertscripts #进入脚本存放目录
vi sendmail.sh #编辑,添加以下代码
#!/bin/sh
echo "$3" | mail -s "$2" $1
:wq! #保存退出
chown zabbix.zabbix
/usr/local/zabbix/share/zabbix/alertscripts/sendmail.sh
#设置脚本所有者为zabbix用户
chmod +x /usr/local/zabbix/share/zabbix/alertscripts/sendmail.sh
#设置脚本执行权限
五、测试Zabbix报警
关闭Zabbix客户端服务
service zabbix_agentd stop
查看xxx@163.com邮箱,会收到报警邮件
再开启Zabbix客户端服务
service zabbix_agentd start
查看xxx@163.com邮箱,会收到恢复邮件
使用外部邮箱账号发送报警邮件设置完成。
至此,Zabbix邮件报警设置完成。
如何配置zabbix 3.0 用mail邮件方式告警support for *** tp authentication was not
前提条件:
(1) zabbix服务器端已经成功安装并且运行。
(2) zabbix客户端已经成功建立并且运行。
1 下载并且安装m *** tp软件
tar jxvf m *** tp-1.4.32.tar.bz2
cd m *** tp-1.4.32
./configure--prefix=/usr/local/m *** tp
Make
Make install
2、手动建立配置文件,输入外部 *** tp地址
mkdir –p /usr/local/m *** tp/etc
vi /usr/local/m *** tp/etc/m *** tprc
添加以下内容
account default
host *** tp.sohu.com #你的发送邮件服务器
port 25
from zabbix2014@sohu.com #要从哪个邮箱发出
auth login
tls off
user zabbix2014 #邮箱用户名
password xxxxx-xxx #邮箱密码,如果你觉得不安全可以把文件改为600属性
logfile /var/log/mmlog
保存退出。
3、简单测试一下
/usr/local/m *** tp/bin/m *** tp [url=mailto:%20zabbix2014@sohu.com]zabbix2014@sohu.com[/url]
hello,test
ctrl d
cat /usr/local/m *** tp/m *** tp.log 看看有没有成功。
然后再到sohu邮箱中,看看信收到没有
报错如下
[iyunv@cache-2 m *** tp-1.4.32]# /usr/local/m *** tp/bin/m *** tp zabbix2014@sohu.com
m *** tp: authentication failed (method LOGIN)
m *** tp: server message: 535 5.7.0 Invalid result
m *** tp: could not send mail (account default from /usr/local/m *** tp/etc/m *** tprc)
Google之后,需要安装 mutt组件
4、下面开始安装 MUTT如果是CentOS的话直接用yum就好了
yum install mutt
安装完成后要手动给他建立一个配置文件,
vim /etc/Muttrc
setsendmail="/usr/local/m *** tp/bin/m *** tp" #你的m *** tp命令路径
set use_from=yes
set realname="zabbix2014@sohu.com"
set editor="vim"
简单的4行就可以了
好了,让我们来测试一下吧!
测试一下:echo"test mail" | mutt -s "test" zabbix2014@sohu.com
OK,测试了下,能收到已经发送的email,
echo"test mail 2014 content tom 2" | mutt -s "test 2014 title2" zabbix2014@sohu.com
5、 创建 zabbix用于发送邮件的脚本
脚本放在什么位置随便,但是要保证zabbix可以找到!
1)vim/usr/bin/zabbix2014,并写入如下内容:
#!/bin/bash
echo "$3" | mutt -s "$2"$1 # $3表示邮件内容、$2表示邮件标题、$1表示收件人
(2)chmod a+x /usr/bin/zabbix2014
6、 zabbix配置
(1)创建meida types
1.登录到zabbix,进入“Administration" ”Media types",点击右上角“Create Media Type"。 Description填"mediatype-zabbix2014"或其它名称,Type选择"Script",Script填” zabbix2014”。
2.点击save保存,
7、创建actions
1.登录到zabbix,进入"Configation" "Actions",点击右上角"Create Actions"。输入Name “action-zabbix2014” ,其它都默认点击右侧“Action Operations"下的"New"按钮,"Operation Type"选择"Send message","Send Message to"选择一个或多个要发送消息的用户组,”Send only to"选择我们之前新增的mediatype-zabbix2014。
2.点击save保存,
8、zabbix用户配置
登录到zabbix, 进入"Adimistration" "Users",在之前选定要发送消息的组里的Members栏位里选择一个用户,例如选择AdminZabbix用户。
在用户信息修改界面最下方的”Media"处点击"Add"按钮。
Type选择"mediatype- zabbix2014",Send to填入收件人地址,点击Add添加。
点击"Save"保存配置。
ocker run -d --name alertmanager -p 9093:9093 -v /usr/local/Prometheus/alertmanager/alertmanager.yml:/etc/alertmanager/alertmanage
er 运行 Prometheus,挂载本地时区文件 docker run --restart always -e TZ=Asia/Shanghai --hostname prometheus --name promet
t mail" | mutt -s "test" zabbix2014@sohu.comOK,测试了下,能收到已经发送的email,echo"test mail 2014 content tom 2" | mutt -s
置文件,待会才能映射到alertmanager容器里的/etc/alertmanager目录下global:全局配置 resolve_timeout: 问题解决的超时时间 smtp_from: 发送告警邮件的邮箱账号
_wait: 分组等待时间 group_interval: 5m 每组时间间隔 repeat_interval: 10m 重复间隔 receiver: 接收方式,