目录
一、Prometheus 的核心定位与设计目标
二、Prometheus 的核心组件与架构
1. 核心组件
2. 典型架构流程图
三、Prometheus 的核心概念
1. 时序数据(Time Series)
2. 指标类型(Metric Type)
3. 采集方式:Pull 模式为主,Push 模式为辅
4. 存储:本地时序数据库(TSDB)
四、Prometheus 的核心工作流程
五、关键工具:Exporters 与 Alertmanager
1. Exporters:指标采集的 “桥梁”
2. Alertmanager:告警的 “管家”
六、PromQL:Prometheus 的查询语言
1. 基础语法
2. 常见查询示例
七、Prometheus 的优缺点与适用场景
1. 优点
2. 缺点
3. 适用场景
八、总结
Prometheus 是由 SoundCloud 开发并于 2015 年开源的时序数据监控告警系统,后成为 Cloud Native Computing Foundation(CNCF)的第二个毕业项目(继 Kubernetes 之后),目前已成为云原生环境下监控领域的事实标准。它专注于指标收集、存储、查询与告警,尤其擅长动态、分布式环境(如微服务、容器集群)的监控。
一、Prometheus 的核心定位与设计目标
Prometheus 的核心价值是解决传统监控(如 Zabbix、Nagios)在云原生场景下的短板,其设计目标明确:
高性能时序数据处理:支持每秒百万级指标采集与存储,适配动态扩展的业务场景;灵活的查询能力:通过自定义查询语言(PromQL)快速分析指标,满足复杂监控需求;原生支持云原生:无缝对接 Kubernetes、Docker 等容器化技术,自动发现监控目标;去中心化架构:无需依赖外部存储(默认本地 TSDB),部署简单,可水平扩展;实时告警能力:基于指标阈值或复杂规则触发告警,支持多渠道通知(邮件、Slack、钉钉等)。
二、Prometheus 的核心组件与架构
Prometheus 并非单一工具,而是由一套组件构成的生态系统,核心架构如下:
1. 核心组件
组件名称 | 功能描述 |
---|---|
Prometheus Server | 核心组件,负责指标采集、存储、查询与告警规则评估 |
Exporters | 指标暴露工具,将目标服务(如 MySQL、Nginx、Node)的指标转换为 Prometheus 格式 |
Alertmanager | 告警管理组件,接收 Prometheus Server 发送的告警,处理后通过渠道通知用户 |
Pushgateway | 接收 “短生命周期任务”(如定时脚本)的指标推送,再由 Prometheus 拉取 |
PromQL | Prometheus 专用查询语言,用于从时序数据库中筛选、聚合、分析指标 |
Grafana(生态工具) | 第三方可视化平台,与 Prometheus 无缝集成,支持绘制仪表盘(非 Prometheus 官方组件,但必备) |
2. 典型架构流程图
[监控目标] → [Exporters/Pushgateway] → [Prometheus Server 拉取/接收指标] → [本地 TSDB 存储]
↓
[PromQL 查询 → Grafana 可视化]
↓
[告警规则评估 → Alertmanager → 通知用户]
三、Prometheus 的核心概念
理解 Prometheus 的关键是掌握其核心概念,这些概念贯穿指标采集、存储与查询的全流程:
1. 时序数据(Time Series)
Prometheus 存储的核心数据形式,指带有时间戳的数值序列,每个时序由以下两部分唯一标识:
指标名称(Metric Name):描述指标的含义(如
表示 HTTP 请求总数);标签(Labels):键值对形式的元数据,用于区分不同维度的指标(如
http_requests_total
、
method="GET"
、
status="200"
)。
instance="10.0.0.1:8080"
示例时序标识:
http_requests_total{method="GET", status="200", instance="10.0.0.1:8080"}
2. 指标类型(Metric Type)
Prometheus 定义了 4 种核心指标类型,不同类型对应不同的监控场景:
指标类型 | 用途 | 示例 |
---|---|---|
Counter(计数器) | 只增不减的数值型指标,用于统计 “累计量”(如请求总数、错误总数) | (请求总数) |
Gauge(仪表盘) | 可增可减的数值型指标,用于统计 “瞬时值”(如内存使用率、CPU 负载) | (内存使用率) |
Histogram(直方图) | 对数值分布进行统计,记录 “桶(Bucket)” 内的样本数(如请求延迟分布) | (请求延迟桶统计) |
Summary(摘要) | 对数值分布进行统计,直接输出分位数(如 P95、P99 延迟),无需计算桶 | (P95 延迟) |
3. 采集方式:Pull 模式为主,Push 模式为辅
Pull 模式(默认):Prometheus Server 主动从监控目标(Exporters 暴露的
接口)拉取指标,优点是:
/metrics
简化目标配置:目标只需暴露接口,无需知道 Prometheus 地址;天然支持健康检查:拉取失败即表示目标可能异常;适配动态目标:通过服务发现(如 Kubernetes Service)自动更新拉取列表。 Push 模式(补充):适用于 “短生命周期任务”(如定时脚本、一次性任务)—— 这类任务结束后无法被 Pull,需通过 Pushgateway 将指标推送到网关,再由 Prometheus 从网关拉取。
4. 存储:本地时序数据库(TSDB)
Prometheus 默认使用内置的 TSDB(Time Series Database) 存储时序数据,特点如下:
存储结构:按 “块(Block)” 存储,每个块包含 2 小时数据,块内数据按时间戳排序并压缩(压缩率可达 10:1 以上);数据保留期:默认保留 15 天,可通过配置调整(如
);扩展性:本地 TSDB 适合单节点场景,大规模场景可通过 Thanos 或 Cortex 扩展(实现长期存储、多集群聚合)。
--storage.tsdb.retention.time=30d
四、Prometheus 的核心工作流程
以 “监控 Kubernetes 集群中的微服务” 为例,完整工作流程如下:
指标暴露:
微服务通过内置的 Prometheus Client(如 Go 的
)埋点,暴露
prometheus/client_golang
接口;集群节点、MySQL 等基础设施通过对应的 Exporters(如
/metrics
、
node_exporter
)暴露指标。
mysqld_exporter
服务发现与指标拉取:
Prometheus Server 配置 Kubernetes 服务发现(如
),自动发现所有带监控标签的 Pod/Service;按配置的拉取间隔(如 15s),从目标的
kubernetes_sd_configs
接口拉取指标。
/metrics
数据存储与规则评估:
拉取的指标存储到本地 TSDB;Prometheus Server 定期评估用户配置的 “记录规则”(将复杂查询结果预计算为新指标,提升查询性能)和 “告警规则”(判断指标是否触发阈值)。
告警与可视化:
若告警规则触发,Prometheus Server 将告警发送给 Alertmanager;Alertmanager 对告警进行分组、抑制(避免重复告警)、路由,再通过邮件、钉钉等渠道通知用户;用户通过 Grafana 连接 Prometheus,使用 PromQL 查询指标并制作仪表盘(如 “微服务请求量监控”“节点 CPU 使用率仪表盘”)。
五、关键工具:Exporters 与 Alertmanager
1. Exporters:指标采集的 “桥梁”
Exporters 是 Prometheus 与监控目标之间的 “翻译官”,将不同系统的指标转换为 Prometheus 格式。常见 Exporters 分类:
系统级:
(监控 Linux/Windows 节点的 CPU、内存、磁盘)、
node_exporter
(Windows 节点专用);中间件级:
windows_exporter
(MySQL)、
mysqld_exporter
(Redis)、
redis_exporter
(Nginx);应用级:
nginx-vts-exporter
(Java 应用,通过 JMX 采集指标)、
jmx_exporter
(各语言 SDK,用于应用埋点)。
prometheus_client
Exporters 的使用方式统一:部署后访问
即可查看暴露的指标。
http://<exporter-ip>:<port>/metrics
2. Alertmanager:告警的 “管家”
Alertmanager 负责管理 Prometheus 发送的告警,核心功能包括:
分组(Grouping):将同一类型的告警合并为一条通知(如 “10 个节点 CPU 使用率超 90%”,避免 10 条重复通知);抑制(Inhibition):当父级告警触发时,抑制子级告警(如 “节点宕机” 告警触发后,抑制该节点上所有服务的 “连接失败” 告警);路由(Routing):根据告警标签将告警路由到不同接收器(如 “生产环境告警” 发邮件给运维组,“测试环境告警” 发 Slack 群);静默(Silences):临时关闭特定告警(如计划维护时,避免不必要的告警)。
六、PromQL:Prometheus 的查询语言
PromQL 是 Prometheus 最强大的特性之一,支持对时序数据进行筛选、聚合、计算,是实现监控分析与仪表盘制作的核心。
1. 基础语法
筛选指标:通过标签匹配筛选时序,支持
(等于)、
=
(不等于)、
!=
(正则匹配)、
=~
(正则不匹配)。
!~
示例:查询 “GET 方法且状态码为 200 的 HTTP 请求总数”
http_requests_total{method="GET", status="200"}
聚合操作:对多个时序进行聚合,常用函数:
:求和(如
sum()
统计所有实例的请求总数);
sum(http_requests_total)
:求平均(如
avg()
统计所有节点的平均 CPU 使用率);
avg(node_cpu_usage_percent)
/
max()
:求最大 / 最小值;
min()
:计算 Counter 指标的每秒增长率(如
rate()
计算过去 5 分钟的每秒请求量)。
rate(http_requests_total[5m])
时间范围查询:通过
指定查询范围,如
[时间窗口]
(查询过去 5 分钟的所有数据点)。
http_requests_total[5m]
2. 常见查询示例
需求场景 | PromQL 查询语句 |
---|---|
过去 5 分钟每秒 HTTP 请求量 |
|
节点 的内存使用率 |
|
所有服务的 5xx 错误率 |
|
P95 HTTP 请求延迟 |
|
七、Prometheus 的优缺点与适用场景
1. 优点
云原生友好:无缝对接 Kubernetes、Istio 等云原生技术,支持动态服务发现;查询能力强大:PromQL 支持复杂的指标分析,可满足从基础监控到深度诊断的需求;部署简单:单节点即可运行,无需依赖外部组件(如数据库);生态丰富:Exporters 覆盖绝大多数系统 / 中间件,Grafana 提供完善的可视化支持;开源免费:无商业许可成本,社区活跃,问题解决效率高。
2. 缺点
存储扩展性有限:默认本地 TSDB 不适合 PB 级长期存储,需依赖 Thanos/Cortex 等扩展方案;不擅长日志 / 链路追踪:Prometheus 专注于指标监控,日志需搭配 ELK,链路追踪需搭配 Jaeger/Zipkin;Push 模式需额外组件:短生命周期任务需依赖 Pushgateway,增加部署复杂度。
3. 适用场景
云原生环境监控:Kubernetes 集群、容器化微服务、Serverless 应用;指标型监控需求:关注 “数值变化”(如请求量、错误率、资源使用率),而非 “文本日志”;中大规模集群:单节点支持万级监控目标,扩展方案可支持十万级以上目标。
八、总结
Prometheus 凭借其云原生适配性、灵活的查询能力、简单的部署架构,已成为现代监控体系的核心组件。它并非 “全能工具”,而是专注于指标监控,需与日志(ELK)、链路追踪(Jaeger)等工具协同,构建 “可观测性三位一体” 的系统。
对于需要监控容器化微服务、动态扩展集群的团队,Prometheus 是首选方案;而对于需长期存储 PB 级数据或专注于日志分析的场景,则需搭配其他工具补充。