本配置教程主要展示如何配置报警系统,Prometheus与Grafana联动实现可视化监控的配置请大家看上一篇文章:Prometheus + Grafana + alertmanager实现Substrate区块链节点实时监控报警系统(上)
Grafana Dashboard整体效果如下:升级后的Dashboard分为三个部分,第一本部分为区块链节点信息部分(Blockchain Information),第二部分为警报总览部分(Alert Infor),第三部分为服务器性能总览部分(Sever Performance Details),此三部分依次对应下面的三张图:
Blockchain Information:
Alert Infor:
Sever Performance Details:
由于我司使用飞书作为工作交流的载体,因此所有报警均以飞书webhook机器人推送,推送后的报警信息如下所示:
![]() |
![]() |
实验环境:
实验服务器A与B:
本地:
实验前提:
假设有A与B两台远程服务器,A服务器作为监控服务器,B服务器作为被监控服务器,且默认B服务器一直运行区块链节点服务。
在整个配置过程中,均由本地计算机远程访问A和B服务器完成。
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详解:文件的打包压缩与解压缩解打包:https://blog.csdn.net/LYBzhangYF/article/details/119083893
其实在这里要着重提一下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
在A服务器上输入下面的指令进行安装:
grafana-cli plugins install camptocamp-prometheus-alertmanager-datasource
安装完成后,终端显示绿色的信息与对号表示安装成功,但是还要重启一下Grafana服务让插件生效
如果对重启服务不是很了解,可以看一下我的另一篇文章
Linux命令——重启服务功能:https://blog.csdn.net/LYBzhangYF/article/details/119547567
AlertManager(Grafana插件)官网,按照图中的标识序号即可进行安装(当然了,官方也提供.zip压缩包的下载)
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
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'
在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."
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时会再次提到
此处对官方配置步骤做精简总结,删繁就简
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 --
由于在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=` 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']
1⃣️正确安装插件并重启Grafana服务后,进入Grafana的Data sources界面,点击 Add data source
按钮后,下拉至最后,在 Others栏目中即可看见安装后的插件(如下图):
2⃣️点击插件名称进入配置界面,注意⚠️看下图中的标识
注意:该Data source的导入是为了配合后面Dashboard面板中报警情况的实时显示
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用法详解:https://www.cnblogs.com/f-ck-need-u/p/10053124.html
6⃣️自定义模版管理里面的所有内容填写妥当以后,可以输入一段 “消息协议JSON内容”进行测试,记得一定要先 “保存模版”再 “模版测试”,测试通过后会得到一条根据你自己编写的模版发出的报警信息
把升级版本的JSON文件按照 import
导入即可
# 对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
# 重新加载正在后台运行的命令 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 &
恭喜你,成功毕业
完成上面所有相关配置后,你的报警监控系统就可以正常运行了。
这篇配置教程只能帮大家建立一个框架,而系统中的很多地方都支持自定义,相信在大家的努力下,一定会做出一个自己满意的系统