Prometheus+Grafana+Alertmanager构建容器监控、数据可视化与邮件告警一体化平台
Prometheus+Grafana+Alertmanager构建容器监控、数据可视化与邮件告警一体化平台
文章目录
Prometheus容器监控
| IP地址 | 主机名 |
|---|---|
| 192.168.0.130 | prometheus |
| 192.168.0.120 | node02 |
| 192.168.0.30 | node01 |
Prometheus介绍
Prometheus(普罗米修斯)基于Go语言开发,是一套开源且免费的监控系统。
Prometheus于2016年加入CNCF(云原生基金会)成为继Kubernetes之后的第二个托管项目,目前主要应用在云原生与容器领域的监控解决方案。
Prometheus使用时序数据库TSDB(Time Series Database)存储指标数据,既指标信息与记录的时间戳一起存储的特点。
官网地址:https://Prometheus.io
项目托管:https://github.com/prometheus
Prometheus特点
作为新一代的监控系统框架,Prometheus具备以下特点:
- 基于HTTP的 pull(拉取)方式采集指标数据,利用TSDB(时序数据库)存储指标数据
- PromQL 作为TSDB数据库的灵活查询语言,可完成复杂的查询操作
- PushGateway作为Prometheus的代理节点,可用于分布式监控
- 可通过配置文件与动态发现规则发现监控目标
- 提供web界面图形化数据展示,支持第三方数据展示(如:Grafana)
软件包下载
Prometheus相关的软件包是编译后的二进制包,也不依赖于任何的第三方软件,只需要下载对应平台的二进制包,解压并且添加基本的配置即可正常启动Prometheus
对于非Docker用户,可以从https://prometheus.io/download/找到最新版本的Prometheus Sevrer软件包
需要下载的软件包:
prometheus #服务端程序,提供监控服务
node_exporter #Linux主机被控端程序,用于采集节点监控指标数据
alertmanager #报警程序
下载方式
#下载prometheus
[root@prometheus ~]# wget https://github.com/prometheus/prometheus/releases/download/v2.53.4/prometheus-2.53.4.linux-amd64.tar.gz
#下载alertmanager
[root@prometheus ~]# wget https://github.com/prometheus/alertmanager/releases/download/v0.28.1/alertmanager-0.28.1.linux-amd64.tar.gz
#下载node_exporter
[root@prometheus ~]# wget https://github.com/prometheus/node_exporter/releases/download/v1.9.1/node_exporter-1.9.1.linux-amd64.tar.gz

