4、自监控体系设计:监控Prometheus自身、监控Loki、监控Alertmanager、监控Grafana
在可观测性平台中,监控系统本身(Prometheus、Loki、Alertmanager、Grafana)的稳定性直接决定了整个可观测性体系的可靠性。如果监控系统自身发生故障而未被及时发现,将导致所有业务指标的盲区。本章详细阐述如何为这四个核心组件设计一套完整的自监控体系,涵盖指标采集、告警规则、健康检查与自愈策略。
4.1 自监控体系总体架构
自监控体系采用“分层监控、闭环自愈”的设计原则。每一层组件既对外提供服务,也被上层或同层的监控节点所监控。核心架构包含以下四个层次:
- 指标采集层:Prometheus Server 通过内置的
/metrics端点暴露自身运行指标,同时通过scrape配置采集其他组件的指标。 - 日志采集层:Loki 通过 Promtail 或直接暴露的
/metrics端点提供日志处理状态指标。 - 告警管理层:Alertmanager 暴露告警处理、抑制、静默等内部指标。
- 可视化层:Grafana 暴露面板加载、数据源连接、HTTP 请求等指标。
设计要点:自监控体系必须避免“循环依赖”。例如,Grafana 的告警规则不应仅依赖同一个 Grafana 实例的数据源,而应使用独立的 Prometheus 实例或联邦集群来承载自监控指标。
4.2 监控Prometheus自身
Prometheus Server 暴露了丰富的内部指标,路径为 /metrics。以下表格列出了关键的自监控指标及其含义:
| 指标名称 | 类型 | 含义 | 告警阈值建议 |
|---|---|---|---|
prometheus_tsdb_head_series |
Gauge | 当前 TSDB 中活跃的时间序列数量 | > 最大容量 80% |
prometheus_tsdb_head_chunks |
Gauge | 当前 head 块中的 chunk 数量 | > 1000 万 |
prometheus_tsdb_blocks_loaded |
Gauge | 已加载的持久化块数量 | 持续增长异常 |
prometheus_target_scrapes_total |
Counter | 总抓取次数 | 无(用于计算失败率) |
prometheus_target_scrapes_exceeded_sample_limit_total |
Counter | 因样本数超限而失败的抓取次数 | > 0 |
prometheus_rule_evaluation_duration_seconds |
Summary | 规则评估耗时 | P99 > 5s |
up{job="prometheus"} |
Gauge | Prometheus 实例是否存活 | == 0 |
最佳实践:建议为 Prometheus 配置独立的
scrape_config 来抓取自身指标,并设置较短的抓取间隔(如 15s),以便快速发现异常。
4.2.1 Prometheus 自监控告警规则示例
groups:
- name: prometheus_self_monitoring
rules:
- alert: PrometheusDown
expr: up{job="prometheus"} == 0
for: 1m
annotations:
summary: "Prometheus 实例 {{ $labels.instance }} 已宕机"
- alert: PrometheusTSDBHighSeries
expr: prometheus_tsdb_head_series / 1000000 > 0.8
for: 5m
annotations:
summary: "Prometheus TSDB 活跃序列数超过 80% 容量"
- alert: PrometheusScrapeFailures
expr: rate(prometheus_target_scrapes_total{job="prometheus"}[5m]) - rate(prometheus_target_scrapes_exceeded_sample_limit_total{job="prometheus"}[5m]) > 0.1
for: 5m
annotations:
summary: "Prometheus 抓取失败率过高"
4.3 监控Loki
Loki 通过 /metrics 端点暴露其内部状态。关键指标包括日志摄入速率、存储操作延迟、查询性能等。以下表格列出了 Loki 自监控的核心指标:
| 指标名称 | 类型 | 含义 | 告警阈值建议 |
|---|---|---|---|
loki_ingester_memory_streams |
Gauge | Ingester 当前管理的日志流数量 | > 最大限制 80% |
loki_ingester_chunks_flushed_total |
Counter | 已刷新的 chunk 总数 | 无(用于计算刷新速率) |
loki_ingester_chunks_flush_failures_total |
Counter | chunk 刷新失败次数 | > 0 |
loki_distributor_ingester_appends_total |
Counter | Distributor 发送给 Ingester 的追加请求总数 | 无(用于计算速率) |
loki_distributor_ingester_append_failures_total |
Counter | 追加请求失败次数 | > 0 |
loki_logql_queries_total |
Counter | LogQL 查询总数 | 无(用于计算 QPS) |
loki_logql_query_duration_seconds |
Histogram | LogQL 查询耗时分布 | P99 > 10s |
注意:Loki 的 Ingester 是有状态组件,如果内存中的流数量超过限制,会导致 OOM 或拒绝写入。务必监控
loki_ingester_memory_streams 并设置合理的告警阈值。
4.3.1 Loki 自监控告警规则示例
groups:
- name: loki_self_monitoring
rules:
- alert: LokiIngesterHighMemoryStreams
expr: loki_ingester_memory_streams / 100000 > 0.8
for: 5m
annotations:
summary: "Loki Ingester 内存流数量超过 80% 限制"
- alert: LokiChunkFlushFailures
expr: rate(loki_ingester_chunks_flush_failures_total[5m]) > 0
for: 2m
annotations:
summary: "Loki chunk 刷新失败"
- alert: LokiQueryHighLatency
expr: histogram_quantile(0.99, rate(loki_logql_query_duration_seconds_bucket[5m])) > 10
for: 5m
annotations:
summary: "Loki LogQL 查询 P99 延迟超过 10s"
4.4 监控Alertmanager
Alertmanager 负责告警的去重、分组、抑制和发送。其自监控指标主要关注告警处理状态、通知发送成功率等。以下表格列出了关键指标:
| 指标名称 | 类型 | 含义 | 告警阈值建议 |
|---|---|---|---|
alertmanager_alerts |
Gauge | 当前处于各种状态的告警数量(按 state 标签区分) | 无(用于观察告警积压) |
alertmanager_alerts_invalid_total |
Counter | 无效告警总数 | > 0 |
alertmanager_notifications_total |
Counter | 通知发送总数(按 integration 标签区分) | 无(用于计算发送速率) |
alertmanager_notifications_failed_total |
Counter | 通知发送失败总数 | > 0 |
alertmanager_silences |
Gauge | 当前静默规则数量 | 无(用于审计) |
process_cpu_seconds_total |
Counter | Alertmanager 进程 CPU 使用时间 | 无(用于资源监控) |
关键点:Alertmanager 的通知失败率是最重要的自监控指标之一。如果通知通道(如邮件、Slack、PagerDuty)不可用,告警将无法送达,整个告警体系失效。
4.4.1 Alertmanager 自监控告警规则示例
groups:
- name: alertmanager_self_monitoring
rules:
- alert: AlertmanagerNotificationFailures
expr: rate(alertmanager_notifications_failed_total[5m]) > 0
for: 2m
annotations:
summary: "Alertmanager 通知发送失败"
- alert: AlertmanagerInvalidAlerts
expr: rate(alertmanager_alerts_invalid_total[5m]) > 0
for: 5m
annotations:
summary: "Alertmanager 收到无效告警"
- alert: AlertmanagerDown
expr: up{job="alertmanager"} == 0
for: 1m
annotations:
summary: "Alertmanager 实例 {{ $labels.instance }} 已宕机"
4.5 监控Grafana
Grafana 通过 /metrics 端点暴露其内部指标,包括 HTTP 请求、面板加载、数据源连接、用户会话等。以下表格列出了 Grafana 自监控的核心指标:
| 指标名称 | 类型 | 含义 | 告警阈值建议 |
|---|---|---|---|
grafana_http_request_duration_seconds |
Histogram | HTTP 请求耗时分布 | P99 > 5s |
grafana_http_request_total |
Counter | HTTP 请求总数(按 status_code 标签区分) | 无(用于计算错误率) |
grafana_alerting_rule_evaluations_total |
Counter | Grafana 告警规则评估总数 | 无(用于计算评估速率) |
grafana_alerting_rule_evaluation_failures_total |
Counter | Grafana 告警规则评估失败总数 | > 0 |
grafana_datasource_request_duration_seconds |
Histogram | 数据源请求耗时分布 | P99 > 10s |
grafana_datasource_request_total |
Counter | 数据源请求总数(按 datasource 标签区分) | 无(用于计算错误率) |
grafana_stats_active_users |
Gauge | 当前活跃用户数 | 无(用于容量规划) |
注意:Grafana 的数据源请求延迟直接反映了后端数据源(如 Prometheus、Loki)的健康状况。如果
grafana_datasource_request_duration_seconds 持续升高,应优先排查后端数据源。
4.5.1 Grafana 自监控告警规则示例
groups:
- name: grafana_self_monitoring
rules:
- alert: GrafanaHighRequestLatency
expr: histogram_quantile(0.99, rate(grafana_http_request_duration_seconds_bucket[5m])) > 5
for: 5m
annotations:
summary: "Grafana HTTP 请求 P99 延迟超过 5s"
- alert: GrafanaAlertRuleEvaluationFailures
expr: rate(grafana_alerting_rule_evaluation_failures_total[5m]) > 0
for: 2m
annotations:
summary: "Grafana 告警规则评估失败"
- alert: GrafanaDown
expr: up{job="grafana"} == 0
for: 1m
annotations:
summary: "Grafana 实例 {{ $labels.instance }} 已宕机"
4.6 自愈策略设计
自监控体系不仅需要发现故障,还应具备自动恢复能力。以下表格总结了针对不同组件的常见自愈策略:
| 组件 | 故障场景 | 自愈策略 | 实现方式 |
|---|---|---|---|
| Prometheus | 进程崩溃、OOM | 自动重启、资源限制调整 | systemd 自动重启、Kubernetes liveness probe |
| Prometheus | TSDB 损坏 | 自动清理 WAL、重建 TSDB | 启动脚本检测、远程存储恢复 |
| Loki | Ingester OOM | 自动重启、减少流限制 | Kubernetes liveness probe、配置热更新 |
| Loki | chunk 刷新失败 | 重试、切换存储后端 | Loki 内置重试机制、多后端配置 |
| Alertmanager | 通知通道不可用 | 切换备用通知通道、重试 | Alertmanager 内置重试、多接收器配置 |
| Grafana | 数据库连接失败 | 自动重连、切换数据库 | Grafana 内置重试、数据库主从切换 |
| Grafana | 面板渲染超时 | 清理缓存、重启渲染服务 | 脚本定时清理、Kubernetes liveness probe |
自愈设计原则:自愈操作应具备“幂等性”和“安全回退”机制。例如,自动重启操作应设置最大重启次数,避免陷入无限重启循环。同时,所有自愈操作都应记录日志并触发告警,以便人工审计。
4.7 自监控体系部署建议
为了确保自监控体系的高可用性,建议遵循以下部署原则:
- 独立 Prometheus 实例:部署一个独立的 Prometheus 实例专门用于采集自监控指标,避免与业务监控实例共享资源。
- 联邦集群:如果业务 Prometheus 实例较多,可以使用联邦集群(Federation)将自监控指标汇总到中央 Prometheus。
- 多副本部署:Alertmanager 和 Grafana 应部署多副本,并使用负载均衡器分发流量。
- 持久化存储:自监控数据应保留至少 30 天,用于故障复盘和容量规划。
- 告警通知冗余:自监控的告警通知应使用与业务告警不同的通道(如独立的 Slack 频道或邮件列表),避免通道故障导致自监控告警丢失。
推荐实践:在自监控 Prometheus 中配置
scrape_config 时,建议使用 relabel_configs 为自监控指标添加 source="self-monitoring" 标签,便于在 Grafana 中区分和过滤。