整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

Qt编写气体安全管理系统13-短信告警

Qt编写气体安全管理系统13-短信告警

一、前言

短信告警这个模块在很多项目中都用上了,比如之前做过的安防系统,温湿度报警系统等,主要的流程就是收到数据判断属于某种报警后,组织短信字符串内容,发送到指定的多个手机号码上面,使用的是短信猫硬件设备,其实就是个短信模块,没有使用网络的发送短信的api,毕竟大部分的软件应用场景都不能要求连通外网,安全考虑,所以必须采用本地的硬件来实现发送短信。这个短信猫设备在8年前开始用过,当时用的C#去写了个纯协议解析短信的收发,后面用Qt重新写了个。特意写了个类SendMsgThread封装了所有的操作,这样就通用任何开发环境了,掌握了原理,从底层原理上着手,好处还是很多的,我看很多初学者热衷于去调用第三方厂家封装好的SDK,一旦换了操作系统,完蛋了歇菜,没有嵌入式linux系统的SDK开发包咋搞。

通用短信收到组件功能特点:

1. 可设置收发短信模式

2. 可批量发送短信以及支持长短信

3. 可读取指定指定序号短信

4. 可删除所有短信

5. 可检测短信猫设备是否正常

6. 支持中文短信发送

7. 支持拨打电话+挂断电话+接听来电+识别用户按键反馈

8. 支持批量发送给多个号码

