2. Prometheus 基础回顾:架构、核心组件与数据模型

在开始模板发布之前,有必要重新梳理 Prometheus 的核心基础。本章将聚焦 Prometheus 的整体架构、三大核心组件(Server、Alertmanager、Pushgateway)以及其独特的数据模型,为后续的采集作业模板设计打下坚实的理论基础。

2.1 Prometheus 整体架构

Prometheus 采用“拉取(Pull)”模式作为主要的指标采集方式,同时支持通过 Pushgateway 接收“推送(Push)”模式的指标。其核心组件围绕指标的生命周期进行设计:采集、存储、查询、告警。

Prometheus 整体架构图 Prometheus 整体架构 被监控目标 被监控目标 被监控目标 服务发现 (kubernetes_sd_configs) (file_sd_configs) (consul_sd_configs) Prometheus Server 检索器 · 存储 · HTTP API 告警规则 · 记录规则 Pushgateway Alertmanager Grafana API Clients 核心流程: 1. Server 通过服务发现获取目标列表 2. 定期拉取 (Pull) 指标 /metrics 端点 3. 存储并评估告警规则,推送至 Alertmanager
架构要点:Prometheus 的“拉取”模式是其设计哲学的核心,它使得 Server 能够主动控制采集节奏,避免被监控端过载。服务发现机制(如 Kubernetes SD)是自动化运维的关键。

2.2 核心组件详解

Prometheus 生态由多个组件构成,其中 Server、Alertmanager 和 Pushgateway 是三个最核心的组件。下表对比了它们的功能定位与使用场景。

组件 核心功能 数据流向 典型场景
Prometheus Server 指标采集、存储、查询、告警规则评估 Pull(拉取) 所有标准监控场景,如 Kubernetes 集群、应用服务
Alertmanager 告警去重、分组、静默、路由、通知 接收 Server 推送 将告警发送至邮件、Slack、PagerDuty 等
Pushgateway 接收短期任务或无法直接 Pull 的指标 Push(推送) 批处理作业、CronJob、防火墙后的服务

2.2.1 Prometheus Server

Server 是 Prometheus 的大脑,负责所有核心工作。它通过 scrape_configs 定义采集作业,定期从目标端点拉取指标数据,并将其存储在本地的时间序列数据库中。同时,Server 会定期评估 rules 文件中定义的告警规则和记录规则。

关键配置示例(prometheus.yml):
global:
  scrape_interval: 15s
  evaluation_interval: 15s

scrape_configs:
  - job_name: 'node_exporter'
    static_configs:
      - targets: ['localhost:9100']

rule_files:
  - 'alert_rules.yml'
  - 'record_rules.yml'

2.2.2 Alertmanager

Alertmanager 负责处理由 Prometheus Server 推送过来的告警。它不是一个简单的转发器,而是具备强大的告警管理能力:

  • 分组(Grouping):将同一类告警合并为一条通知,避免告警风暴。
  • 静默(Silencing):在维护窗口期屏蔽特定告警。
  • 抑制(Inhibition):当某个高级别告警触发时,自动抑制相关的低级别告警。

2.2.3 Pushgateway

Pushgateway 主要用于解决 Prometheus 无法直接 Pull 的场景。例如,一个运行几分钟的批处理任务,在任务结束时才暴露指标,Server 无法在任务运行期间拉取到数据。此时,任务可以将指标 Push 到 Pushgateway,由 Server 从 Pushgateway 拉取。

使用注意:Pushgateway 不应作为绕过 Prometheus 拉取模式的通用方案。它会导致单点故障和指标生命周期管理复杂化。仅适用于短期作业或网络隔离场景。

2.3 数据模型

Prometheus 的数据模型是其强大查询能力的基础。所有采集到的数据都被存储为时间序列(Time Series),每个时间序列由指标名称(Metric Name)和一组标签(Labels)唯一标识。

Prometheus 数据模型结构 Prometheus 数据模型:时间序列 node_cpu_seconds_total{job="node", instance="10.0.0.1:9100", mode="idle"} node_cpu_seconds_total{job="node", instance="10.0.0.1:9100", mode="user"} http_requests_total{job="api", instance="10.0.0.2:8080", method="GET", status="200"} 结构解析: 指标名称 + 标签集合 = 唯一时间序列。标签用于多维数据聚合与过滤。

2.3.1 指标名称与标签

  • 指标名称:用于描述被监控的通用特征,例如 http_requests_total、node_cpu_seconds_total。命名遵循 [a-zA-Z_:][a-zA-Z0-9_:]* 正则规范。
  • 标签:键值对形式,用于对指标进行多维度的划分。例如 method="GET"、status="200"、instance="10.0.0.1:9100"。标签是 Prometheus 数据模型的核心,使得查询可以灵活地按任意维度进行聚合。

2.3.2 四种核心指标类型

指标类型 描述 典型示例
Counter 只增不减的计数器,用于累计值 http_requests_total、node_cpu_seconds_total
Gauge 可增可减的仪表盘,用于瞬时值 node_memory_MemFree_bytes、go_goroutines
Histogram 直方图,对观测值进行分桶统计 http_request_duration_seconds_bucket
Summary 摘要,计算分位数(如 P99) http_request_duration_seconds_summary
数据模型实战要点:在编写采集作业模板时,务必注意标签的基数(Cardinality)。高基数标签(如 user_id)会导致时间序列数量爆炸,严重影响 Prometheus 性能。合理设计标签是模板发布前的关键检查项。