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

基于上一篇博客(https://blog.51cto.com/14320361/2461277 继续进行部署

一、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、网络等等)

服务过程

  1. 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上抓取数据。
  2. 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 网络 等

三、实验环境

docker01 docker02 docker03
192.168.1.11 192.168.1.13 192.168.1.20
NodeEXporter NodeEXporter NodeEXporter
cAdvisor cAdvisor cAdvisor
Prometheus 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: '[email protected]'   #自己邮箱地址
  smtp_smarthost: 'smtp.qq.com:465'  #qq的邮箱地址及端口
  smtp_auth_username: '[email protected]'  
  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: '[email protected]'
    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 服务。

  1. 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监控报警及自定义邮件模板

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

  1. 每次停止/恢复服务后,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']

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

  3. 报警触发后,每隔 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" }}[email protected]{{ end }}
{{ define "email.to" }}[email protected]{{ 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: '[email protected]'
  smtp_smarthost: 'smtp.qq.com:465'
  smtp_auth_username: '[email protected]'
  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 表达式验证值来定义一些列的告警规则,来丰富日常工作中需要的各种告警。
这里,我们只演示了如何通过 AlertManager 来配置发送邮件告警,其他的告警方式,可以参考 官网文档 来配置,这里就不再演示了。下一篇,我们继续通过 Prometheus 来监控 SpringBoot 工程应用程序 JVM 情况,以及自定义 metrics 来实现特定功能的监控。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章