【云原生】Prometheus 自定义告警规则

【云原生】Prometheus 自定义告警规则

作者:liugp 2023-03-26 08:41:37

云计算

云原生 从Prometheus server端接收到alerts后,会基于PromQL的告警规则 分析数据,如果满足PromQL定义的规则,则会产生一条告警,并发送告警信息到Alertmanager,Alertmanager则是根据配置处理告警信息并发送。

一、概述

通过创建Prometheus监控告警规则,您可以制定针对特定Prometheus实例的告警规则。当告警规则设置的条件满足后,系统会产生对应的告警事件。如果想要收到通知,需要进一步配置对应的通知策略以生成告警并且以短信、邮件、电话、钉群机器人、企业微信机器人或者Webhook等方式发送通知。

从Prometheus server端接收到alerts后,会基于PromQL的告警规则 分析数据,如果满足PromQL定义的规则,则会产生一条告警,并发送告警信息到Alertmanager,Alertmanager则是根据配置处理告警信息并发送。所以Prometheus的告警配置依赖于PromQL与AlertManager,关于这两个介绍可以参考我以下文章:

  • 【云原生】Prometheus AlertManager讲解与实战操作
  • 【云原生】Prometheus PromQL讲解与实战操作
  • 【云原生】Prometheus Pushgetway讲解与实战操作
  • 官方文档:https://prometheus.io/docs/alerting/latest/overview/

二、告警实现流程

设置警报和通知的主要步骤是:

  1. 在Prometheus中配置告警规则。
  2. 配置Prometheus 与 AlertManager 关联。
  3. 配置 AlertManager 告警通道。

三、告警规则

官方文档:https://prometheus.io/docs/prometheus/latest/configuration/alerting_rules/

1)告警规则配置

在Prometheus 配置(prometheus.yml)中添加报警规则配置,配置文件中 rule_files 就是用来指定报警规则文件的,如下配置即指定存放报警规则的目录为/etc/prometheus,规则文件为rules.yml:

rule_files:
-/etc/prometheus/rules.yml

设置报警规则:

警报规则允许基于 Prometheus 表达式语言的表达式来定义报警报条件的,并在触发警报时发送通知给外部的接收者(Alertmanager),一条警报规则主要由以下几部分组成:

  • alert——告警规则的名称。
  • expr——是用于进行报警规则 PromQL 查询语句。
  • for——评估告警的等待时间(Pending Duration)。
  • labels——自定义标签,允许用户指定额外的标签列表,把它们附加在告警上。
  • annotations——用于存储一些额外的信息,用于报警信息的展示之类的。

rules.yml示例如下:

groups:
- name: example
rules:
- alert: high_memory
# 当内存占有率超过10%,持续1min,则触发告警
expr:100-((node_memory_MemAvailable_bytes{instance="192.168.182.110:9100",job="node_exporter"}*100)/ node_memory_MemTotal_bytes{instance="192.168.182.110:9100",job="node_exporter"})>90
for:1m
labels:
severity: page
annotations:
summary: spike memeory

2)监控服务器是否在线

对于被Prometheus监控的服务器,我们都有一个up指标,可以知道该服务是否在线。

up ==0  #服务下线了。
up ==1 #服务在线。

【示例】

groups:
- name: Test-Group-001 # 组的名字,在这个文件中必须要唯一
rules:
- alert: InstanceDown # 告警的名字,在组中需要唯一
expr: up ==0 # 表达式, 执行结果为true: 表示需要告警
for:1m # 超过多少时间才认为需要告警(即up==0需要持续的时间)
labels:
severity: warning # 定义标签
annotations:
summary:"服务 {{ $labels.instance }} 下线了"
description:"{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 1 minutes."

注意:

  • for 指定达到告警阈值之后,一致要持续多长时间,才发送告警数据。
  • labels 中可以指定自定义的标签,如果定义的标签已经存在,则会被覆盖。可以使用模板。
  • annotations 中的数据,可以使用模板,$labels表示告警数据的标签,{{$value}}表示时间序列的值。

3)告警数据的状态

  • Inactive——表示没有达到告警的阈值,即expr表达式不成立。
  • Pending——表示达到了告警的阈值,即expr表达式成立了,但是未满足告警的持续时间,即for的值。
  • Firing——已经达到阈值,且满足了告警的持续时间。