皮肤开源:[https://gitee.com/feiyangqingyun/QWidgetDemo](https://gitee.com/feiyangqingyun/QWidgetDemo) [https://github.com/feiyangqingyun/QWidgetDemo](https://github.com/feiyangqingyun/QWidgetDemo)

文件名称:styledemo

体验地址:[https://gitee.com/feiyangqingyun/QWidgetExe](https://gitee.com/feiyangqingyun/QWidgetExe) [https://github.com/feiyangqingyun/QWidgetExe](https://github.com/feiyangqingyun/QWidgetExe)

文件名称:bin_sams.zip

二、功能特点

1. 采集数据端口,支持串口端口+网络端口,串口支持自由设置串口号+波特率,网络支持自由设置IP地址+通讯端口,每个端口支持采集周期,默认1秒钟一个地址,支持设置通讯超时次数,默认3次,支持最大重连时间,用于重新读取离线的设备。

2. 控制器信息,能够添加控制器名称,选择控制器地址+控制器型号,设置该控制器下面的探测器数量。

3. 探测器信息,能够添加位号,可自由选择探测器型号,气体种类,气体符号,高报值,低报值,缓冲值,清零值,是否启用,报警声音,背景地图,存储周期,数值换算小数点位数,报警延时时间,报警的类型(HH,LL,HL)等。

4. 控制器型号+探测器型号+气体种类+气体符号,均可自由配置。

5. 地图支持导入和删除,所有的探测器对应地图位置可自由拖动保存。

6. 端口信息+控制器信息+探测器信息,支持导入导出+导出到excel+打印。

7. 运行记录+报警记录+用户记录,支持多条件组合查询,比如时间段+控制器+探测器等,所有记录支持导出到excel+打印。

8. 导出到excel的记录支持所有excel+wps等表格文件版本,不依赖excel等软件。

9. 可删除指定时间范围内的数据,支持自动清理早期数据,设置最大保存记录数。

10. 支持报警短信转发,支持多个接收手机号码,可设定发送间隔,比如即时发送或者6个小时发送一次所有的报警信息,短信内容过长,自动拆分多条短信。

11. 支持报警邮件转发,支持多个接收邮箱,可设定发送间隔,比如即时发送或者6个小时发送一次所有的报警信息,支持附件发送。

12. 高报颜色+低报颜色+正常颜色+0值颜色+曲线背景+曲线颜色等,都可以自由选择。

13. 软件的中文标题+英文标题+logo路径+版权所有都可以自由设置。

14. 提供开关设置开机运行+报警声音+自动登录+记住密码等。

15. 报警声音可设置播放次数,界面提供17种皮肤文件选择。

16. 支持云端数据同步,可设置云端数据库的信息,比如数据库名称,用户名+密码等。

17. 支持网络转发和网络接收,网络接收开启后,软件从udp接收数据进行解析。网络转发支持多个目标IP,这样就实现了本地采集的软件,自由将数据转到客户端,随时查看探测器数据。

18. 自动记住用户最后停留的界面+其他信息,重启后自动应用。

19. 报警自动切换到对应的地图,探测器按钮闪烁。

20. 双击探测器图标,可以进行回控。

21. 支持用户权限管理,管理员+操作员两大类,用户登录+用户退出,可以记住密码和自动登录,超过三次报错提示并关闭程序。

22. 支持四种监控模式,设备面板监控+地图监控+表格数据监控+曲线数据监控,可自由切换,四种同步应用。

23. 支持报警继电器联动,一个位号可以跨串口联动多个模块和继电器号,支持多对多。

24. 本地数据存储支持sqlite+mysql,支持远程数据同步到云端数据库。自动重连。

25. 本地设备采集到的数据实时上传到云端,以便手机APP或者web等其他方式提取。

26. 支持两种数据源,一种是串口和网络通过协议采集设备数据,一种是数据库采集。数据库采集模式可以作为通用的系统使用。

27. 自带设备模拟工具,支持16个设备数据模拟,同时还带数据库数据模拟,以便在没有设备的时候测试数据。

28. 默认通信协议采用modbus协议,后期增加mqtt等物联网协议的支持,做成通用系统。

29. 支持所有windows操作系统+linux操作系统和其他操作系统。

三、效果图

四、核心代码

动互联小课堂 (六) 报警服务

视频链接如下:

https://audi-embedded-wap.saic-audi.mobi/share/index.html#/article?flag=0&category=article&id=1232417733879517184

字如面,大家好,我是小斐,上一篇介绍generator.yml文件配置和prometheus.yml文件配置,包含文件服务自动发现机制,以及根据generator.yml配置,根据SNMP Exporter官方提供的生成器,生成snmp.yml配置文件等等,今天主要说明下正式环境的配置和情况,包括披露部署虚拟机Node Exporter节点数据采集器等问题。

正式环境说明

关于存储

Prometheus 提供了本地存储(TSDB)时序型数据库的存储方式,在2.0版本之后,压缩数据的能力得到了大大的提升(每个采样数据仅仅占用1~2Byte左右空间),单节点情况下可以满足大部分用户的需求,但本地存储阻碍了Prometheus集群化的实现,因此在集群中应当采其他时序性数据库来替代,比如influxdb。

Prometheus分为三个部分,分别是:抓取数据存储数据查询数据

抓取数据,就是各种抓取器,存储数据就是时序数据库,查询数据,可以理解为数据可视化。

关于我这里的正式环境,因指标不是很多,故不采用外部数据库,主要还是基于本地存储,本地存储Prometheus 按2小时一个block进行存储,每个block由一个目录组成,该目录里包含:一个或者多个chunk文件(保存时间序列数据)默认每个chunk大小为512M、一个metadata文件、一个index文件(通过metric name和labels查找时间序列数据在chunk 块文件的位置。如下图所示:

./data
├── 01BKGV7JBM69T2G1BGBGM6KB12
│   └── meta.json
├── 01BKGTZQ1SYQJTR4PB43C8PD98
│   ├── chunks
│   │   └── 000001
│   ├── tombstones
│   ├── index
│   └── meta.json
├── 01BKGTZQ1HHWHV8FBJXW1Y3W0K
│   └── meta.json
├── 01BKGV7JC0RY8A6MACW02A2PJD
│   ├── chunks
│   │   └── 000001
│   ├── tombstones
│   ├── index
│   └── meta.json
├── chunks_head
│   └── 000001
└── wal
    ├── 000000002
    └── checkpoint.00000001
        └── 00000000

磁盘大小计算

needed_disk_space=retention_time_seconds * ingested_samples_per_second * bytes_per_sample

磁盘大小计算方式:磁盘大小=保留时间 * 每秒获取样本数 * 样本大小

保留时间(retention_time_seconds)和样本大小(bytes_per_sample)不变的情况下,如果想减少本地磁盘的容量需求,只能通过减少每秒获取样本数(ingested_samples_per_second)的方式。

因此有两种手段,一是减少时间序列的数量,二是增加采集样本的时间间隔

考虑到Prometheus会对时间序列进行压缩,因此减少时间序列的数量效果更明显。

为什么默认两个小时存储一次数据,写成一个chuck块文件

通过时间窗口的形式保存所有的样本数据,可以明显提高Prometheus的查询效率,当查询一段时间范围内的所有样本数据时,只需要简单的从落在该范围内的块中查询数据即可。

最新写入的2 小时数据保存在内存中

最新写入的数据保存在内存block中,达到2小时后写入磁盘,计算2小时写入数据大小,决定出内存的大小。

数据大内存问题

  • 随着规模变大,Prometheus 需要的 CPU 和内存都会升高,内存一般先达到瓶颈,这个时候要么加内存,要么集群分片减少单机指标。这里我们先讨论单机版 Prometheus 的内存问题。
  • Prometheus 的内存消耗主要是因为每隔2小时做一个 Block 数据落盘,落盘之前所有数据都在内存里面,因此和采集量有关。
  • 加载历史数据时,是从磁盘到内存的,查询范围越大,内存越大。这里面有一定的优化空间。
  • 一些不合理的查询条件也会加大内存,如 Group 或大范围 Rate。

如何防止断电程序崩溃数据丢失

为了防止程序崩溃导致数据丢失,采用WAL(write-ahead-log)预写日志机制,启动时会以写入日志(WAL)的方式来实现重播,从而恢复数据。

未落盘时数据存储内容。有wal文件

./data/01BKGV7JBM69T2G1BGBGM6KB12
./data/01BKGV7JBM69T2G1BGBGM6KB12/meta.json
./data/01BKGV7JBM69T2G1BGBGM6KB12/wal/000002
./data/01BKGV7JBM69T2G1BGBGM6KB12/wal/000001

数据存储方式

落盘后的数据内容,wal文件删除,生成index, tombstones(删除数据的记录),数据文件00001

./data/01BKGV7JC0RY8A6MACW02A2PJD
./data/01BKGV7JC0RY8A6MACW02A2PJD/meta.json
./data/01BKGV7JC0RY8A6MACW02A2PJD/index
./data/01BKGV7JC0RY8A6MACW02A2PJD/chunks
./data/01BKGV7JC0RY8A6MACW02A2PJD/chunks/000001
./data/01BKGV7JC0RY8A6MACW02A2PJD/tombstones

这些2小时的block会在后台压缩成更大的block,数据压缩合并成更高level的block文件后删除低level的block文件。这个和leveldb、rocksdb等LSM树的思路一致。

数据过期清理时间,默认保存15天

存储数据的目录,默认为data/,如果要挂外部存储,可以指定该目录

删除数据方式

删除数据时,删除条目会记录在独立的tombstone 删除记录文件中,而不是立即从chunk文件删除。

本地存储的缺点

首先是数据持久化的问题,默认保存15天,原生的TSDB对于大数据量的保存及查询支持不太友好 ,所以并不适用于保存长期的大量数据;另外,该数据库的可靠性也较弱,在使用过程中容易出现数据损坏等故障,且无法支持集群的架构。

远端存储

关于远端存储,在此就不表,因我的正式环境,不准备采用远端存储存储数据,就采用本地存储就满足我的需求。

正式环境配置

  • 数据默认保存15天,改为数据保存90天
  • 开启API服务
  • 开启动态加载配置文件
  • 采集开压缩,降低网络带宽压力
  • 指标压缩+加快数据落盘,避免大内存问题

IP

规格

服务

说明

172.17.40.51

8C 16G 500GB

单节点 Prometheus Server + Grafana Server + Alertmanager

该服务器主要搭建Prometheus服务器、Grafana服务器、Alertmanager服务器

172.17.40.54

4C 8G 60G

SNMP Exporter

交换机、防火墙、负载均衡、AC、DELL iDrac、IPMI等设备启用SNMP协议采集数据,该服务器作为SNMP协议数据采集节点

其他服务器 共500台

各种规格

Node Exporter

其他服务器部署Node Exporter采集主机性能、状态、网络、空间容量等各类数据

关于正式环境搭建可参考前面文章

Prometheus + Grafana搭建IT监控报警最佳实践(1)

在此补充一下细节说明和完善的点:

这里部署Prometheus Server、Grafana Server、Alertmanager都是未采用docker安装部署,而是采用编译好的二进制文件部署,简单说明:

# 正式环境
# 旧版本的 Docker 被称为docker或docker-engine,如果安装了这些,请卸载它们以及相关的依赖项。
sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

# 使用存储库安装docker
sudo yum install -y yum-utils
sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

# 安装最新版本的 Docker Engine、containerd 和 Docker Compose
sudo yum install docker-ce docker-ce-cli containerd.io docker-compose-plugin

# 安装特定版本的docker,请查看官网
https://docs.docker.com/engine/install/centos/

# 验证安装 docker version
[root@it-prometheus ~]# docker version
Client: Docker Engine - Community
 Version:           20.10.20
 API version:       1.41
 Go version:        go1.18.7
 Git commit:        9fdeb9c
 Built:             Tue Oct 18 18:22:47 2022
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

# 此时安装了docker,但并没有启动docker
sudo systemctl start docker

[root@it-prometheus ~]# systemctl start docker
[root@it-prometheus ~]# systemctl status docker
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
   Active: active (running) since 三 2022-10-26 00:15:11 CST; 9s ago
     Docs: https://docs.docker.com
 Main PID: 19146 (dockerd)
    Tasks: 13
   Memory: 36.2M
   CGroup: /system.slice/docker.service
           └─19146 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

# 设置docker开机自启动sudo systemctl enable docker
[root@it-prometheus ~]# systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.

Prometheus Server、Grafana Server、Alertmanager二进制部署

# 部署Grafana
wget https://dl.grafana.com/enterprise/release/grafana-enterprise-9.2.2-1.x86_64.rpm
sudo yum install grafana-enterprise-9.2.2-1.x86_64.rpm

# 启动
systemctl enable grafana-server
systemctl start grafana-server
systemctl status grafana-server
netstat -anplut | grep grafana

# 访问Grafana
浏览器本机IP访问http://172.17.40.51:3000/login,用户名和密码均为admin/admin

# 部署Prometheus
wget https://github.com/prometheus/prometheus/releases/download/v2.34.0/prometheus-2.34.0.linux-amd64.tar.gz
tar -zxvf prometheus-2.39.1.linux-amd64.tar.gz

# 运行
vim /usr/lib/systemd/system/prometheus.service

[Unit]
Description=Prometheus Server
Wants=network-online.target
After=network.target
[Service]
Type=simple
User=root
ExecStart=/root/monitor/prometheus/current/prometheus --config.file=/root/monitor/prometheus/conf/prometheus.yml --web.listen-address=:9090 --storage.tsdb.path=/root/monitor/prometheus/data/  --storage.tsdb.retention=90d --web.enable-lifecycle --web.enable-admin-api
Restart=on-failure
[Install]
WantedBy=multi-user.target


systemctl daemon-reload
systemctl start prometheus
systemctl status prometheus
systemctl enable prometheus

# 访问Prometheus
http://172.17.40.51:9090/

# 部署Alertmanager
wget https://github.com/prometheus/alertmanager/releases/download/v0.24.0/alertmanager-0.24.0.linux-amd64.tar.gz
tar -zxvf alertmanager-0.24.0.linux-amd64.tar.gz

# 运行
vim /usr/lib/systemd/system/alertmanager.service
[Unit]
Description=alertmanager
[Service]
ExecStart=/root/monitor/alertmanager/alertmanager --config.file=/root/monitor/alertmanager/conf/alertmanager.yml
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
[Install]
WantedBy=multi-user.target

systemctl daemon-reload
systemctl start alertmanager.service
systemctl status alertmanager.service
systemctl enable alertmanager.service

# 启动
# 检查配置文件格式是否错误
./amtool check-config /root/monitor/alertmanager/conf/alertmanager.yml

# 访问
http://172.17.40.51:9093/


# 安装prometheus-webhook-dingtalk
wget https://github.com/timonwong/prometheus-webhook-dingtalk/releases/download/v2.1.0/prometheus-webhook-dingtalk-2.1.0.linux-amd64.tar.gz
tar -zxvf prometheus-webhook-dingtalk-2.1.0.linux-amd64.tar.gz

# 运行
vim /usr/lib/systemd/system/prometheus-webhook.service
[Unit]
Description=Prometheus Dingding Webhook
[Service]
ExecStart=/root/monitor/prometheus-webhook-dingtalk/current/prometheus-webhook-dingtalk --config.file=/root/monitor/prometheus-webhook-dingtalk/conf/config.yml -web.enable-ui --web.enable-lifecycle
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
[Install]
WantedBy=multi-user.target

systemctl daemon-reload
systemctl start prometheus-webhook.service
systemctl status prometheus-webhook.service
systemctl enable prometheus-webhook.service

# 访问
http://172.17.40.51:8060/

到此就完成搭建Prometheus Server、Grafana Server、Alertmanager和钉钉告警插件。

在此搭建Node Exporter

curl -LO https://github.com/prometheus/node_exporter/releases/download/v1.4.0/node_exporter-1.4.0.linux-amd64.tar.gz
tar -zxvf node_exporter-1.4.0.linux-amd64.tar.gz
vim /usr/lib/systemd/system/node_exporter.service

[unit]
Description=The node_exporter Server
Wants=network-online.target
After=network.target

[Service]
ExecStart=/opt/node_exporter/node_exporter
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartSec=15s
SyslogIdentifier=node_exporter

[Install]
WantedBy=multi-user.target

# 启动
systemctl daemon-reload
systemctl start node_exporter
systemctl status node_exporter
systemctl enable node_exporter

监控告警配置

监控配置

1、主机监控:使用文件服务发现机制,不过我在此没有使用服务注册发现机制consul

# 添加prometheus.yml配置文件
# 采集内部VMWare集群中的主机信息
  - job_name: "vmware-host"
    metrics_path: /metrics
    scheme: http
    scrape_interval: 5s
    file_sd_configs:
      - files: 
        - /data/monitor/prometheus/targets/node-*.yml
        refresh_interval: 2m


# 新建node-it.yml文件
- labels:
    service: it-monitor
    brand: dell
  targets:
    - 172.17.40.51:9100
    - 172.17.40.54:9100

动态加载配置文件:

curl -X POST localhost:9090/-/reload

2、交换机监控:使用文件服务发现机制

# 添加交换机类job
- job_name: "SNMP"
    file_sd_configs:
      - files: 
        - /data/monitor/prometheus/targets/network-*.yml
        refresh_interval: 2m
    # scrape_interval: 5s  # 针对SNMP采集节点 覆盖全局配置15s
    metrics_path: /snmp
    params:
      module: 
        - if_mib
      # community: # 当 snmp_exporter snmp.yml 配置文件没有指定 community,此处定义的 community 生效。 缺省值一般是 public 
      #  - xxxx
    relabel_configs:
    - source_labels: ["__address__"]
      target_label: __param_target
    - source_labels: ["__param_target"]
      target_label: instance
    # prometheus采集目标直接修改为snmp_exporter 服务IP地址
    - target_label: __address__
      replacement: 172.17.40.54:9116 # snmp_exporter 服务IP地址
    - source_labels: ["mib"] # 从自定义的目标标签获取MIB模块名称
      target_label: __param_module

# 新建network-switch.yml文件 如何有多台就直接在文件后添加多台交换机target即可
- labels:
    mib: HUAWEI
    brand: Huawei
    hostname: HZZB-B2L-AG-Master
    model: S5720-36C-EI-AC
  targets:
    - 172.18.48.2
- labels:
    mib: HUAWEI
    brand: Huawei
    hostname: HZZB-B2L-Access-Master
    model: S5720S-52P-LI-AC
  targets:
    - 172.18.48.5
- labels:
    mib: HUAWEI
    brand: Huawei
    hostname: HZZB-B2L-POE-Master
    model: S5720S-28P-PWR-LI-AC
  targets:
    - 172.18.48.6
- labels:
    mib: HUAWEI
    brand: Huawei
    hostname: HZZB-BLJC-POE-Master
    model: S5720S-28P-PWR-LI-AC
  targets:
    - 172.17.14.13
- labels:
    mib: HUAWEI
    brand: Huawei
    hostname: HZZB-BLJC-Access-Master
    model: S5720S-52P-LI-AC
  targets:
    - 172.17.14.14

监控目标已添加完成,后续将讲解批量部署采集器和添加目标。

告警配置

前提:部署alertmanager,部署prometheus-webhook

思路:

  • 在alertmanager.yml配置文件中配置邮箱服务器,模板路径,路由数,分组,接收人(定义接受的对象,如邮箱,微信,钉钉)
  • 在prometheus-webhook配置文件config.yml中,来配置钉钉机器人的密钥与url(提前加好机器人),引用模板文件(就是alertmanager定义的模板)
  • 配置Prometheus与Alertmanager通信
  • 在Prometheus中创建告警规则
  • 重启服务,测试
# alertmanager.yml 配置模版
global:  # 全局配置
  resolve_timeout: 5m       # 处理告警超时时间 未接收到告警后标记告警状态为resolved
  # 邮箱配置
  smtp_smarthost: 'localhost:25'  # SMTP邮箱地址
  smtp_from: 'alertmanager@example.org'  # 邮件发件人
  smtp_auth_username: 'alertmanager'  # 发件人用户
  smtp_auth_password: 'password'  # 发件人密码
  smtp_hello: '@example.org'  # 标记身份
  smtp_require_tls: false  # TLS关闭

templates:
  - '/root/monitor/prometheus-webhook-dingtalk/template/*.tmpl'  # 告警模板路径

# 每个告警事件如何发送出去
route:
  group_by: ['alertname']  # 采用哪个标签作为分组的依据
  group_wait: 30s # 分组内第一个告警等待时间,10s内如有第二个告警会合并一个告警
  group_interval: 5m  # 发送新告警间隔时间 上下两组发送告警的间隔时间
  repeat_interval: 30m # 重复告警间隔发送时间,如果没处理过多久再次发送一次
  receiver: 'dingtalk_webhook' # 接收人 定义谁来通知报警

receivers:
 - name: 'ops'
   email_configs:
   - to: 'yanghua@souche.com'
     html: '{{ template "email.to.html" .}}'
     headers: { Subject: "[WARNING]Prometheus告警邮件" }
     send_resolved: true

 - name: 'dingtalk_webhook'
   webhook_configs:
   - url: 'http://172.17.40.51:8060/dingtalk/webhook1/send' # 填写prometheus-webhook的webhook1 url
     send_resolved: true     # 在恢复后是否发送恢复消息给接收人

官方示例文件:

alertmanager/simple.yml at main · prometheus/alertmanager · GitHubgithub.com/prometheus/alertmanager/blob/main/doc/examples/simple.yml

prometheus配置alert规则

# 告警插件配置
alerting:
  alertmanagers:
    - static_configs:
        - targets:
          - 172.17.40.51:9093

# 按照设定参数进行扫描加载,用于自定义报警规则,其报警媒介和route路由由alertmanager插件实现
rule_files:
  - "rules/*.yml"
  # - "second_rules.yml"

编写规则文件

# 这里在网上找了两个规则配置文件
groups:
- name: servers_status  # 这里名字是填写在group_by
  rules:
  - alert: CPU负载1分钟告警
    expr:  node_load1{job!~"(prometheus|vmware-host)"} / count (count (node_cpu_seconds_total{job!~"(prometheus|vmware-host)"}) without (mode)) by (instance, job) > 2.5
    for: 1m  
    labels:
      level: warning
    annotations:
      summary: "{{ $labels.instance }} CPU负载告警 "
      description: "{{$labels.instance}} 1分钟CPU负载(当前值: {{ $value }})"

  - alert: CPU使用率告警
    expr:  1 - avg(irate(node_cpu_seconds_total{mode="idle",job!~"(prometheus|vmware-host)"}[30m])) by (instance) > 0.85
    for: 1m  
    labels:
      level: warning
    annotations:
      summary: "{{ $labels.instance }} CPU使用率告警 "
      description: "{{$labels.instance}} CPU使用率超过85%(当前值: {{ $value }} )"

  - alert: CPU使用率告警 
    expr: 1 - avg(irate(node_cpu_seconds_total{mode="idle",job=~"(prometheus|vmware-host)"}[30m])) by (instance) > 0.9
    for: 1m
    labels:
      level: warning
    annotations:
      summary: "{{ $labels.instance }} CPU负载告警 "
      description: "{{$labels.instance}} CPU使用率超过90%(当前值: {{ $value }})"

  - alert:  内存使用率告警
    expr:  (1-node_memory_MemAvailable_bytes{job!="prometheus|vmware-host"} /  node_memory_MemTotal_bytes{job!="prometheus|vmware-host"}) * 100 > 90
    labels:
      level: critical
    annotations:
      summary: "{{ $labels.instance }} 可用内存不足告警"
      description: "{{$labels.instance}} 内存使用率已达90% (当前值: {{ $value }})"


  - alert:  磁盘使用率告警
    expr: 100 - (node_filesystem_avail_bytes{fstype=~"ext4|xfs", mountpoint !~ "/var/lib/[kubelet|rancher].*" } / node_filesystem_size_bytes{fstype=~"ext4|xfs", mountpoint !~ "/var/lib/[kubelet|rancher].*"}) * 100 > 85
    labels:
      level: warning
    annotations:
      summary: "{{ $labels.instance }} 磁盘使用率告警"
      description: "{{$labels.instance}} 磁盘使用率已超过85% (当前值: {{ $value }})"


主机存活检查

groups:
- name: servers_survival
  rules:
  - alert: 节点存活--IT环境--prometheus   #告警规则名称
    expr:  up{job="prometheus"}==0
    for: 1m    #等待评估时间
    labels:    #自定义标签,定义一个level标签,标记这个告警规则警告级别: critical严重,warning警告
      level: critical
    annotations:   #指定附加信息(邮件标题文本)
      summary: "机器 {{ $labels.instance }} 挂了"
      description: "服务器{{$labels.instance}} 挂了 (当前值: {{ $value }})"

  - alert: 节点存活--IT环境--其他服务器
    expr:  up{job="vmware-host"}==0
    for: 1m  
    labels:
      level: critical
    annotations:
      summary: "机器 {{ $labels.instance }} 挂了"
      description: "{{$labels.instance}} 宕机(当前值: {{ $value }})"

  #- alert: 节点存活--IT环境--生产ES服务器   
  #  expr:  up{job="hw-nodes-prod-ES"}==0
  #  for: 1m    
  #  labels:    
  #    level: critical
  #  annotations:   
  #    summary: "机器 {{ $labels.instance }} 挂了"
  #    description: "{{$labels.instance}} 宕机(当前值: {{ $value }})"


prometheus-webhook的配置如下:

## Request timeout
# timeout: 5s

## Uncomment following line in order to write template from scratch (be careful!)
#no_builtin_template: true

## Customizable templates path
templates:
  #- current/contrib/templates/legacy/template.tmpl
  - /root/monitor/prometheus-webhook-dingtalk/template/dingding.tmpl

## You can also override default template using `default_message`
## The following example to use the 'legacy' template from v0.3.0
#default_message:
#  title: '{{ template "legacy.title" . }}'
#  text: '{{ template "legacy.content" . }}'

## Targets, previously was known as "profiles"
targets:
  webhook1:
    url: https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxxxxxx
    # secret for signature 钉钉机器人加签
    secret: SECxxxxxxxxxxxx
  #webhook2:
  #  url: https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxxxxxx
  #webhook_legacy:
  #  url: https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxxxxxx
    # Customize template content
    message:
      # Use legacy template
      title: '{{ template "legacy.title" . }}'
      text: '{{ template "legacy.content" . }}'
  #webhook_mention_all:
  #  url: https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxxxxxx
  #  mention:
  #    all: true
  #webhook_mention_users:
  #  url: https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxxxxxx
  #  mention:
  #    mobiles: ['156xxxx8827', '189xxxx8325']

至此就完成告警的基础配置,下一篇介绍关于批量部署node exporter和告警规则文件优化和钉钉告警优化。