基于上一篇博客继续进行部署

一、Prometheus & AlertManager 介绍

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

二、基本概念

Prometheus
官网(https://prometheus.io/)
是一套开源的监控和报警系统,也是一个时序数据库。
架构图

基本原理

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://:9093 可以看到默认提供的 UI 页面,不过现在是没有任何告警信息的,因为我们还没有配置报警规则来触发报警。

配置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: 5msmtp_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: falsesmtp_hello: 'qq.com'
route:group_by: ['alertname']group_wait: 5sgroup_interval: 5srepeat_interval: 5mreceiver: 'email'           #接收者改为邮箱
receivers:
- name: 'email'email_configs:- to: '2877364346@qq.com'send_resolved: trueinhibit_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 服务。

2、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-uprules:- alert: node-upexpr: up{job="prometheus"} == 0    #{job="prometheus"}中的prometheus需要和prometheus配置文件23行的相同for: 15slabels:severity: 1team: nodeannotations: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 Alert 告警状态有三种状态:Inactive、Pending、Firing。

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

挂起docker02

会收到邮件

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

  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" }}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: 5msmtp_from: '2877364346@qq.com'smtp_smarthost: 'smtp.qq.com:465'smtp_auth_username: '2877364346@qq.com'smtp_auth_password: 'evjmqipqezlbdfij'smtp_require_tls: falsesmtp_hello: 'qq.com'
templates:                        #添加模板- '/etc/alertmanager-tmpl/*.tmpl'   #添加路径route:group_by: ['alertname']group_wait: 5sgroup_interval: 5srepeat_interval: 5mreceiver: '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

收到邮件

当然我们还可以配置邮件标题,这里就不在演示了,详细配置可参考 这里。这里除了监控节点是否存活外,还可以监控很多很多指标,例如 CPU 负载告警、Mem 使用量告警、Disk 存储空间告警、Network 负载告警等等,这些都可以通过自定义 PromQL 表达式验证值来定义一些列的告警规则,来丰富日常工作中需要的各种告警。
这里,我们只演示了如何通过 AlertManager 来配置发送邮件告警,其他的告警方式,可以参考 官网文档 来配置,这里就不再演示了。下一篇,我们继续通过 Prometheus 来监控 SpringBoot 工程应用程序 JVM 情况,以及自定义 metrics 来实现特定功能的监控。

搭建Prometheus监控报警相关推荐

  1. 从零搭建Prometheus监控报警系统

    从零开始搭建Prometheus自动监控报警系统 从零搭建Prometheus监控报警系统 什么是Prometheus? Prometheus是由SoundCloud开发的开源监控报警系统和时序列数据 ...

  2. prometheus监控报警部署Alertmanager

    Prometheus将告警分为两个部分:Prometheus 和 Alertmanager.其中Prometheus配置告警触发规则,对指标进行监控和计算,将再将告警信息发送到Alertmanager ...

  3. 化整为零,一步一步教你搭建Prometheus监控报警系统

    什么是Prometheus? Prometheus是由SoundCloud开发的开源监控报警系统和时序列数据库(TSDB).Prometheus使用Go语言开发,是Google BorgMon监控系统 ...

  4. catcti监控linux主机,CentOS7搭建Prometheus 监控Linux主机

    简介 prometheus可以拆分成多个节点进行指标收集. 安装prometheus wget -c https://github.com/prometheus/prometheus/releases ...

  5. Prometheus监控docker容器

    @ Prometheus(普罗米修斯)监控 Prometheus是最初在SoundCloud上构建的开源系统监视和警报工具包 .自2012年成立以来,许多公司和组织都采用了Prometheus,该项目 ...

  6. Prometheus监控的最佳实践——关于监控的3项关键指标

    本文来自Weaveworks的工程师Anita Burhrle在Rancher Labs与Weaveworks联合举办的Online Meetup上的技术分享.在此次分享中,嘉宾们讨论了如何使用Ran ...

  7. prometheus监控告警功能

    prometheus监控K8S 监控告警功能 alertmanager邮箱告警配置 首先开通SMTP服务,QQ邮箱:设置–帐号–开通POP3/SMTP服务,记住生成的密码(其它邮箱同理) 编辑prom ...

  8. 【实战】本机用docker搭建elk环境并接入frostmourne,实现监控报警效果

    本篇文章着重的是实战方面,基于本机使用docker来搭建elk环境,然后接入frostmourne来实现监控.报警.分析系统,后续会再发文来介绍如何将此监控报警发布到生产环境. 本机用docker搭建 ...

  9. 搭建Prometheus+Grafana的云平台监控系统

    1.1 Prometheus和Grafana概述 1.1.1 Prometheus概述 Prometheus(普罗米修斯)是一套开源的监控&报警&时间序列数据库的组合,起始是由Soun ...

最新文章

  1. 把运维和开发放一起就是DevOps?还差得远!
  2. unity 总结(一)
  3. 从0到1构建支撑企业自动化运维体系
  4. calendR :为你定制私人专属日历
  5. 程序员,Linux 下如何避免从删库到跑路的悲剧?
  6. 文本区 JTextArea 的使用
  7. iPhone手机硬件拆解介绍
  8. pythoninterpreter_java-Jython :: PythonInterpreter可以使用哪些模块...
  9. php-ews发送邮件,PHP-EWS将电子邮件移动到文件夹
  10. 判断三角形 java_java中判断是否三角形的方法
  11. echarts地图城市坐标
  12. mysql之第n高的薪水
  13. 查看网络交换机光口的光功率
  14. Linux应用开发基础
  15. 最近网络很火的支付宝 收款码 小议
  16. processing
  17. CCNA与CCNP的路该如何走?
  18. 优秀健身房管理系统的十大判断标准
  19. HTML- 超美超简单的相册
  20. c语言pta整数四则运算,练习2-9 整数四则运算

热门文章

  1. css3中的属性选择器有哪些,CSS3中属性选择器使用方法详解
  2. 开发资源总结 (转载)
  3. 景联文科技:为扫地机器人AI训练提供数据采集标注解决方案
  4. 安卓手机用ADB命令打印APP的崩溃日志
  5. Jsp中的forward 和 redirect
  6. 课堂练习三及课下作业
  7. WebShell连接工具(中国菜刀、WeBaCoo、Weevely)使用
  8. VLC-3.0全部详细参数
  9. 《孙子兵法》帮你玩转团队管理
  10. 人工智能时代:软件中的人工智能将如何改变程序员的角色