文章导航
- 写在前面
- 成品展示
- 配置步骤
- 零、实验前提
- 一、工具安装
- 1. 在A服务器中安装alertmanager、PrometheusAlert与AlertManager(Grafana插件)
- ⑴ alertmanager的安装
- ⑵ PrometheusAlert的安装
- ⑶ AlertManager(Grafana插件)的安装
- 2. 在B服务器上安装node-exporter
- 二、编写配置文件
- 1. 修改与编写A服务器Prometheus配置文件
- ⑴ 修改配置文件prometheus.yml
- ⑵ 编写报警规则文件rules.yml
- 2. 编写A服务器alertmanager配置文件
- ⑴ 编写配置文件alertmanager.yml
- 3. 修改A服务器PrometheusAlert配置文件
- ⑴ 修改配置文件app.conf
- 4. 修改B服务器Prometheus配置文件
- ⑴ 修改配置文件prometheus.yml
- 三、Grafana数据源配置与PrometheusAlert报警信息配置
- 1. AlertManager(Grafana插件)的导入与配置
- 2. PrometheusAlert报警信息自定义模版的导入与配置
- 3. Dashboard升级版本:substrate_monitoring_alarm_template (v.1.0.0) 的导入
- 四、检查配置与加载运行配置
- 1. 检查各项配置语法是否正确
- 2. 重新加载与运行各项配置
- 结尾
写在前面
本配置教程主要展示如何配置报警系统,Prometheus与Grafana联动实现可视化监控的配置请大家看上一篇文章
成品展示
Grafana Dashboard整体效果如下:升级后的Dashboard分为三个部分,第一本部分为区块链节点信息部分(Blockchain Information),第二部分为警报总览部分(Alert Infor),第三部分为服务器性能总览部分(Sever Performance Details),此三部分依次对应下面的三张图:
Blockchain Information:
Alert Infor:
Sever Performance Details:
由于我司使用飞书作为工作交流的载体,因此所有报警均以飞书webhook机器人推送,推送后的报警信息如下所示:
报警触发 | 报警恢复 |
配置步骤
零、实验前提
实验环境:
- 实验服务器A与B:
- Ubuntu 18.04
- Linux amd64
- 本地:
- Mac OS
实验前提: 假设有A与B两台远程服务器,A服务器作为监控服务器,B服务器作为被监控服务器,且默认B服务器一直运行区块链节点服务。 在整个配置过程中,均由本地计算机远程访问A和B服务器完成。
一、工具安装
1. 在A服务器中安装alertmanager、PrometheusAlert与AlertManager(Grafana插件)
⑴ alertmanager的安装
1⃣️alertmanager属于Prometheus的一部分,可以直接在Prometheus官方网站里下载
2⃣️在本地下载后,将下载下来的安装包通过 scp命令上传到A服务器中:
scp /Users/admin/Downloads/alertmanager-0.22.2.linux-amd64.tar root@A's_IP_address:/root
scp命令的讲解可以参考这篇文章:linux scp命令参数及用法详解–linux远程复制拷贝命令使用实例
3⃣️将下载好的安装包进行解打包操作(我下载后是一个打包文件)
tar -xvf alertmanager-0.22.2.linux-amd64.tar
Linux命令——tar与gzip详解:文件的打包压缩与解压缩解打包:
⑵ PrometheusAlert的安装
其实在这里要着重提一下PrometheusAlert,它是一款开源的运维告警中心消息转发系统,支持主流的监控系统,以及所有支持WebHook接口的系统发出的预警消息,支持将收到的这些消息发送到钉钉,微信,email,飞书,腾讯短信,腾讯电话,阿里云短信等途径。
PrometheusAlert官方GitHub地址:https://github.com/feiyu563/PrometheusAlert
在A服务器中直接输入以下命令下载PrometheusAlert并解压:
# 打开PrometheusAlert releases页面,根据需要选择需要的版本下载到本地解压并进入解压后的目录
wget https://github.com/feiyu563/PrometheusAlert/releases/download/v4.4.0/linux.zip && unzip linux.zip
⑶ AlertManager(Grafana插件)的安装
在A服务器上输入下面的指令进行安装:
grafana-cli plugins install camptocamp-prometheus-alertmanager-datasource
安装完成后,终端显示绿色的信息与对号表示安装成功,但是还要重启一下Grafana服务让插件生效
如果对重启服务不是很了解,可以看一下我的另一篇文章 Linux命令——重启服务功能:
AlertManager(Grafana插件)官网,按照图中的标识序号即可进行安装(当然了,官方也提供.zip压缩包的下载)
2. 在B服务器上安装node-exporter
node-exporter也属于Prometheus的一部分,它是专门用来配合Prometheus来获取Linux服务器各项指标的接口 1⃣️登录Prometheus官网下载页面,在本地下载对应的安装包:
2⃣️输入以下命令将安装包上传至A服务器中,并在A服务器中进行解打包:
scp /Users/admin/Downloads/node_exporter-1.2.0.linux-amd64.tar root@A's_IP_address:/root
登录A服务器,对安装包进行解打包:
tar -xvf node_exporter-1.2.0.linux-amd64.tar
二、编写配置文件
1. 修改与编写A服务器Prometheus配置文件
⑴ 修改配置文件prometheus.yml
cd到prometheus目录下,然后用 vim打开配置文件prometheus.yml: 修改编写下面的 alerting与 rule_files配置,由于B服务器已经添加node_exporter对服务器进行数据采集,所以还要修改 scrape_intercal中的 federate配置:
global:
# -- snip --
alerting:
alertmanagers:
- static_configs:
- targets: ['A_IP_adress:9093'] # alertmanager暴露的端口为9093,prometheus抓取信息并判断为报警后需要传给alertmanager进行报警整合
# - alertmanager:9093
rule_files:
- "rules.yml" # 报警规则文件,必须要写,它定义了当满足什么条件时,报警触发
# - "first_rules.yml"
# - "second_rules.yml"
scrape_configs:
# -- snip --
- job_name: 'federate'
scrape_interval: 15s
honor_labels: true
metrics_path: '/federate'
params:
'match[]':
- '{job="substrate_node"}'
- '{job="node_exporter"}' # 新增加job,其名保持与B服务器中prometheus.yml文件中的job一致
static_configs:
- targets:
- 'B_IP_ADDRESS:9090'
⑵ 编写报警规则文件rules.yml
在prometheus目录(与prometheus.yml同目录)下,新建报警规则文件rules.yml,编写具体报警规则:
# 本规则文件仅做测试用途,具体公司业务文件暂不公开
groups:
- name: test # 定义警报组名,以下所有警报都属于“test”组
rules:
- alert: PrometheusTargetMissing # 报警名称
expr: up == 0 # 判断触发报警的条件
for: 10s # 报警PENDING状态的时间,即满足触发报警的条件后,如果触发报警的持续时间大于 `for`的时间,那么报警状态变为FIRING,此时报警才可被发出
labels: # 自定义标签(`lables`里面的内容随心配)
level: medium # 报警级别(自定义)
project: performance # 报警所属项目(自定义)
annotations: # 自定义报警注解(`annotations`里面的内容随心配,下面一般写一些报警的具体内容)
description: "A Prometheus target {{$labels.job}} has disappeared. It might be crashed." # 报警的详细信息(自定义)
- alert: PrometheusJobMissing
expr: absent(up{job="prometheus"})
for: 10s
labels:
level: medium
project: performance
annotations:
description: "A Prometheus job {{$labels.job}} has disappeared"
- alert: HostHighCpuLoad
expr: 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[2m])) * 100) > 80
for: 30s
labels:
level: extremely severe
project: performance
annotations:
description: "CPU load is > 80%"
- alert: HostOutOfMemory
expr: node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes * 100 < 10
for: 30s
labels:
level: extremely severe
project: performance
annotations:
description: "Node memory is filling up (< 10% left)"
- alert: BlockchainProblem
expr: delta(substrate_block_height{status="best"}[20s]) < 1
for: 1s
labels:
level: severe
project: blockchain
annotations:
description: "Block height(best) has changed nothing in last 20s."
2. 编写A服务器alertmanager配置文件
⑴ 编写配置文件alertmanager.yml
cd到alertmanager目录,打开并编写下面的具体配置:
global:
resolve_timeout: 5m
# default is 5m
route: # 根路由
group_by: ['test'] # 分组标签,要与规则文件rules.yml中标识的报警小组名相对应,此处表示 `test`小组中的报警 将发往下面的 `receiver`中
group_wait: 5s # 小组报警等待时间,当警报触发后需要等待 `group_wait`长短的时间,这段时间中如果有同组的别的警报触发,则将它们放在一条信息中发出,避免了警报发送的轰炸
group_interval: 5m # 同组警报发送间隔
repeat_interval: 10m # 重复发送报警信息的时间(前提是之前的报警一直未被修复)
receiver: 'default' # 默认的接受者(必须要有,否则无法通过配置检查)
routes: # 子路由
- receiver: 'blockchain_Alert' # 子路由下的接受者
match: # match匹配,匹配每个报警下的labels标签里的内容
project: blockchain # match匹配为警报的project,即project为blockchain的警报将推送至 `blockchain_Alert`接受者
- receiver: 'performance_Alert'
match:
project: performance
receivers: # 各接受者的具体传递路径
- name: 'default'
webhook_configs: # webhook配置,下同
- url: 'fs_webhook1' # webhook地址
- name: 'performance_Alert'
webhook_configs:
- url: 'fs_webhook2'
- name: 'blockchain_Alert'
webhook_configs:
- url: 'fs_webhook1'
# inhibit_rules:
# - source_match:
# severity: 'critical'
# target_match:
# severity: 'warning'
# equal: ['alertname', 'dev', 'instance']
注意⚠️:每个 receiver对应的webhook地址(url)均为PrometheusAlert里的模版路径,下文讲到PrometheusAlert时会再次提到
3. 修改A服务器PrometheusAlert配置文件
⑴ 修改配置文件app.conf
此处对官方配置步骤做精简总结,删繁就简 1⃣️首先进入配置文件目录并打开里面的配置文件,vim linux/conf/app.conf, 2⃣️然后找到 webhook配置模块,修改飞书相应配置(具体修改内容见下面注释):
# -- snip --
#---------------------↓webhook-----------------------
#是否开启钉钉告警通道,可同时开始多个通道0为关闭,1为开启
open-dingding=1
#默认钉钉机器人地址
ddurl=https://oapi.dingtalk.com/robot/send?access_token=xxxxx
#是否开启 @所有人(0为关闭,1为开启)
dd_isatall=1
#是否开启微信告警通道,可同时开始多个通道0为关闭,1为开启
open-weixin=1
#默认企业微信机器人地址
wxurl=https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxxx
#是否开启飞书告警通道,可同时开始多个通道0为关闭,1为开启
open-feishu=1
#默认飞书机器人地址
fsurl=YOUR_feishu_webhook_ADDRESS
# -- snip --
4. 修改B服务器Prometheus配置文件
⑴ 修改配置文件prometheus.yml
由于在B服务器中已经安装抓取服务器性能指标metrics的采集器node-exporter,所以需要在配置文件prometheus.yml中添加node-exporter的job:
#********************************** 注 意 点 **********************************
# 建议在每项targets后面写真实的IP地址,便于后期采集数据的现实。
# 如果写了 localhost:port_number也对,后期采集数据会显示为 localhost:port_number,
# 当有多个主机时,不好区分。
# 提醒:区块链节点substrate_node的targets要写带 localhost,否者会不识别
#*****************************************************************************
# -- snip --
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: ['B_IP_ADDRESS:9090']
- job_name: 'substrate_node'
scrape_interval: 1m
static_configs:
- targets: ['localhost:9615']
- job_name: 'node_exporter'
scrape_interval: 5s
static_configs:
- targets: ['B_IP_ADDRESS:9100']
三、Grafana数据源配置与PrometheusAlert报警信息配置
1. AlertManager(Grafana插件)的导入与配置
1⃣️正确安装插件并重启Grafana服务后,进入Grafana的Data sources界面,点击 Add data source按钮后,下拉至最后,在 Others栏目中即可看见安装后的插件(如下图):
2⃣️点击插件名称进入配置界面,注意⚠️看下图中的标识
注意:该Data source的导入是为了配合后面Dashboard面板中报警情况的实时显示
2. PrometheusAlert报警信息自定义模版的导入与配置
1⃣️基于前面正确的安装,先把PrometheusAlert运行起来
# 第一次运行PrometheusAlert可能没有执行权限,所以先对其赋予权限
cd linux/
sudo chmod +x ./PrometheusAlert
# 将PrometheusAlert持续化后台运行
nohup ./PrometheusAlert &
# 此时运行日志nohup.out将在当前目录 linux/下自动生成
2⃣️在浏览器中进入 PrometheusAlert界面,默认地址为 http://A_IP_ADDRESS:8080,在上方导航栏中先点击Test进行一次告警测试,看看能否正常发送报警消息:
注意⚠️:第一次进入会提示输入账号和密码,二者默认均为 prometheusalert,输入即可 3⃣️输入账号密码正确进入 Test页面(如下图),找到第三栏的飞书,然后点击其后的 告警测试即可
4⃣️测试通过后,飞书webhook机器人会发送如下消息:
5⃣️:点击上方导航栏,选择 AlertTemplate,进入页面后点击 ⊕添加模版(不选用自带模版是因为无法满足实际生产需要)
注意⚠️:消息协议JSON内容在PrometheusAlert日志文件nohup.out可以找到,每当触发一次警报,PrometheusAlert就会产生一个包含具体报警信息的JSON字段(这些报警信息来自报警规则文件rules.yml) JSON字段大致下面的样子:
这里的JSON字段毫无格式可言,也会影响我们对模版内容的编写,因此需要用到下面的格式化工具规整一下格式:在线JSON校验格式化工具
根据格式调整后的JSON文件,可以编写一套属于自己的模版:
{{range $k,$v:=.alerts}}
{{if eq $v.status "resolved"}}
**Prometheus报警恢复🤗**
**告警名称:*****{{$v.labels.alertname}}***
**告警级别:{{$v.labels.level}}**
**主机IP:{{$v.labels.instance}}**
开始时间:{{GetCSTtime $v.startsAt}}
结束时间:{{GetCSTtime $v.endsAt}}
**原告警信息:{{$v.annotations.description}}**
- - - - - - - - - - - - - - - - - - - - - - - - - - -
当前时间:{{GetCSTtime ""}}
{{else}}
**Prometheus报警触发🚨**
**告警名称:*****{{$v.labels.alertname}}***
**告警级别:{{$v.labels.level}}**
**主机IP:{{$v.labels.instance}}**
触发时间:{{GetCSTtime $v.startsAt}}
**详细告警信息:{{$v.annotations.description}}**
- - - - - - - - - - - - - - - - - - - - - - - - - - -
当前时间:{{GetCSTtime ""}}
{{end}}
{{ end }}
模版的编写基于Go template语法,不知道的小伙伴可以看下面的教程 Go template用法详解:
6⃣️自定义模版管理里面的所有内容填写妥当以后,可以输入一段 “消息协议JSON内容”进行测试,记得一定要先 “保存模版”再 “模版测试”,测试通过后会得到一条根据你自己编写的模版发出的报警信息
3. Dashboard升级版本:substrate_monitoring_alarm_template (v.1.0.0) 的导入
把升级版本的JSON文件按照 import导入即可
四、检查配置与加载运行配置
1. 检查各项配置语法是否正确
# 对A与B服务器的配置文件prometheus.yml进行检查
[ubuntu@...:~/prometheus]$ ./promtool check config prometheus.yml
Checking prometheus.yml
SUCCESS: 1 rule files found
Checking rules.yml
SUCCESS: 6 rules found
# 对A服务器的配置文件alertmanager.yml进行检查
[ubuntu@...:~/alertmanager]$ ./amtool check-config alertmanager.yml
Checking 'alertmanager.yml' SUCCESS
Found:
- global config
- route
- 0 inhibit rules
- 3 receivers
- 0 templates
2. 重新加载与运行各项配置
# 重新加载正在后台运行的命令 nohup ./prometheus --config.file prometheus.yml
# 加载成功以后,直接在浏览器刷新一下相应服务的界面即可生效
# 共有两种方法,分别表示如下:
[ubuntu@...:~/prometheus]$ curl -X POST http://localhost:9090/-/reload
[ubuntu@...:~/alertmanager]$ ps x | grep prometheus | grep -v grep | awk '{print $1}' | xargs kill -HUP
# 将A服务器的alertmanager与B服务器的node_exporter放在后台持续化运行
# 先 `cd`到相应目录下
[ubuntu@...:~/prometheus]$ nohup ./alertmanager --config.file alertmanager.yml &
[ubuntu@...:~/prometheus]$ nohup ./node_exporter &
结尾
🎉恭喜你,成功毕业🎉 完成上面所有相关配置后,你的报警监控系统就可以正常运行了。 这篇配置教程只能帮大家建立一个框架,而系统中的很多地方都支持自定义,相信在大家的努力下,一定会做出一个自己满意的系统🤗🥳