Prometheus + Grafana + alertmanager实现Substrate区块链节点实时监控报警系统(下)

写在前面

本配置教程主要展示如何配置报警系统,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:

    • 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详解:文件的打包压缩与解压缩解打包:https://blog.csdn.net/LYBzhangYF/article/details/119083893

⑵ 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命令——重启服务功能:https://blog.csdn.net/LYBzhangYF/article/details/119547567

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
修改编写下面的 alertingrule_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用法详解:https://www.cnblogs.com/f-ck-need-u/p/10053124.html

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 &

结尾

🎉恭喜你,成功毕业🎉
完成上面所有相关配置后,你的报警监控系统就可以正常运行了。
这篇配置教程只能帮大家建立一个框架,而系统中的很多地方都支持自定义,相信在大家的努力下,一定会做出一个自己满意的系统🤗🥳

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值