如何搭建Prometheus监控报警及自定义邮件模板

103次阅读
没有评论

共计 8308 个字符,预计需要花费 21 分钟才能阅读完成。

丸趣 TV 小编给大家分享一下如何搭建 Prometheus 监控报警及自定义邮件模板,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

一、Prometheus AlertManager 介绍

Prometheus 是一套开源的系统监控、报警、时间序列数据库的组合,最初有 SoundCloud 开发的,后来随着越来越多公司使用,于是便独立成开源项目。Alertmanager 主要用于接收 Prometheus 发送的告警信息,它支持丰富的告警通知渠道,例如邮件、微信、钉钉、Slack 等常用沟通工具,而且很容易做到告警信息进行去重,降噪,分组等,是一款很好用的告警通知系统。

二、基本概念

Prometheus
官网(https://prometheus.io/)
是一套开源的监控和报警系统,也是一个时序数据库。
架构图
如何搭建 Prometheus 监控报警及自定义邮件模板

基本原理

Prometheus 的基本原理是通过 HTTP 协议周期性抓取被监控组件的状态,任意组件只要提供对应的 HTTP 接口就可以接入监控。不需要任何 SDK 或者其他的集成过程。这样做非常适合做虚拟化环境监控系统,比如 VM、Docker、Kubernetes 等。输出被监控组件信息的 HTTP 接口被叫做 exporter。目前互联网公司常用的组件大部分都有 exporter 可以直接使用,比如 Varnish、Haproxy、Nginx、MySQL、Linux 系统信息(包括磁盘、内存、CPU、网络等等)。

服务过程

Prometheus Daemon 负责定时去目标上抓取 metrics(指标)数据,每个抓取目标需要暴露一个 http 服务的接口给它定时抓取。Prometheus 支持通过配置文件、文本文件、Zookeeper、Consul、DNS SRV Lookup 等方式指定抓取目标。Prometheus 采用 PULL 的方式进行监控,即服务器可以直接通过目标 PULL 数据或者间接地通过中间网关来 Push 数据。
2.Prometheus 在本地存储抓取的所有数据,并通过一定规则进行清理和整理数据,并把得到的结果存储到新的时间序列中。
3.Prometheus 通过 PromQL 和其他 API 可视化地展示收集的数据。Prometheus 支持很多方式的图表可视化,例如 Grafana、自带的 Promdash 以及自身提供的模版引擎等等。Prometheus 还提供 HTTP API 的查询方式,自定义所需要的输出。
4.PushGateway 支持 Client 主动推送 metrics 到 PushGateway,而 Prometheus 只是定时去 Gateway 上抓取数据。

Alertmanager 是独立于 Prometheus 的一个组件,可以支持 Prometheus 的查询语句,提供十分灵活的报警方式。

工作流程

通过 exporters 从数据源主动拉取数据(metrics),保存到时序数据库(TSDB)中,可以通过 HTTP Server 访问,同时可以发起报警,对于数据库中的时序数据,提供 PromeQL 进行查询,提供给 web UI 或者可视化系统 Grafana 等展示。

Grafana

官网(https://grafana.com/)
开源的数据分析和监控平台
有不同的 dashboards 支持不同类型的数据可视化

Exporters

数据采集
Prometheus 从不同的 exorters 中拉取数据,有不同的 exporter 支持不同的数据源
node-exporter 支持机器基本的数据 比如 cpu mem 网络 等

三、实验环境 docker01docker02docker03192.168.1.11192.168.1.13192.168.1.20NodeEXporterNodeEXporterNodeEXportercAdvisorcAdvisorcAdvisorPrometheus Server 空空 Grafana 空空

全部关闭防火墙,禁用 selinux

四、设置 prometheus 监控报警

接下来,我们需要启动 AlertManager 来接受 Prometheus 发送过来的报警信息,并执行各种方式的告警。同样以 Docker 方式启动 AlertManager,最简单的启动命令如下:

$ docker run –name alertmanager -d -p 9093:9093 prom/alertmanager:latest
这里 AlertManager 默认启动的端口为 9093,启动完成后,浏览器访问 http:// IP :9093 可以看到默认提供的 UI 页面,不过现在是没有任何告警信息的,因为我们还没有配置报警规则来触发报警。
如何搭建 Prometheus 监控报警及自定义邮件模板

配置 AlertManager

AlertManager:用来接收 prometheus 发送来的报警信息,并且执行设置好的报警方式、报警内容。

下载镜像

[root@docker01 ~]# docker pull alertmanager
// 下载 alertmanager 镜像

基于 alertmanager 运行一台容器

[root@docker01 ~]# docker run -d --name alertmanager -p 9093:9093 prom/alertmanager:latest

配置路由转发

[root@docker01 ~]# echo net.ipv4.ip_forward = 1   /etc/sysctl.conf 
[root@docker01 ~]# sysctl -p

在部署 alertmanager 之前,我们需要对它的配置文件进行修改, 所以我们先运行一个容器,先将其配置文件拷贝出来。

[root@docker01 ~]# docker cp alertmanager:/etc/alertmanager/alertmanager.yml ./
// 拷贝 alertmanager 的配置文件到本地

修改 alertmanager 的配置文件配置文件简单介绍

AlertManager:用来接收 Prometheus 发送的报警信息,并且执行设置好的报警方式,报警内容。

AlertManager.yml 配置文件:

global:全局配置,包括报警解决后的超时时间、SMTP 相关配置、各种渠道通知的 API 地址等消息。

route:用来设置报警的分发策略。

receivers:配置报警信息接收者信息。

inhibit_rules:抑制规则配置,当存在与另一个匹配的报警时,抑制规则将禁用用于有匹配的警报。

修改配置文件

[root@docker01 ~]# vim alertmanager.yml 
// 修改 alertmanager 配置文件
global:
 resolve_timeout: 5m
 smtp_from:  2877364346@qq.com  # 自己邮箱地址
 smtp_smarthost:  smtp.qq.com:465  #qq 的邮箱地址及端口
 smtp_auth_username:  2877364346@qq.com  
 smtp_auth_password:  osjppnjkbuhcdfff  # 需要在 qq 邮箱获取授权码
 smtp_require_tls: false
 smtp_hello:  qq.com 
route:
 group_by: [alertname]
 group_wait: 5s
 group_interval: 5s
 repeat_interval: 5m
 receiver:  email  # 接收者改为邮箱
receivers:
- name:  email 
 email_configs:
 - to:  2877364346@qq.com 
 send_resolved: true
 inhibit_rules:
 - source_match:
 severity:  critical 
 target_match:
 severity:  warning 
 equal: [alertname ,  dev ,  instance]

以上配置我反复试验后,发现不同的环境参数配置也不一样,调试期间出现了各种报错问题,将其中几个关键的配置说明一下:

1.smtp_smarthost: 这里为 QQ 邮箱 SMTP 服务地址,官方地址为 smtp.qq.com 端口为 465 或 587,同时要设置开启 POP3/SMTP 服务。

smtp_auth_password: 这里为第三方登录 QQ 邮箱的授权码,非 QQ 账户登录密码,否则会报错,获取方式在 QQ 邮箱服务端设置开启 POP3/SMTP 服务时会提示。
3.smtp_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 验证。

重新运行 alertmanager 容器

[root@docker01 ~]# docker rm -f alertmanager
// 删除 alertmanager 容器
[root@docker01 ~]# docker run -d --name alertmanager -v /root/alertmanager.yml:/etc/alertmanager/alertmanager.yml -p 9093:9093 prom/alertmanager:latest 
// 运行一台新的 alertmanager 容器,记得挂载配置文件

Prometheus 配置和 alertmanager 报警规则创建存放规则的目录

[root@docker01 ~]# mkdir -p prometheus/rules
// 创建规则目录
[root@docker01 ~]# cd prometheus/rules/

编写规则

[root@docker01 rules]# vim node-up.rules 
groups:
- name: node-up
 rules:
 - alert: node-up
 expr: up{job= prometheus} == 0 #{job= prometheus}中的 prometheus 需要和 prometheus 配置文件 23 行的相同
 for: 15s
 labels:
 severity: 1
 team: node
 annotations:
 summary:  {{ $labels.instance }}  已停止运行超过  15s!

说明一下:该 rules 目的是监测 node 是否存活,expr 为 PromQL 表达式验证特定节点 job= node-exporter 是否活着,for 表示报警状态为 Pending 后等待 15s 变成 Firing 状态,一旦变成 Firing 状态则将报警发送到 AlertManager,labels 和 annotations 对该 alert 添加更多的标识说明信息,所有添加的标签注解信息,以及 prometheus.yml 中该 job 已添加 label 都会自动添加到邮件内容中,更多关于 rule 详细配置可以参考 这里。

修改 prometheus 配置文件

[root@docker01 ~]# vim prometheus.yml 
# Alertmanager configuration #7
alerting:
 alertmanagers:
 - static_configs:
 - targets:
 - 192.168.1.11:9093 # 去注释修改
# Load rules once and periodically evaluate them according to the global  evaluation_interval . #14 行
rule_files:
 -  /usr/local/prometheus/rules/*.rules  # 添加(这个路径是 prometheus 容器内的路径)

注意: 这里 rulefiles 为容器内路径,需要将本地 node-up.rules 文件挂载到容器内指定路径,修改 Prometheus 启动命令如下,并重启服务。

重新运行 prometheus 容器

[root@docker01 ~]# docker rm -f prometheus 
// 删除 prometheus 容器
[root@docker01 ~]# docker run -d -p 9090:9090 --name prometheus --net=host -v /root/prometheus.yml:/etc/prometheus/prometheus.yml -v /root/prometheus/rules/node-up.rules:/usr/local/prometheus/rules/node-up.rules prom/prometheus
// 运行一台新的 alertmanager 容器,记得挂载规则文件

浏览器验证一下 http://192.168.1.11:9090/rules

如何搭建 Prometheus 监控报警及自定义邮件模板

这里说明一下 Prometheus Alert 告警状态有三种状态:Inactive、Pending、Firing。

Inactive:非活动状态,表示正在监控,但是还未有任何警报触发。
Pending:表示这个警报必须被触发。由于警报可以被分组、压抑 / 抑制或静默 / 静音,所以等待验证,一旦所有的验证都通过,则将转到 Firing 状态。
Firing:将警报发送到 AlertManager,它将按照配置将警报的发送给所有接收者。一旦警报解除,则将状态转到 Inactive,如此循环。

挂起 docker02

如何搭建 Prometheus 监控报警及自定义邮件模板

会收到邮件
如何搭建 Prometheus 监控报警及自定义邮件模板

这里有几个地方需要解释一下:

每次停止 / 恢复服务后,15s 之后才会发现 Alert 状态变化,是因为 prometheus.yml 中 global – scrape_interval: 15s 配置决定的,如果觉得等待 15s 时间太长,可以修改小一些,可以全局修改,也可以局部修改。例如局部修改 node-exporter 等待时间为 5s。
… – job_name: node-exporter     scrape_interval: 5s     file_sd_configs:       – files: [/usr/local/prometheus/groups/nodegroups/*.json]

Alert 状态变化时会等待 15s 才发生改变,是因为 node-up.rules 中配置了 for: 15s 状态变化等待时间。

报警触发后,每隔 5m 会自动发送报警邮件(服务未恢复正常期间),是因为 alertmanager.yml 中 route – repeat_interval: 5m 配置决定的。

五、AlertManager 自定义邮件模板创建模板目录

[root@docker01 ~]# cd prometheus
// 进入之前创建的 prometheus 目录
[root@docker01 prometheus]# mkdir alertmanager-tmpl
// 创建 AlertManager 模板目录

看到上边默认发送的邮件模板,虽然所有核心的信息已经包含了,但是邮件格式内容可以更优雅直观一些,那么,AlertManager 也是支持自定义邮件模板配置的,首先新建一个模板文件

编写模板规则

[root@docker01 prometheus]# vim email.tmpl 
{{ define  email.from  }}2877364346@qq.com{{ end }}
{{ define  email.to  }}2877364346@qq.com{{ end }}
{{ define  email.to.html  }}
{{ range .Alerts }}
=========start========== br 
告警程序: prometheus_alert br 
告警级别: {{ .Labels.severity }}  级 br 
告警类型: {{ .Labels.alertname }} br 
故障主机: {{ .Labels.instance }} br 
告警主题: {{ .Annotations.summary }} br 
触发时间: {{ .StartsAt.Format  2019-08-04 16:58:15  }}  br 
=========end========== br 
{{ end }}
{{ end }}

简单说明一下,上边模板文件配置了 email.from、email.to、email.to.html 三种模板变量,可以在 alertmanager.yml 文件中直接配置引用。这里 email.to.html 就是要发送的邮件内容,支持 Html 和 Text 格式,这里为了显示好看,采用 Html 格式简单显示信息。下边 {{range .Alerts}} 是个循环语法,用于循环获取匹配的 Alerts 的信息,下边的告警信息跟上边默认邮件显示信息一样,只是提取了部分核心值来展示。然后,需要增加 alertmanager.yml 文件 templates 配置如下:

修改 alertmanager 的配置文件

[root@docker01 ~]# vim alertmanager.yml 
global:
 resolve_timeout: 5m
 smtp_from:  2877364346@qq.com 
 smtp_smarthost:  smtp.qq.com:465 
 smtp_auth_username:  2877364346@qq.com 
 smtp_auth_password:  evjmqipqezlbdfij 
 smtp_require_tls: false
 smtp_hello:  qq.com 
templates: # 添加模板
 -  /etc/alertmanager-tmpl/*.tmpl  # 添加路径
 route:
 group_by: [alertname]
 group_wait: 5s
 group_interval: 5s
 repeat_interval: 5m
 receiver:  email 
 receivers:
- name:  email 
 email_configs: 
 - to:  {{ template  email to  }}  # 修改
 html:  {{ template  email.to.html  .}}  # 添加
 send_resolved: true # 删除
 inhibit_rules:
 - source_match:
 severity:  critical 
 target_match:
 severity:  warning 
 equal: [alertname ,  dev ,  instance]

重新运行 alertmanager 容器

[root@docker01 ~]# docker rm -f alertmanager
// 删除 alertmanager 容器
[root@docker01 ~]# docker run -itd --name alertmanager -p 9093:9093 -v /root/alertmanager.yml:/etc/alertmanager/alertmanager.yml -v /root/prometheus/alertmanager-tmpl:/etc/alertmanager-tmpl prom/alertmanager:latest
// 运行一台新的 alertmanager 容器,记得挂载配置文件

挂起 docker02

如何搭建 Prometheus 监控报警及自定义邮件模板

收到邮件

如何搭建 Prometheus 监控报警及自定义邮件模板

当然我们还可以配置邮件标题,这里就不在演示了,详细配置可参考 这里。这里除了监控节点是否存活外,还可以监控很多很多指标,例如 CPU 负载告警、Mem 使用量告警、Disk 存储空间告警、Network 负载告警等等,这些都可以通过自定义 PromQL 表达式验证值来定义一些列的告警规则,来丰富日常工作中需要的各种告警。

以上是“如何搭建 Prometheus 监控报警及自定义邮件模板”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注丸趣 TV 行业资讯频道!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-25发表,共计8308字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)