4. Prometheus入门:架构设计、数据模型、安装与基础配置

Prometheus 在可观测性领域的地位,差不多相当于 Linux 在服务器世界的地位——不是唯一的选择,但是最常用、最被广泛认可的那个。我个人最早接触它是在 2017 年,当时还在用 Zabbix 做传统监控,每次扩缩容都要手动改配置,烦得不行。后来换成 Prometheus,就一个感觉:解放了。

这一章我们来拆解 Prometheus 的核心。我不会事无巨细地念文档,而是把真正关键的东西挑出来,配合我踩过的坑,帮你快速建立起正确的认知。

Prometheus 架构概览 Service Discovery Targets (jobs/instances) Exporters Pushgateway Prometheus Server Retrieval (拉取) TSDB (时序数据库) HTTP API / 查询 Alertmanager Data Sources (应用程序、 批处理任务等) 关键特性:基于拉取、多维数据模型、内置告警规则、强大的PromQL 我从项目经验中总结的核心原则: ① 合理设计Metric + Label组合,避免基数爆炸; ② 用Service Discovery替代静态配置;③ 做好告警收敛

4.1 为什么是Prometheus?

市面上监控系统不少:Zabbix、Nagios、Graphite、InfluxDB……但Prometheus有一招杀手锏:拉取 (Pull) 模型 + 多维数据模型。你想想看,传统监控系统大多是往中心推数据,一旦中心挂了,数据就丢了。Prometheus反过来,由Server主动去拉,天然就能做高可用和联邦集群。

另外它的数据模型不是简单的“指标名+时间戳+值”,而是支持任意维度的标签。比如我要看北京机房所有Java应用的CPU使用率,只要写一个PromQL:cpu_usage{region="bj", app="java"}。这在传统监控里得建无数个指标,在Prometheus里一行配置就搞定。

4.2 架构设计:核心组件与数据流

别被架构图吓到,核心就几块:

组件职责
Prometheus Server拉取数据、存储时序、执行PromQL查询
Exporters将应用或系统的指标暴露成HTTP端点(如node_exporter)
Pushgateway临时接收短任务推送的指标(批处理、CronJob等)
Alertmanager处理告警规则产生的告警(去重、分组、静默、通知渠道)
Service Discovery自动发现抓取目标(如Kubernetes、Consul、Eureka)

数据流很简单:Prometheus Server通过配置的scrape_configs定期去拉取Exporters或Pushgateway的数据,存入本地的TSDB。然后根据alerting rules计算告警,符合条件就发送给Alertmanager。用户也可以通过PromQL直接查询。

我个人的一个小建议:刚开始学的时候,直接上node_exporter + Prometheus Server就够用了。先把拉取链路跑通,再慢慢加其他组件。别一上来就搞Pushgateway和Alertmanager,容易乱。

4.3 数据模型:指标、标签、样本

Prometheus里每个时序由三要素组成:指标名 (Metric Name)、标签集合 (Labels)、样本 (Sample)。样本又是一个(time, value)对。

举个例子:

http_requests_total{method="POST", handler="/api/users", status="200"} 1024 @ 1700000000

这里的http_requests_total是指标名,后面大括号里的method, handler, status是标签。数值1024是值,@后面的时间戳是样本时间。

为什么标签这么重要? 因为你可以任意组合标签来做聚合。比如我要统计所有接口的总请求量:sum(http_requests_total);我也可以只看某个handler的失败数:http_requests_total{handler="/api/users", status=~"5.."}。

我曾经踩过一个大坑:标签值如果包含太多唯一值(比如用户ID、请求ID),会导致时序基数爆炸,直接拖垮TSDB。我之前有项目把user_id作为标签,结果才10万用户,内存就爆了。后来不得不改成以用户组或城市级别来打标。记住:标签必须是可枚举的、有限集的。

Prometheus官方定义的指标类型有四种:Counter(只增不减,如请求总数)、Gauge(可增可减,如CPU温度)、Histogram(直方图,统计分布)、Summary(摘要,计算分位数)。不过底层存储都是统一的时序,只是PromQL对不同类型的处理有差异。

4.4 安装:开箱即用,但别踩坑

安装方式我推荐两种:二进制下载 和 Docker运行。

二进制下载(适合学习+生产,性能最好)

# 下载最新稳定版(以Linux amd64为例)
wget https://github.com/prometheus/prometheus/releases/download/v2.45.0/prometheus-2.45.0.linux-amd64.tar.gz
tar xvf prometheus-2.45.0.linux-amd64.tar.gz
cd prometheus-2.45.0.linux-amd64

# 创建配置文件(最简版)
cat > prometheus.yml <<EOF
global:
  scrape_interval: 15s
  evaluation_interval: 15s

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']
EOF

# 启动
./prometheus --config.file=prometheus.yml

这时候访问 http://your-ip:9090 就能看到Prometheus自带的Web UI了。

Docker运行(适合快速实验)

docker run -d --name prometheus \
  -p 9090:9090 \
  -v $(pwd)/prometheus.yml:/etc/prometheus/prometheus.yml \
  prom/prometheus
嗯,这里要注意:Docker版本默认时区是UTC,如果你在中国,记得挂载/etc/localtime或者设置环境变量TZ=Asia/Shanghai,否则图表时间对不上。我刚开始用Docker部署时看过一段时间的UTC时间,后来才发现API返回的时间戳也全是UTC,排查问题差点把自己绕进去。

4.5 基础配置:你能看懂的最小配置集

Prometheus的配置核心就三个块:global、scrape_configs、rule_files。

配置项说明
global.scrape_interval拉取间隔(默认1分钟,我通常设为15-30秒)
global.evaluation_interval告警规则计算间隔
scrape_configs定义抓取目标和端口的列表,支持静态或动态发现
rule_files指定告警规则和记录规则的文件路径
alerting配置Alertmanager的连接地址(可选)

我再给一个带node_exporter的配置实例:

global:
  scrape_interval: 15s
  evaluation_interval: 15s

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']

  - job_name: 'node_exporter'
    static_configs:
      - targets: ['192.168.1.100:9100']

把node_exporter部署在目标机器上后,Prometheus就会每15秒去拉取系统指标。是不是很简单?

避坑指南:我曾经在线上因为忘记配置 metrics_path 而导致拉取失败。默认路径是 /metrics,但有些Exporter会暴露在 /actuator/prometheus 或其他路径,一定要根据Exporter的文档写对 metrics_path。

4.6 快速验证:看看数据长啥样

启动Prometheus后,打开 /targets 页面(左侧菜单),能看到所有配置的抓取目标状态。绿色UP代表正常,红色DOWN说明连接不上。

然后去 /graph 页面,输入 up 点执行,会看到1或0的结果。数值1表示该目标可用。这就是你第一个PromQL查询。

# 查当前所有目标状态
up{job="prometheus"}

你会发现数据以表格和图表两种方式展示。我个人喜欢先用表格确认值,再用图表看趋势,双管齐下。

好了,Prometheus 入门的核心骨架就是这些:架构清晰、数据模型灵活、安装配置简单。接下来如果你需要,可以自己加一个 node_exporter 或者 cadvisor 试试收集容器指标。记住我强调的几点:标签不要滥用、静态配置先跑通再上动态发现、告警先别贪多。基础打牢,后面学PromQL和告警规则就顺了。