1. Prometheus 基础入门

1.1 Prometheus 发展史

Prometheus 起源于 2012 年,由前 Google 工程师在 SoundCloud 内部孵化,旨在解决传统监控系统在微服务与容器化场景下的局限性。2015 年项目正式开源,2016 年加入 CNCF(Cloud Native Computing Foundation),成为继 Kubernetes 之后的第二个毕业项目。其设计哲学继承自 Google 内部监控系统 Borgmon,强调“拉取(Pull)”模型、多维数据模型与强大的 PromQL 查询语言。

关键里程碑: 2012 年内部诞生 → 2015 年开源 → 2016 年加入 CNCF → 2018 年毕业 → 2020 年成为 CNCF 生态中部署最广泛的监控项目之一。

1.2 核心特性

Prometheus 的核心特性围绕“时间序列数据库 + 主动拉取 + 多维标签”展开,使其在云原生环境中具备天然优势:

  • 多维数据模型: 每个时间序列由指标名称和一组键值对标签唯一标识,支持灵活的聚合与过滤。
  • PromQL 查询语言: 提供丰富的函数、操作符与聚合能力,支持实时计算与历史回溯。
  • 主动拉取(Pull)模式: Server 定期从目标端点抓取指标,降低被监控系统的耦合度。
  • 服务发现: 原生支持 Kubernetes、Consul、DNS 等动态发现机制,适应弹性伸缩环境。
  • 告警与通知: 通过 Alertmanager 实现告警分组、抑制、静默与多渠道推送。
  • 高效存储: 本地存储采用自定义时间序列格式,支持压缩与数据保留策略。
运维提示: Prometheus 的 Pull 模式要求 Server 能够直接访问目标端点,在跨网络隔离或防火墙场景下,可借助 Pushgateway 作为中间代理。

1.3 架构组件

Prometheus 生态由多个独立组件构成,各组件职责清晰,协同完成数据采集、存储、查询与告警。下图展示了核心架构与数据流:

Prometheus 核心架构组件与数据流 被监控目标 Exporter / 应用 / 服务端点 服务发现 K8s / Consul / DNS Prometheus Server 数据采集引擎 时间序列数据库 PromQL 查询引擎 Alertmanager 告警分组 / 抑制 / 静默 可视化 Grafana / 内置 UI Pushgateway 短任务指标推送 数据流方向 实线:主动拉取(Pull) 虚线:被动推送(Push)

1.4 与 Zabbix / Graphite 对比

传统监控系统(Zabbix)与早期时间序列方案(Graphite)在架构设计、数据模型与扩展性上与 Prometheus 存在显著差异。下表从多个维度进行对比:

对比维度 Prometheus Zabbix Graphite
数据模型 多维标签 + 指标名称 扁平键值对 层级路径(点分隔)
采集模式 主动拉取(Pull) 主动推送(Push) 被动接收(Push)
查询语言 PromQL(强大灵活) 内置表达式(有限) 简单函数(有限)
服务发现 原生支持(K8s/Consul) 需手动配置或脚本 不支持
告警能力 Alertmanager(分组/抑制) 内置告警(触发器) 需第三方集成
存储扩展 本地 + 远程读写(Thanos/Cortex) 数据库后端(MySQL/Elasticsearch) Whisper 文件(单机)
适用场景 云原生、微服务、容器 传统 IT 基础设施、网络设备 时间序列可视化、轻量场景
选型建议: 若监控环境以 Kubernetes 和微服务为主,Prometheus 是首选;若以传统物理机、网络设备或 SNMP 为主,Zabbix 生态更成熟;Graphite 适合作为时间序列存储后端,但缺乏告警与服务发现能力。

1.5 核心组件交互流程

下图进一步细化 Prometheus Server 内部组件之间的交互关系,帮助理解数据从采集到存储再到查询的完整链路:

Prometheus Server 内部组件交互 采集模块 Scrape Manager 存储模块 TSDB 查询模块 PromQL Engine 告警模块 Alerting Rules 数据流向 采集 → 存储 → 查询 告警规则从存储读取数据

1.6 本章小结