安装node_exporter
提示:在Prometheus主机操作
软件包:node_exporter-1.9.1.linux-amd64.tar.gz
#解压软件包
tar -xf node_exporter-1.9.1.linux-amd64.tar.gz -C /usr/local/
#进入解压路径并修改目录名字
cd /usr/local/
mv node_exporter-1.9.1.linux-amd64/ node_exporter
#添加系统启动服务(可通过systemctl命令管理服务,否则服务以前台形式运行,占用前台终端)
vim /etc/systemd/system/node_exporter.service
[Unit]
Description=node_exporter
After=network.target
[Service]
Restart=on-failure
ExecStart=/usr/local/node_exporter/node_exporter
[Install]
WantedBy=multi-user.target
#启动服务&&设置服务随机自启&&查看服务状态
systemctl start node_exporter.service
systemctl status node_exporter.service
systemctl enable node_exporter.service
#查看服务端口信息
ss -ntlpl | grep node_exporter
tcp LISTEN 0 128 :::9100 :::* users:(("node_exporter",pid=56984,fd=3))
安装Prometheus
提示:在prometheus主机操作
软件包:prometheus-2.53.4.linux-amd64.tar.gz
#解压软件包
tar -xf prometheus-2.53.4.linux-amd64.tar.gz -C /usr/local
#进入解压路径
cd /usr/local/
mv prometheus-2.53.4.linux-amd64/ prometheus
#添加系统启动服务,指定了配置文件、数据库文件地址,指定了prometheus的端口
vim /etc/systemd/system/prometheus.service
[Unit]
Description=Prometheus Server
Documentation=https://prometheus.io/docs/introduction/overview/
After=network-online.target
[Service]
Restart=on-failure
ExecStart=/usr/local/prometheus/prometheus --config.file=/usr/local/prometheus/prometheus.yml --storage.tsdb.path=/var/lib/prometheus --web.external-url=http://0.0.0.0:9090
[Install]
WantedBy=multi-user.target
#启动服务&&设置服务随机自启&&查看服务运行状态
systemctl start prometheus
systemctl status prometheus
systemctl enable prometheus
#查看服务端口信息
ss -ntlp | grep prometheus
添加被控主机
提示:在node01安装node_exporter
#解压软件包
tar -xf node_exporter-1.9.1.linux-amd64.tar.gz -C /usr/local/
#进入解压路径并修改目录名字
cd /usr/local/
mv node_exporter-1.9.1.linux-amd64/ node_exporter
#添加系统启动服务(可通过systemctl命令管理服务,否则服务以前台形式运行,占用前台终端)
vim /etc/systemd/system/node_exporter.service
[Unit]
Description=node_exporter
After=network.target
[Service]
Restart=on-failure
ExecStart=/usr/local/node_exporter/node_exporter
[Install]
WantedBy=multi-user.target
#启动服务&&设置服务随机自启&&查看服务状态
systemctl start node_exporter.service
systemctl status node_exporter.service
systemctl enable node_exporter.service
#查看服务端口信息
ss -ntlpl | grep node_exporter
tcp LISTEN 0 128 :::9100 :::* users:(("node_exporter",pid=56984,fd=3))
部署Cadvisor
Cadvisor是由Google(谷歌)公司开发的一款开源的容器度量和指标数据采集可视化系统,专门用于获取容器内的指标数据,它被内嵌到k8s中作为k8s的监控组件。
cadvisor是用来监控容器的,可以监控你的docker容器
docker run \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:ro \
--volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
--volume=/dev/disk/:/dev/disk:ro \
--publish=8888:8080 \
--detach=true \
--name=cadvisor \
google/cadvisor
Cadvisor为prometheus提供了时序数据格式,该格式为prometheus识别的格式。
访问cadvisor:http://server_ip:8888 我的是192.168.0.30:8888
添加监控对象
提示:prometheus主机添加监控对象
主配置文件为prometheus.yml,配置文件遵循的是YAML语法格式,整体分为三个模块 global,rule_files,和scrape_configs
#备份配置文件
cd /usr/local/prometheus
cp prometheus.yml prometheus.yml.bak
vim prometheus.yml
#global模块为Prometheus 服务器的全局配置
global:
scrape_interval: 15s # 抓取指标数据时间间隔,默认为1分钟
evaluation_interval: 15s # 规则发现时间间隔,默认为1分钟
# scrape_timeout is set to the global default (10s). # 收集数据超时时间,默认10秒
# alerting模块用于关联prometheus报警配置,需指定alertmanager组件的ip和端口
alerting:
alertmanagers:
- static_configs:
- targets:
# - alertmanager:9093
# rule_files模块指定Prometheus服务器加载的任何规则的位置(例如:告警规则)
rule_files:
# - "first_rules.yml"
# - "second_rules.yml"
# scrape_configs模块控制Prometheus监控的资源,Prometeheus也将自身作为被监控的对象,用于监控自身健康状态
scrape_configs:
- job_name: "prometheus"
static_configs:
- targets: ["localhost:9090","192.168.0.130:9100","192.168.0.30:9100","192.168.0.120:9100"] #这里可以添加你要监控的主机,也可以像下面一样重新写一个job_name无所谓
- job_name: "container"
static_configs:
- targets: ["192.168.0.30:8888"] # 添加cadvisor为监控对象,
重启服务prometheus
systemctl restart prometheus
浏览器:http://192.168.0.130:9090/

Grafana数据展示
Grafana是一款用Go语言开发的开源数据可视化平台,可以做数据监控和数据统计 ,并带有报警功能。
官网: https://grafana.com
Guafana特点
可视化: 快速和灵活的客户端图形具有多种选项。面板插件为许多不同的方式可视化指标和日志。
报警: 可视化地为最重要的指标定义警报规则。Grafana将持续评估它们,并发送通知。
通知: 警报更改状态时,它会发出通知。接收电子邮件通知。
动态仪表盘: 使用模板变量创建动态和可重用的仪表板,这些模板变量作为下拉菜单出现在仪表板顶部。
混合数据源: 在同一个图中混合不同的数据源!可以根据每个查询指定数据源。这甚至适用于自定义数据源。
注释: 注释来自不同数据源图表。将鼠标悬停在事件上可以显示完整的事件元数据和标记。
过滤器: 过滤器允许您动态创建新的键/值过滤器,这些过滤器将自动应用于使用该数据源的所有查询。
Grafana安装
提示:在prometheus主机安装
软件包可从清华大学源下载:https://mirrors.tuna.tsinghua.edu.cn/
#下载软件包
wget --no-check-certificate https://mirrors.tuna.tsinghua.edu.cn/grafana/yum/rpm/grafana-10.0.2-1.x86_64.rpm
#安装grafana
yum -y install grafana-10.0.2-1.x86_64.rpm
#启动服务&&设置服务随机自启&&查看服务运行状态
systemctl start grafana-server
systemctl status grafana-server
systemctl enable grafana-server
#查看服务端口信息
ss -ntlp | grep grafana
LISTEN 0 128 :::3000 :::* users:(("grafana-server",pid=7907,fd=6))
数据展示
浏览器访问:http://server_ip:3000
默认账户密码为admin

