homelab告警规则:Prometheus告警表达式编写指南
告警系统架构概览
homelab项目采用Prometheus生态构建监控告警体系,核心配置位于system/monitoring-system/values.yaml。该配置通过kube-prometheus-stack实现Prometheus与Alertmanager集成,采用Webhook Transformer组件(files/webhook-transformer/alertmanager-to-ntfy.jsonnet)实现告警消息格式转换,最终通过ntfy服务推送通知。
告警处理流程
- Prometheus采集监控指标并基于规则文件计算告警状态
- 触发阈值时向Alertmanager发送告警事件
- Alertmanager按路由规则分组、抑制和静默处理
- 通过Webhook转发至通知服务(如ntfy)
基础表达式语法
数据类型与操作符
Prometheus支持数值型时间序列数据,核心操作符包括:
- 比较运算符:
><>=<===!= - 算术运算符:
+-*/%^ - 逻辑运算符:
andorunless
常用函数
# 计算5分钟内CPU使用率平均值
avg(rate(node_cpu_seconds_total{mode!="idle"}[5m])) by (instance) * 100
# 检测服务可用性
sum(up{job="kube-apiserver"} == 0) > 0
关键告警规则示例
节点资源告警
# 高CPU使用率告警
- alert: HighCPUUsage
expr: avg(rate(node_cpu_seconds_total{mode!="idle"}[5m])) by (instance) * 100 > 80
for: 5m
labels:
severity: warning
annotations:
summary: "节点CPU使用率过高"
description: "节点 {{ $labels.instance }} CPU使用率超过80% (当前值: {{ $value | humanizePercentage }})"
容器异常告警
# 容器重启告警
- alert: ContainerRestarting
expr: increase(kube_pod_container_status_restarts_total[15m]) > 3
for: 2m
labels:
severity: critical
annotations:
summary: "容器频繁重启"
description: "Pod {{ $labels.pod }} 容器 {{ $labels.container }} 15分钟内重启超过3次"
存储告警
# 磁盘空间告警
- alert: DiskSpaceLow
expr: (node_filesystem_size_bytes - node_filesystem_free_bytes) / node_filesystem_size_bytes * 100 > 85
for: 10m
labels:
severity: warning
annotations:
summary: "磁盘空间不足"
description: "设备 {{ $labels.device }} 使用率超过85% (挂载点: {{ $labels.mountpoint }})"
高级告警策略
时间窗口计算
使用rate()和irate()函数处理计数器类型指标:
rate():适合长期趋势分析,计算指定时间窗口内的平均增长率irate():适合短期突发变化,计算最近两个样本的增长率
# 网络流量突发告警
sum(irate(node_network_transmit_bytes_total[2m])) by (instance) > 10000000
标签匹配与聚合
使用by()和without()实现指标聚合:
# 多节点CPU负载均衡告警
max(avg(rate(node_cpu_seconds_total{mode!="idle"}[5m])) by (instance))
/
min(avg(rate(node_cpu_seconds_total{mode!="idle"}[5m])) by (instance))
> 2
告警抑制规则
在system/monitoring-system/values.yaml中配置抑制规则,避免级联告警风暴:
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'instance']
规则调试与验证
表达式测试方法
- 在Prometheus UI的"Graph"页面测试查询
- 使用
promtool命令行工具验证规则文件:
promtool check rules alerts/*.rules.yml
常见问题排查
- 告警延迟:检查
for子句设置,确保采集间隔合理 - 误报频繁:调整阈值或增加
for持续时间 - 指标缺失:验证
job和instance标签是否正确
最佳实践与模板
规则文件组织
建议按功能模块拆分规则文件:
monitoring/
├── node-alerts.rules.yml # 节点级告警
├── k8s-alerts.rules.yml # Kubernetes集群告警
├── application-alerts.rules.yml # 应用告警
标准注解模板
annotations:
summary: "{{ $labels.alertname }}"
description: "触发条件: {{ $value }}\n影响对象: {{ $labels.instance }}\n开始时间: {{ $labels.startsAt }}"
runbook_url: "https://homelab-docs.example.com/runbooks/{{ $labels.alertname }}"
内置告警参考
homelab默认配置包含基础看门狗告警(system/monitoring-system/values.yaml第46行):
routes:
- receiver: ntfy
matchers:
- alertname = "Watchdog"
扩展阅读
- 官方文档:docs/concepts/testing.md
- 告警规则源码:system/monitoring-system/
- 配置示例:system/prometheus/
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



