马哥Linux运维 | Prometheus 告警规则生产级配置:50+ 核心指标与最佳实践(二)

本文来源公众号“马哥Linux运维”,仅用于学术分享,侵权删,干货满满。

原文链接:https://mp.weixin.qq.com/s/X4ADdHOXtQw5Hy5iQSal8A

文章略长,分为(一)、(二)、(三)和(四)两部分,一起学习吧!

马哥Linux运维 | Prometheus 告警规则生产级配置:50+ 核心指标与最佳实践(一)-优快云博客

7️⃣ 最小必要原理

PromQL 查询引擎核心机制

时间序列数据模型:Prometheus 将所有指标存储为时间序列,每个时间序列由指标名称 + 标签集唯一标识:

node_cpu_seconds_total{cpu="0", mode="idle", instance="192.168.1.10:9100", job="node_exporter"}

查询执行流程:

  1. 1. 选择器解析up{job="node_exporter"} → 找到所有匹配标签的时间序列

  2. 2. 范围向量计算[5m] → 提取过去 5 分钟的所有数据点

  3. 3. 函数执行rate() → 计算每秒平均变化率

  4. 4. 聚合操作sum by(instance) → 按 instance 标签分组求和

  5. 5. 比较判断> 80 → 返回满足条件的时间序列

告警规则评估机制:

PromQL 查询 → 返回向量 → for 持续时间判断 → 状态转换 → 发送到 Alertmanager

状态转换模型:

Inactive(未触发)
   ↓ PromQL 条件满足
Pending(等待中,for 持续时间未达到)
   ↓ for 持续时间达到
Firing(告警中)
   ↓ PromQL 条件不满足
Resolved(已恢复)

为什么需要 for 持续时间?

  • • 防止瞬时抖动触发告警(如 CPU 瞬间峰值)

  • • 平衡告警响应速度与误报率

  • • 典型值:critical=1-5 分钟,warning=5-10 分钟,info=10-30 分钟

Alertmanager 告警处理流程:

接收告警 → 分组(group_by) → 抑制(inhibit_rules) → 静默(silences) → 路由(route) → 去重 → 发送通知

分组机制:同一组的多个告警会合并成一条通知,避免告警风暴。例如:

  • • 10 台服务器同时 CPU 高负载 → 合并为 1 条通知

  • • 分组键: ['alertname', 'cluster']

抑制机制:当 source 告警触发时,target 告警会被抑制。例如:

  • • NodeDown 触发 → 抑制该节点的所有其他告警(HighCPUUsage/HighMemoryUsage/DiskSpaceLow)

  • • 原理:节点宕机已经是最严重问题,其他告警无需重复通知


8️⃣ 可观测性(监控 + 告警 + 性能)

监控指标

Linux 原生监控:

# 实时查看 Prometheus 运行状态
systemctl status prometheus

# 查看 Prometheus 日志
sudo journalctl -u prometheus -f --since "10 minutes ago"

# 检查 TSDB 存储大小
du -sh /var/lib/prometheus/

# 查看活跃时间序列数量
curl -s http://localhost:9090/api/v1/status/tsdb | jq '.data.numSeries'
# 预期输出:10000-50000(取决于监控规模)

# 查看告警规则状态
curl -s http://localhost:9090/api/v1/rules | jq '.data.groups[].rules[] | select(.type=="alerting") | {name: .name, state: .state}'

Prometheus 自监控指标:

# TSDB 大小(字节)
prometheus_tsdb_storage_blocks_bytes

# 活跃时间序列数
prometheus_tsdb_head_series

# 每秒抓取样本数
rate(prometheus_tsdb_head_samples_appended_total[5m])

# 规则评估耗时(P99)
histogram_quantile(0.99, rate(prometheus_rule_evaluation_duration_seconds_bucket[5m]))

# Alertmanager 通知发送成功率
rate(alertmanager_notifications_total{integration="slack"}[5m])
/
rate(alertmanager_notifications_failed_total{integration="slack"}[5m])

Prometheus 告警规则(监控系统自身)

# /etc/prometheus/rules/prometheus_performance.yml
groups:
-name:prometheus_performance
interval:30s
rules:
# 时间序列增长过快
-alert:PrometheusTimeSeriesGrowth
expr:|
          rate(prometheus_tsdb_head_series[1h]) > 1000
for:30m
labels:
severity:warning
annotations:
summary:"Prometheus 时间序列增长过快"
description:"每小时新增 {{ $value }} 个时间序列,可能存在高基数标签"

# 规则评估耗时过长
-alert:PrometheusSlowRuleEvaluation
expr:|
          histogram_quantile(0.99, rate(prometheus_rule_evaluation_duration_seconds_bucket[5m])) > 10
for:15m
labels:
severity:warning
annotations:
summary:"Prometheus 规则评估耗时过长"
description:"P99 评估耗时超过 10 秒,当前值: {{ $value }}s"

# WAL 损坏
-alert:PrometheusWALCorruption
expr:|
          rate(prometheus_tsdb_wal_corruptions_total[5m]) > 0
for:0m
labels:
severity:critical
annotations:
summary:"Prometheus WAL 文件损坏"
description:"检测到 WAL 损坏,数据可能丢失"

性能基准测试

测试场景 1: 抓取性能

# 模拟 100 个目标,每个目标 1000 个指标
# 预期:Prometheus 每 15 秒抓取一次,CPU < 50%,内存 < 4GB

