4、自监控体系设计:监控Prometheus自身、监控Loki、监控Alertmanager、监控Grafana

在可观测性平台中,监控系统本身(Prometheus、Loki、Alertmanager、Grafana)的稳定性直接决定了整个可观测性体系的可靠性。如果监控系统自身发生故障而未被及时发现,将导致所有业务指标的盲区。本章详细阐述如何为这四个核心组件设计一套完整的自监控体系,涵盖指标采集、告警规则、健康检查与自愈策略。

4.1 自监控体系总体架构

自监控体系采用“分层监控、闭环自愈”的设计原则。每一层组件既对外提供服务,也被上层或同层的监控节点所监控。核心架构包含以下四个层次:

  • 指标采集层:Prometheus Server 通过内置的 /metrics 端点暴露自身运行指标,同时通过 scrape 配置采集其他组件的指标。
  • 日志采集层:Loki 通过 Promtail 或直接暴露的 /metrics 端点提供日志处理状态指标。
  • 告警管理层:Alertmanager 暴露告警处理、抑制、静默等内部指标。
  • 可视化层:Grafana 暴露面板加载、数据源连接、HTTP 请求等指标。
设计要点:自监控体系必须避免“循环依赖”。例如,Grafana 的告警规则不应仅依赖同一个 Grafana 实例的数据源,而应使用独立的 Prometheus 实例或联邦集群来承载自监控指标。
自监控体系分层架构 自监控体系分层架构 业务应用层 业务指标 / 业务日志 / 业务告警 可观测性平台 Prometheus(指标) | Loki(日志) | Alertmanager(告警) | Grafana(可视化) 自监控层 自监控 Prometheus | 自监控 Loki | 自监控 Alertmanager | 自监控 Grafana 自愈与告警通知层 避免循环依赖

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 中区分和过滤。