在这里添加数据源
添加端口
为grafana导入容器监控模板,具体模板可参考地址:https://grafana.com/grafana/dashboards/?search=docker
这里可以上传模板也可以填模板ID去使用模板


Prometheus故障告警
Prometheus支持故障触发告警功能,但是告警功能由Alertmanager组件实现,Alertmanager支持多种告警媒介类型,如:邮件、短信、微信、钉钉等告警功能,不同的报警媒介,告警的配置方式也有所不同
在Prometheus上定义告警规则生成告警通知,Alertmanager接收到Prometheus告警通知后,按需分别进行处理,将告警信息发送给接收人。
安装Alertmanager
#解压软件包&&进入解压路径
tar -xf alertmanager-0.28.1.linux-amd64.tar.gz -C /usr/local
cd /usr/local
#修改名称
mv alertmanager-0.28.1.linux-amd64/ alertmanager
#添加系统启动服务
vim /etc/systemd/system/alertmanager.service
[Unit]
Description=Alertmanager
After=network-online.target
[Service]
Restart=on-failure
ExecStart=/usr/local/alertmanager/alertmanager --config.file=/usr/local/alertmanager/alertmanager.yml
[Install]
WantedBy=multi-user.target
#启动服务&&设置服务随机自启
systemctl start alertmanager && systemctl enable alertmanager
#查看服务端口
ss -ntlp | grep alertmanager
:::9093 :::* #alertmanager监听端口
:::9094 :::* #集群内部通讯端口
访问测试:http://server_ip:9093
配置文件介绍
cat alertmanager.yml
route: #根路由,所有告警信息进入根路由后,由根路由设置报警的分发策略
group_by: ['alertname'] #定义分组规则,group_by中定义标签名称
group_wait: 30s #当收到告警的时候,等待30秒看是否还有相同告警,如果有就一起发出去
group_interval: 10s #发送告警时间间隔
repeat_interval: 30m #同一个报警重复发送的间隔时间
receiver: 'web.hook' #报警接收器,可选择多种接收方式(如邮件、微信等)
以下内容省略...
接收器详细参数配置文档:
- email: https://prometheus.io/docs/alerting/latest/configuration/#email_config
- webhook: https://prometheus.io/docs/alerting/latest/configuration/#webhook_config
- wechat: https://prometheus.io/docs/alerting/latest/configuration/#wechat_config
- pagerduty:https://prometheus.io/docs/alerting/latest/configuration/#pagerduty_config
邮件报警
修改alertmanager.yml文件
global:
resolve_timeout: 1h #定义了当Alertmanager持续多长时间未接收到告警后标记告警状态为resolved(已解决)
smtp_smarthost: 'smtp.163.com:25' #SMTP服务器地址及端口
smtp_from: '15937530209@163.com' #发件人,填写你的163邮箱
smtp_auth_username: '15937530209@163.com' #与上面保持一致
smtp_auth_password: 'BBkZUVBi3LtWcuND' #邮箱的授权码,打开SMTP服务会给你一个授权码
smtp_require_tls: false #不使用加密认证
templates: #指定告警模板文件位置
- './template/test.tmpl' #模板文件地址,默认不存在,需要手动创建
route:
group_by: ['alertname'] # 定义分组规则,group_by中定义标签名称
group_wait: 10s # 当收到告警的时候,等待10秒看是否还有相同告警,如果有就一起发出去
group_interval: 10s # 发送告警时间间隔
repeat_interval: 30m # 同一个报警重复发送的间隔时间
receiver: 'email' # 报警接收器
receivers:
- name: 'email'
email_configs:
- to: '3795894369@qq.com' #写自己收件的qq邮箱
send_resolved: true # 故障恢复后发送邮件
一定要把两个邮箱的SMTP服务打开
创建告警模板
一般来说,在告警规则文件的annotations中使用 summary 描述告警的概要信息, description 用于描述告警的详细信息。
同时Alertmanager的UI也会根据这两个标签值,显示告警信息。为了让告警信息具有更好的可读性,Prometheus支持模板化label和annotations的中标签的值。
通过 l a b e l s . 变量可以访问当前告警实例中指定标签的值。 labels. 变量可以访问当前告警实例中指定标签的值。 labels.变量可以访问当前告警实例中指定标签的值。value则可以获取当前PromQL表达式计算的样本值。
#创建模板文件,路径为alertmanager安装目录下
[root@prom prometheus]# cd /usr/local/alertmanager/
[root@prom alertmanager]# mkdir template && cd template/
#创建告警模板文件
[root@prom template]# cat test.tmpl
{{ define "email.default.html" }}
<html>
<body>
{{- if gt (len .Alerts.Firing) 0 }}
<h3>🚨 触发告警(共 {{ len .Alerts.Firing }} 条)</h3>
{{- range .Alerts.Firing }}
<div style="margin-bottom: 20px; border-bottom: 1px solid #eee;">
<p><strong>告警实例</strong>: {{ .Labels.instance }}</p>
<p><strong>告警级别</strong>: {{ .Labels.severity }}</p>
<p><strong>告警类型</strong>: {{ .Labels.alertname }}</p>
{{- if .Annotations.value }}
<p><strong>触发阈值</strong>: {{ .Annotations.value }}</p>
{{- end }}
<p><strong>告警详情</strong>: {{ .Annotations.description }}</p>
<p><strong>触发时间</strong>: {{ .StartsAt.Local.Format "2006-01-02 15:04:05" }}</p>
</div>
{{- end }}
{{- end }}
{{- if gt (len .Alerts.Resolved) 0 }}
<h3>✅ 恢复告警(共 {{ len .Alerts.Resolved }} 条)</h3>
{{- range .Alerts.Resolved }}
<div style="margin-bottom: 20px; border-bottom: 1px solid #eee;">
<p><strong>告警实例</strong>: {{ .Labels.instance }}</p>
<p><strong>告警级别</strong>: {{ .Labels.severity }}</p>
<p><strong>告警类型</strong>: {{ .Labels.alertname }}</p>
<p><strong>触发时间</strong>: {{ .StartsAt.Local.Format "2006-01-02 15:04:05" }}</p>
<p><strong>恢复时间</strong>: {{ .EndsAt.Local.Format "2006-01-02 15:04:05" }}</p>
</div>
{{- end }}
{{- end }}
</body>
</html>
{{ end }}
开启告警功能
为了能够让Prometheus能够启用定义的告警规则,我们需要在Prometheus全局配置文件中通过rule_files指定 一组告警规则文件的访问路径,Prometheus启动后会自动扫描这些路径下规则文件中定义的内容,并且根据这些规则计算是否向外部发送通知:
vim prometheus.yml
# my global config
global:
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
# scrape_timeout is set to the global default (10s).
# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets:
- 192.168.0.130:9093 #把alerting打开就可以了
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
- "first_rules.yml" #这个一定要打开一会要编辑这个文件
# - "second_rules.yml"
# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: "prometheus"
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ["localhost:9090","192.168.0.130:9100","192.168.0.30:9100","192.168.0.120:9100"]
- job_name: "docker-harbor"
static_configs:
- targets: ["192.168.0.30:8888"]
# - job_name: "192.168.0.30"
# static_configs:
# - targets: ["192.168.0.30:9100"]
# - job_name: "192.168.0.120"
# static_configs:
# - targets: ["192.168.0.120:9100"]
配置告警规则
创建first_rules.yml添加告警规则,路径为/usr/local/prometheus/
一条典型的告警规则如下所示:告警大致含义为如果主机down了,就触发告警
cat first_rules.yml
groups: #告警分组
- name: 'Linux Instances' #组名
rules:
- alert: "主机状态告警" #告警状态
expr: up == 0 #告警指标,UP指标的值等于0表示Down状态,1表示正常
for: 10s #等待10秒发送告警信息
labels: #定义一些告警的具体详细内容,指定对应的标签名称
severity: '紧急' #告警级别
annotations: #告警信息描述
summary: "服务名:{{$labels.alertname}} 主机状态告警" #描述信息自定义
description: "{{ $labels.alertname }} 主机以宕机10秒" #描述信息自定义
value: "{{ $value }}"
在告警规则文件中,我们可以将一组相关的规则设置定义在一个group下,在每一个group中我们可以定义多个告警 规则(rule)。
一条告警规则主要由以下几部分组成:
- alert:告警规则的名称。
- expr:基于PromQL表达式告警触发条件,用于计算是否有时间序列满足该条件。
- for:评估等待时间,可选参数。用于表示只有当触发条件持续一段时间后才发送告警。在等待期间新产生告警 的状态为pending。
- labels:自定义标签,允许用户指定要附加到告警上的一组附加标签。
- annotations:用于指定一组附加信息,比如用于描述告警详细信息的文字等,annotations的内容在告警 产生时会一同作为参数发送到Alertmanager。
- value:则可以获取当前PromQL表达式计算的样本值。
重启服务
systemctl restart prometheus

做到这里基本就完成了,
我们来试一下成果
触发告警
模拟被控主机宕机,关闭node_exporter服务即可
[root@node02 ~]# systemctl stop node_exporter.service
等他变成红色时就会出发警告
这时来看我们的邮箱

现在我们打开node_exporter服务
[root@node02 ~]# systemctl start node_exporter.service
这个触发器就会重新变成绿色
邮箱会受到恢复的信息

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)