【温馨提示】经测试发现,如果同一个告警数据达到了Firing,那么不会再次产生一个告警数据,除非该告警解决了。

四、实战操作

1)下载 node_exporter

node-exporter用于采集node的运行指标,包括node的cpu、load、filesystem、meminfo、network等基础监控指标,类似于zabbix监控系统的的zabbix-agent。

下载地址:https://github.com/prometheus/node_exporter/releases/

wget https://github.com/prometheus/node_exporter/releases/download/v1.5.0/node_exporter-1.5.0.linux-amd64.tar.gz
tar -xzf node_exporter-1.5.0.linux-amd64.tar.gz

2)启动 node_exporter

ln -s /opt/prometheus/exporter/node_exporter/node_exporter-1.5.0.linux-amd64/node_exporter  /usr/local/bin/node_exporter
# 指定端口启动,默认端口:9100
node_exporter --web.listen-address=":9100"

配置node_exporter.service启动

# 默认端口9100
cat >/usr/lib/systemd/system/node_exporter.service<<EOF
[Unit]
Descriptinotallow=node_exporter
After=network.target
#可以创建相应的用户和组 启动
#User=prometheus
#Group=prometheus

[Service]
ExecStart=/opt/prometheus/exporter/node_exporter/node_exporter-1.5.0.linux-amd64/node_exporter --web.listen-address=:9100
[Install]
WantedBy=multi-user.target
EOF

启动服务

systemctl daemon-reload
systemctl start node_exporter
systemctl status node_exporter
systemctl enable node_exporter

检查

curl http://localhost:9100/metrics

3)配置Prometheus加载node_exporter

添加或修改配置 prometheus.yml

重启加载配置

systemctl restart prometheus
# 1、 kill方式
#kill -HUP pid
# 2、curl方式(推荐)
#curl -X POST http://IP/-/reload
# 【注意】需要在启动的命令行增加参数:--web.enable-lifecycle
curl -X POST http://192.168.182.110:9090/-/reload
# 3、重启(不推荐,重启会导致所有的连接短暂性中断)
systemctl restart prometheus

检查web:http://ip:9090/targets

4)告警规则配置

在Prometheus配置文件rometheus.yml 中配置如下:

在/etc/prometheus/rule.yml配置如下:

groups:
- name: Test-Group-001 # 组的名字,在这个文件中必须要唯一
rules:
- alert: InstanceDown # 告警的名字,在组中需要唯一
expr: up ==0 # 表达式, 执行结果为true: 表示需要告警
for:1m # 超过多少时间才认为需要告警(即up==0需要持续的时间)
labels:
severity: warning # 定义标签
annotations:
summary:"服务 {{ $labels.instance }} 下线了"
description:"{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 1 minutes."

重新加载

curl -X POST http://localhost:9090/-/reload

在web上就可以看到一个告警规则。

5)模拟告警

手动关机

sudo shutdown -h now

过了一段时间告警状态就变成Pending

再过一段时间告警就变成了Firing

6)配置告警通道

这里以有邮件告警为示例,其它的也差不多。修改配置之前最好先备份一下之前的配置

cp alertmanager.yml alertmanager.bak

【1】配置 alertmanager.yml

global:
resolve_timeout:5m
## 这里为qq邮箱 SMTP 服务地址,官方地址为 smtp.qq.com 端口为 465587,同时要设置开启 POP3/SMTP 服务。
smtp_smarthost:'smtp.qq.com:465'
smtp_from:'[email protected]'
smtp_auth_username:'[email protected]'
#授权码,不是密码,在 QQ 邮箱服务端设置开启 POP3/SMTP 服务时会提示
smtp_auth_password:'xxxxxxxx'
smtp_require_tls:false

#1、模板
templates:
-'/opt/prometheus/alertmanager/alertmanager-0.24.0.linux-amd64/templates/email.tmpl'

#2、路由
route:
group_by:['alertname']
group_wait:10s
group_interval:10s
repeat_interval:1h
#邮箱
receiver:'email'

receivers:
- name:'email'
email_configs:
## 接收警报的email(这里是引用模板文件中定义的变量)
- to:'{{ template "email.to"}}'
## 发送邮件的内容(调用模板文件中的)
html:'{{ template "email.to.html" .}}'
send_resolved:true