# 查询当前抓取目标数
curl -s http://localhost:9090/api/v1/targets | jq '.data.activeTargets | length'

# 查询每秒采集样本数
curl -s http://localhost:9090/api/v1/query --data-urlencode 'query=rate(prometheus_tsdb_head_samples_appended_total[5m])' | jq '.data.result[0].value[1]'
# 预期输出:6666.67(100 目标 x 1000 指标 / 15 秒)

测试场景 2: 查询性能

# 测试复杂查询耗时
time curl -s 'http://localhost:9090/api/v1/query' --data-urlencode 'query=histogram_quantile(0.95, sum(rate(http_request_duration_seconds_bucket[5m])) by (job, le))'
# 预期输出:real 0m0.123s(< 200ms)

# 测试范围查询耗时(过去 24 小时)
time curl -s 'http://localhost:9090/api/v1/query_range' \
  --data-urlencode 'query=up{job="node_exporter"}' \
  --data-urlencode 'start=2025-01-16T00:00:00Z' \
  --data-urlencode 'end=2025-01-17T00:00:00Z' \
  --data-urlencode 'step=60s'
# 预期输出:real 0m2.456s(< 5s)

调优参数(prometheus.yml):

global:
# 调优:降低抓取间隔可减少数据量
scrape_interval:30s# 默认 15s,推荐 15-60s

storage:
tsdb:
# 调优:数据保留时间(默认 15 天)
retention.time:15d

# 调优:数据保留大小(优先于 retention.time)
retention.size:50GB

# 调优:WAL 压缩(启用可减少磁盘 I/O)
wal_compression:true

[已实测] 性能数据(RHEL 8.7, 8C16G):

  • • 监控 100 台服务器(每台 1000 指标)

  • • 时间序列总数:100K

  • • CPU 使用率:30-40%

  • • 内存使用:6-8GB

  • • 磁盘 I/O:< 10MB/s 写入

  • • 查询 P95 延迟:< 200ms

后续内容请看(三)。

THE END !

文章结束,感谢阅读。您的点赞,收藏,评论是我继续更新的动力。大家有推荐的公众号可以评论区留言,共同学习,一起进步。

SRE(Site Reliability Engineering,站点可靠性工程)是 Google 提出的一种运维方法论,旨在通过软件工程的方法来解决系统运维问题,实现高可用、可扩展和高效的系统运行。永亮)作为国内知名的 IT 培训讲师之一,在 DevOps 和 SRE 领域有较深的研究和实践经验,其课程体系通常涵盖从基础到高的多个阶段。 ### 3.1 SRE 学习路线图概述 SRE 的学习路径通常包括以下几个阶段: - **基础阶段**:掌握 Linux 系统管理、网络基础、Shell 脚本编程、常见服务的部署维护等。 - **进阶阶段**:学习自动化运维工具(如 Ansible、Chef、Puppet)、配置管理、CI/CD 流水线构建、容器化技术(如 Docker、Kubernetes)。 - **高阶段**:深入理解监控系统(如 Prometheus、Grafana)、日志管理(如 ELK Stack)、服务网格(如 Istio)、性能优化、故障排查恢复机制。 - **实践阶段**:参真实项目实践,构建高可用系统、设计灾备方案、实施自动化运维流程[^1]。 ### 3.2 SRE 课程内容概览 的 SRE 相关课程通常包括以下内容: - **Linux 系统管理调优** - 用户权限管理 - 文件系统磁盘管理 - 网络配置故障排查 - 系统性能监控调优 - **自动化运维工具** ```bash # 示例:使用 Ansible 实现自动化部署 - name: Install nginx hosts: webservers tasks: - name: Install nginx package apt: name: nginx state: present ``` - **容器编排技术** - Docker 基础使用 - Kubernetes 架构部署 - Helm 包管理器 - 服务网格 Istio 入门 - **监控日志** - Prometheus 监控系统部署告警配置 - ELK Stack 日志收集分析 - Grafana 数据可视化 - **CI/CD 流水线** - GitLab CI/CD 实践 - Jenkins 流水线配置 - GitHub Actions 自动化构建部署 - **高可用灾备** - 负载均衡 HA 架构设计 - 数据备份恢复策略 - 故障自愈机制设计 ### 3.3 职业发展路径 SRE 职业发展路径通常包括以下几个方向: - **初 SRE 工程师**:负责日常运维支持、监控告警配置、基础自动化脚本编写。 - **中 SRE 工程师**:主导自动化运维平台建设、参系统架构优化、设计高可用方案。 - **高 SRE 工程师**:负责大规模系统的稳定性保障、推动 SRE 文化落地、制定运维策略标准。 - **SRE 架构师/技术负责人**:参公司技术决策、指导团队技术方向、推动 DevOps SRE 实践融合[^1]。 ### 3.4 学习资源建议 - **书籍推荐**: - 《Site Reliability Engineering》—— Google 官方出版的 SRE 指南 - 《The Phoenix Project》—— 一本关于 DevOps 实践的小说 - 《DevOps 实践指南》—— Gene Kim 等人编写,涵盖 DevOps SRE 的最佳实践 - **在线课程**: - 教育官网提供完整的 SRE DevOps 课程体系,涵盖从 Linux 基础到 Kubernetes 高实战。 - Coursera 上的 Google Cloud SRE 课程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值