Prometheus 是一款开源的时序数据监控与告警系统 ,由 SoundCloud 开发并捐赠给 CNCF(云原生计算基金会),现已成为云原生场景下监控的事实标准,广泛用于 Kubernetes、微服务、虚拟机等环境的指标监控。它的核心特点是 Pull 模式采集指标 、内置时序数据库 、强大的 PromQL 查询语言 和 灵活的告警机制。
一、核心架构与组件
┌─────────────────────────────────────────────────────────────────────┐
│ Prometheus Server │
│ ┌─────────────┐ ┌──────────────┐ ┌──────────────────────────┐ │
│ │ Retrieval │ │ TSDB │ │ HTTP Server │ │
│ │ (拉取数据) │◀-▶│ (时序数据库) │◀-▶│ (提供PromQL查询/管理API) │ │
│ └─────────────┘ └──────────────┘ └──────────────────────────┘ │
└───────────────────┬───────────────────────────────────────────────┘
│ HTTP Pull /metrics
┌───────────────┼─────────────────────────────────────┐
│ ▼ │
│ ┌─────────────────────┐ ┌─────────────────────┐ │
│ │ 被监控目标 │ │ Pushgateway │ │
│ │ - 应用/服务 │ │ (推送网关) │ │
│ │ (内置/client库) │ │ │ │
│ │ - Exporters │ └─────────────────────┘ │
│ │ (Node Exporter, │ ▲ │
│ │ MySQL Exporter) │ │ Push │
│ └─────────────────────┘ ┌──────┴──────┐ │
│ │ 批处理/定时 │ │
│ │ 作业任务 │ │
│ └─────────────┘ │
│ │
│ ┌─────────────────────┐ ┌─────────────────────┐ │
│ │ Service Discovery │ │ Alertmanager │ │
│ │ (服务发现) │ │ (告警管理器) │ │
│ │ - K8s, Consul, etc │ │ │ │
│ └─────────────────────┘ └─────────────────────┘ │
│ │提供目标列表 ▲ │
└─────────────┼─────────────────────────┼──────────────┘
▼ │
┌─────────────────┐ ┌───────┴───────┐
│ Grafana │ │ 告警接收端 │
│ (可视化) │ │ (Email, Slack,│
│ │ │ Webhook等) │
└─────────────────┘ └───────────────┘
Prometheus 的架构采用模块化设计,核心组件及作用如下:
-
Prometheus Server系统的核心组件,负责三个核心功能:
- 指标采集:通过 HTTP Pull 模式主动拉取 Exporters 或目标服务的指标数据。
- 指标存储:将采集的时序数据存储在本地磁盘(支持持久化配置),也可对接远程存储(如 S3、Thanos)。
- 查询与聚合:提供 PromQL 查询接口,支持实时指标分析和聚合计算。
-
Exporters 指标采集的 "桥梁",用于将非 Prometheus 原生支持的系统 / 服务(如主机、MySQL、Redis)的指标转换为 Prometheus 可识别的格式。常见 Exporters 包括:
Node Exporter:采集主机(CPU、内存、磁盘、网络)指标。MySQL Exporter:采集 MySQL 数据库(连接数、QPS、慢查询)指标。Blackbox Exporter:主动探测 HTTP、TCP、ICMP 等服务的可用性(如接口响应时间、是否可达)。- 自定义 Exporter:通过 Prometheus 客户端库(Go、Java、Python 等)开发,采集业务系统自定义指标(如订单量、接口成功率)。
-
Alertmanager专门处理告警的组件,与 Prometheus Server 配合使用:
- 接收 Prometheus Server 发送的告警信息。
- 提供告警分组 (按服务 / 集群分组)、抑制 (避免级联告警)、静默(临时关闭特定告警)功能。
- 支持多种告警通知渠道:Email、Slack、钉钉 / 企业微信(通过 Webhook)、PagerDuty 等。
-
Pushgateway 用于解决 Push 模式采集的场景(如短生命周期的任务、批处理任务)。这类任务存活时间短,Prometheus Server 无法主动拉取,可由任务将指标推送到 Pushgateway,再由 Prometheus Server 拉取。
注意:Pushgateway 是指标缓存层,重启后数据会丢失,需合理规划使用场景。
-
Prometheus 客户端库 用于在业务代码中埋点自定义指标 ,支持主流开发语言(Go、Java、Python、Node.js 等)。例如,在 Java 项目中使用
simpleclient库,埋点接口响应时间、请求量等指标。
二、核心概念
-
时序数据(Time Series) Prometheus 存储的核心数据类型,由 指标名 + 标签集 + 时间戳 + 数值 组成。示例:
http_requests_total{method="GET", path="/api/user"} 1200 1718000000- 指标名:
http_requests_total(表示 HTTP 请求总数)。 - 标签集:
{method="GET", path="/api/user"}(用于区分不同维度的指标,支持多维度过滤)。 - 数值:
1200(指标值)。 - 时间戳:
1718000000(Unix 时间戳)。
- 指标名:
-
指标类型Prometheus 定义了 4 种核心指标类型,需根据业务场景选择:
指标类型 特点 适用场景 Counter(计数器) 单调递增的数值,只能加不能减 请求数、错误数、任务完成数 Gauge(仪表盘) 可增可减的数值,支持任意变化 内存使用率、CPU 负载、队列长度 Histogram(直方图) 统计指标的分布情况(如分位数、总和、计数) 接口响应时间分布、请求大小分布 Summary(摘要) 与 Histogram 类似,直接计算分位数(客户端计算) 小样本量的指标分布统计 -
PromQL(Prometheus 查询语言) Prometheus 的核心查询语言,支持对时序数据进行过滤、聚合、计算,是监控分析和告警规则的基础。
- 基础过滤:
node_cpu_seconds_total{mode="idle"}(查询主机空闲 CPU 时间)。 - 聚合计算:
sum(rate(node_cpu_seconds_total{mode!="idle"}[5m])) by (instance)(计算 5 分钟内各主机的 CPU 使用率)。 - 趋势分析:
predict_linear(node_memory_available_bytes[1h], 3600)(基于 1 小时数据预测 1 小时后可用内存)。
- 基础过滤:
三、工作流程
-
配置采集目标 :在 Prometheus Server 的配置文件(
prometheus.yml)中,定义需要采集的目标(如 Exporters 地址、Kubernetes 服务发现配置)。yaml
scrape_configs: - job_name: 'node_exporter' static_configs: - targets: ['192.168.1.100:9100', '192.168.1.101:9100'] # Node Exporter 地址 scrape_interval: 15s # 采集间隔 -
指标采集 :Prometheus Server 按配置的间隔,主动向目标发送 HTTP 请求(
/metrics接口),拉取指标数据。 -
数据存储:将拉取的指标数据存储为时序数据,支持按时间范围查询。
-
查询与可视化:通过 Prometheus Web UI 或 Grafana 调用 PromQL 查询指标,生成可视化图表。
-
告警触发:Prometheus Server 根据预设的告警规则,判断指标是否触发阈值,若触发则发送告警到 Alertmanager。
-
告警通知:Alertmanager 对告警进行分组、去重后,通过配置的渠道发送通知给相关人员。
四、典型部署方案
1. 单机部署(测试 / 小型环境)
- 直接部署 Prometheus Server + Node Exporter + Grafana,适用于小规模集群或测试环境。
- 优点:部署简单、运维成本低;缺点:存在单点故障,存储容量受限。
2. 联邦集群部署(中大型环境)
- 采用 Prometheus Federation 架构,分为
Leaf节点和Global节点:Leaf节点:负责采集单个集群 / 区域的指标,存储本地数据。Global节点:通过 Pull 模式拉取所有Leaf节点的聚合指标,实现全局监控。
- 优点:分担采集压力,支持水平扩展;缺点:架构复杂,需配置联邦规则。
3. 云原生部署(Kubernetes 环境)
- 在 Kubernetes 中通过
StatefulSet部署 Prometheus Server,结合 Kubernetes Service Discovery 自动发现 Pod/Service 指标。 - 搭配 Thanos 实现指标的长期存储和跨集群查询,解决 Prometheus 本地存储的局限性。
五、与 Grafana 集成(可视化最佳实践)
Prometheus 内置的 Web UI 仅支持简单查询,Grafana 是 Prometheus 可视化的最佳搭档,步骤如下:
- 部署 Grafana 并启动,访问 Grafana Web 界面(默认端口 3000)。
- 添加数据源:选择
Prometheus,填写 Prometheus Server 的地址(如http://prometheus:9090)。 - 导入仪表盘模板:在 Grafana 官网(Dashboards)搜索 Exporter 对应的模板(如 Node Exporter 的模板 ID:
1860),导入后即可生成主机监控仪表盘。 - 自定义仪表盘:根据业务需求,添加 PromQL 查询,配置图表样式(如折线图、柱状图、仪表盘)。
六、最佳实践
- 合理设置采集间隔 :根据指标变化频率调整
scrape_interval(如主机指标 15s,业务指标 30s),避免过短的间隔导致 Prometheus Server 压力过大。 - 规范标签设计 :统一标签命名(如
instance表示主机 IP、service表示服务名),便于多维度过滤和聚合。 - 告警规则优化:设置合理的告警阈值和持续时间(如 CPU 使用率 > 80% 持续 5 分钟告警),避免抖动导致的误告警。
- 指标持久化与备份:对接远程存储(如 Thanos、S3),实现指标长期存储;定期备份 Prometheus 数据目录,防止数据丢失。
- 监控自身健康状态 :通过
prometheus_self_metrics指标监控 Prometheus Server 的采集成功率、内存使用率等,确保监控系统自身稳定。
七、常见问题与解决方案
| 问题 | 解决方案 |
|---|---|
| 指标采集失败 | 检查目标 /metrics 接口是否可达;核对 Prometheus 配置文件的 targets 地址;检查防火墙规则 |
| 数据查询缓慢 | 减少 PromQL 查询的时间范围;避免使用 * 匹配所有指标;对高频查询的指标进行预聚合 |
| 磁盘空间不足 | 配置 retention.time 清理过期数据;对接远程存储;使用 Thanos 实现分层存储 |
| 告警风暴 | 在 Alertmanager 中配置告警分组和抑制规则;调整告警阈值的持续时间 |