# 抑制器配置
inhibit_rules:
- source_match:
severity:'critical'
target_match:
severity:'warning'
#确保这个配置下的标签内容相同才会抑制,也就是说警报中必须有这三个标签值才会被抑制。
equal:['alertname','dev','instance']

【2】模板 alert.tmpl

模板文件配置了email.from、email.to、email.to.html 三种模板变量,可以在 alertmanager.yml 文件中直接配置引用。这里 email.to.html 就是要发送的邮件内容,支持 Html 和 Text 格式,这里为了显示好看,采用 Html 格式简单显示信息。下边 {{ range .Alerts }} 是个循环语法,用于循环获取匹配的 Alerts 的信息。

{{ define "email.from"}}xxxxxxxx@qq.com{{ end }}
{{ define "email.to"}}xxxxxxxx@163.com{{ end }}
{{ define "email.to.html"}}
{{ range .Alerts}}
=========start==========<br>
告警程序: prometheus_alert <br>
告警级别:{{.Labels.severity}}<br>
告警类型:{{.Labels.alertname}}<br>
故障主机:{{.Labels.instance}}<br>
告警主题:{{.Annotations.summary}}<br>
告警详情:{{.Annotations.description}}<br>
触发时间:{{.StartsAt.Format"2019-08-04 16:58:15"}}<br>
=========end==========<br>
{{ end }}
{{ end }}

【温馨提示】这里记得换成自己的邮箱地址!!!

重启alertmanager

systemctl restart alertmanager

在web上就可以看到对应的告警信息了。

接下来就静待告警了。

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/271397.html<

(0)
管理的头像管理
上一篇2025-05-08 06:32
下一篇 2025-05-08 06:34

相关推荐

  • jsp空间购买和交换数据空间怎么买,有哪些注意事项?

    购买JSP空间时,是否考虑过数据交换空间的性能?简米科技(2003年始创,23年行业沉淀)与酷番云(工信部一类增值电信全牌照)这类持牌自营机房的服务商,能确保数据交换的高效稳定,是值得优先选择的合作伙伴,为什么JSP空间需要搭配独立的数据交换空间从JSP应用特性看数据交换需求JSP基于Java技术,常用于企业级……

    2026-08-11
    0
  • 建网站用香港空间效果怎么样,香港空间稳定吗?

    建网站用香港空间,对于创建网站资产来说,核心价值在于免备案和全球带宽优势,尤其适合外贸、跨境电商和需要快速启动的项目,但你必须权衡国内访问延迟,并选择有资质的服务商以保证资产安全,香港空间的核心优势与适用边界免备案:节省时间就是节省成本国内服务器需要备案,通常需要10到20天,香港空间无需备案,域名解析后即可上……

    2026-08-11
    0
  • Java连接云数据库的方法是什么,如何操作

    Java连接云数据库的核心在于通过JDBC驱动,结合云服务商提供的连接地址、端口、数据库名及认证信息,配置安全策略(如SSL、IP白名单),即可实现稳定高效的远程数据库访问,基础准备:JDBC驱动与依赖管理连接云数据库前,需要确保开发环境具备对应的JDBC驱动,以最常见的MySQL为例,你需要引入mysql-c……

    2026-08-11
    0
  • 建网站公安联网备案必须使用数据码吗,备案流程是什么

    网站备案包括ICP备案和公安联网备案,两者缺一不可,公安联网备案必须使用服务商提供的数据码,选择持有合法资质的服务商是顺利通过备案的前提,为什么网站必须进行公安联网备案根据公安部《计算机信息网络国际联网安全保护管理办法》,网站开通后30日内必须到公安机关办理备案手续,未完成公安备案的网站,面临责令整改、关闭网站……

    2026-08-10
    0
  • 建一个企业网站大概需要多少钱?,怎么收费?

    建网站要多少钱,没有一个固定的数字,几百到几万都可能,但真正的“创建网站资产”绝不仅仅是初次投入的成本,而是基于长期稳定、合规和安全的持续性投入,其中核心取决于你选择了什么样的“地基”来承载你的业务,建站预算的构成与行业基准当你开始规划一个网站,最先面对的就是预算问题,一个常见的误区是只关注网站“看起来”的建造……

    2026-08-10
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注