Prometheus基础概念 #

一、架构设计 #

1.1 整体架构 #

text
Prometheus架构图:

┌─────────────────────────────────────────────────────────────────────┐
│                         Prometheus Server                            │
│  ┌─────────────────────────────────────────────────────────────┐   │
│  │                    Retrieval(检索模块)                      │   │
│  │  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐         │   │
│  │  │ 服务发现    │  │ HTTP拉取    │  │ 数据解析    │         │   │
│  │  │ Discovery   │  │ Scraper     │  │ Parser      │         │   │
│  │  └─────────────┘  └─────────────┘  └─────────────┘         │   │
│  └─────────────────────────────────────────────────────────────┘   │
│                              │                                      │
│                              ▼                                      │
│  ┌─────────────────────────────────────────────────────────────┐   │
│  │                    TSDB(时序数据库)                         │   │
│  │  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐         │   │
│  │  │ 写入        │  │ 压缩        │  │ 查询        │         │   │
│  │  │ Write       │  │ Compaction  │  │ Query       │         │   │
│  │  └─────────────┘  └─────────────┘  └─────────────┘         │   │
│  └─────────────────────────────────────────────────────────────┘   │
│                              │                                      │
│                              ▼                                      │
│  ┌─────────────────────────────────────────────────────────────┐   │
│  │                    HTTP Server                                │   │
│  │  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐         │   │
│  │  │ Web UI      │  │ REST API    │  │ PromQL      │         │   │
│  │  │             │  │             │  │ Engine      │         │   │
│  │  └─────────────┘  └─────────────┘  └─────────────┘         │   │
│  └─────────────────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────────────────┘
        │                                        │
        │ Pull                                   │ Alert
        ▼                                        ▼
┌───────────────┐                      ┌─────────────────┐
│   Exporters   │                      │ Alertmanager    │
│               │                      │                 │
│ /metrics      │                      │ • 去重          │
│ endpoint      │                      │ • 分组          │
│               │                      │ • 路由          │
└───────────────┘                      └─────────────────┘

1.2 数据流 #

text
Prometheus数据流:

┌─────────────────────────────────────────────────────────────────────┐
│ 1. 服务发现                                                         │
│    ┌─────────────┐                                                  │
│    │ 静态配置    │ ──┐                                              │
│    ├─────────────┤   │                                              │
│    │ 文件发现    │ ──┼──> 目标列表                                  │
│    ├─────────────┤   │                                              │
│    │ K8s发现     │ ──┘                                              │
│    └─────────────┘                                                  │
└─────────────────────────────────────────────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────────────┐
│ 2. 数据采集                                                         │
│    ┌─────────────┐                                                  │
│    │ HTTP GET    │ ──> /metrics endpoint                            │
│    │ /metrics    │                                                  │
│    └─────────────┘                                                  │
│    ┌─────────────┐                                                  │
│    │ 解析响应    │ ──> 指标数据                                     │
│    └─────────────┘                                                  │
└─────────────────────────────────────────────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────────────┐
│ 3. 数据存储                                                         │
│    ┌─────────────┐                                                  │
│    │ 写入内存    │ ──> Head Block                                   │
│    └─────────────┘                                                  │
│    ┌─────────────┐                                                  │
│    │ 持久化      │ ──> 磁盘块                                       │
│    └─────────────┘                                                  │
└─────────────────────────────────────────────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────────────┐
│ 4. 数据查询                                                         │
│    ┌─────────────┐                                                  │
│    │ PromQL      │ ──> 查询引擎                                     │
│    └─────────────┘                                                  │
│    ┌─────────────┐                                                  │
│    │ 结果返回    │ ──> Web UI / API                                 │
│    └─────────────┘                                                  │
└─────────────────────────────────────────────────────────────────────┘

二、核心组件 #

2.1 Prometheus Server #

text
Prometheus Server组成:

┌─────────────────────────────────────────────┐
│ Retrieval(检索模块)                        │
├─────────────────────────────────────────────┤
│ • 服务发现:发现监控目标                    │
│ • 数据拉取:HTTP拉取指标数据                │
│ • 数据解析:解析文本格式指标                │
│ • 标签处理:添加和修改标签                  │
└─────────────────────────────────────────────┘

┌─────────────────────────────────────────────┐
│ TSDB(时序数据库)                          │
├─────────────────────────────────────────────┤
│ • 数据存储:高效存储时序数据                │
│ • 数据压缩:自动压缩历史数据                │
│ • 数据保留:按时间保留数据                  │
│ • 索引管理:快速查询索引                    │
└─────────────────────────────────────────────┘

┌─────────────────────────────────────────────┐
│ HTTP Server                                 │
├─────────────────────────────────────────────┤
│ • Web UI:内置Web界面                       │
│ • REST API:提供查询API                     │
│ • PromQL引擎:执行查询语言                  │
│ • 健康检查:服务状态检查                    │
└─────────────────────────────────────────────┘

2.2 Exporter #

text
Exporter类型:

┌─────────────────────────────────────────────┐
│ 直接暴露指标                                │
├─────────────────────────────────────────────┤
│ 应用内置/metrics端点                        │
│ 示例:                                      │
│ • Prometheus自身                            │
│ • Grafana                                   │
│ • Etcd                                      │
│ • Kubernetes组件                            │
└─────────────────────────────────────────────┘

┌─────────────────────────────────────────────┐
│ 独立Exporter                                │
├─────────────────────────────────────────────┤
│ 独立进程,暴露/metrics端点                  │
│ 示例:                                      │
│ • Node Exporter:主机监控                   │
│ • MySQL Exporter:MySQL监控                 │
│ • Redis Exporter:Redis监控                 │
│ • JMX Exporter:Java应用监控                │
└─────────────────────────────────────────────┘

┌─────────────────────────────────────────────┐
│ Pushgateway                                 │
├─────────────────────────────────────────────┤
│ 接收Push的指标数据                          │
│ 适用场景:                                  │
│ • 短期任务                                  │
│ • 批处理任务                                │
│ • 防火墙内服务                              │
└─────────────────────────────────────────────┘

2.3 Alertmanager #

text
Alertmanager功能:

┌─────────────────────────────────────────────┐
│ 告警处理                                    │
├─────────────────────────────────────────────┤
│ 1. 去重(Deduplication)                    │
│    • 相同告警只发送一次                     │
│    • 避免告警风暴                           │
│                                             │
│ 2. 分组(Grouping)                         │
│    • 相似告警合并                           │
│    • 减少通知数量                           │
│                                             │
│ 3. 路由(Routing)                          │
│    • 根据标签分发                           │
│    • 发送到不同接收者                       │
│                                             │
│ 4. 静默(Silencing)                        │
│    • 临时屏蔽告警                           │
│    • 维护期间使用                           │
│                                             │
│ 5. 抑制(Inhibition)                       │
│    • 高优先级抑制低优先级                   │
│    • 避免重复告警                           │
└─────────────────────────────────────────────┘

三、数据模型 #

3.1 时序数据 #

text
时序数据结构:

┌─────────────────────────────────────────────┐
│ 时间序列 = 指标名称 + 标签集合 + 数据点    │
└─────────────────────────────────────────────┘

示例:
指标名称:http_requests_total
标签集合:{method="GET", status="200", instance="localhost:8080"}
数据点:(timestamp, value)

完整表示:
http_requests_total{method="GET", status="200", instance="localhost:8080"} 1000 1700000000000

┌─────────────────────────────────────────────┐
│ 时间序列标识符                              │
├─────────────────────────────────────────────┤
│ __name__="http_requests_total"              │
│ method="GET"                                │
│ status="200"                                │
│ instance="localhost:8080"                   │
│ job="api-server"                            │
└─────────────────────────────────────────────┘

3.2 指标名称 #

text
指标名称规范:

┌─────────────────────────────────────────────┐
│ 命名规则                                    │
├─────────────────────────────────────────────┤
│ • 必须匹配正则:[a-zA-Z_:][a-zA-Z0-9_:]*   │
│ • 冒号保留给规则名称                        │
│ • 应该有单位后缀                            │
│ • 应该有类型后缀                            │
└─────────────────────────────────────────────┘

命名示例:

# 好的命名
http_requests_total          # Counter类型,total后缀
node_memory_bytes_total      # 带单位bytes
process_cpu_seconds_total    # 带单位seconds
http_request_duration_seconds  # Histogram/Summary

# 不好的命名
httpRequests                 # 不推荐驼峰
http_requests                # 缺少类型后缀
http_requests_count          # Counter应该用total

3.3 标签 #

text
标签特性:

┌─────────────────────────────────────────────┐
│ 标签规则                                    │
├─────────────────────────────────────────────┤
│ • 键名匹配正则:[a-zA-Z_][a-zA-Z0-9_]*     │
│ • 以__开头的是内部标签                      │
│ • 标签值可以是任意UTF-8字符                 │
│ • 不同标签值 = 不同时间序列                 │
└─────────────────────────────────────────────┘

常用标签:

job          # 采集任务名称
instance     # 目标实例地址
__address__  # 目标地址(内部标签)
__scheme__   # 协议方案(内部标签)
__metrics_path__  # 指标路径(内部标签)

标签示例:

http_requests_total{job="api-server", instance="localhost:8080", method="GET", status="200"}

3.4 样本 #

text
样本结构:

┌─────────────────────────────────────────────┐
│ 样本 = (时间戳, 值)                         │
└─────────────────────────────────────────────┘

示例:
时间戳:1700000000000(毫秒级Unix时间戳)
值:1000(64位浮点数)

存储格式:
┌─────────────────────────────────────────────┐
│ 时间戳(8字节)│ 值(8字节)                │
├─────────────────────────────────────────────┤
│ 1700000000000 │ 1000                        │
│ 1700000015000 │ 1050                        │
│ 1700000030000 │ 1100                        │
└─────────────────────────────────────────────┘

压缩后:
每个样本约 1-2 字节

四、数据采集 #

4.1 Pull模式 #

text
Pull模式工作流程:

┌─────────────────────────────────────────────┐
│ Prometheus Server                           │
│                                             │
│  1. 定时触发采集                             │
│     │                                       │
│     ▼                                       │
│  2. HTTP GET请求                             │
│     GET http://target:port/metrics          │
│     │                                       │
│     ▼                                       │
│  3. 接收响应                                 │
│     文本格式的指标数据                       │
│     │                                       │
│     ▼                                       │
│  4. 解析数据                                 │
│     解析为时间序列                           │
│     │                                       │
│     ▼                                       │
│  5. 存储数据                                 │
│     写入TSDB                                 │
└─────────────────────────────────────────────┘

Pull模式优势:
• 服务端控制采集频率
• 易于发现目标状态
• 目标集中管理
• 无需客户端配置推送地址

4.2 采集过程 #

text
采集过程详解:

┌─────────────────────────────────────────────┐
│ 1. 服务发现                                 │
├─────────────────────────────────────────────┤
│ 发现目标:                                   │
│ • 静态配置                                   │
│ • 文件服务发现                               │
│ • Kubernetes服务发现                         │
│ • Consul服务发现                             │
│ • DNS服务发现                                │
│                                             │
│ 结果:目标列表                               │
│ [                                            │
│   {address: "node1:9100", labels: {...}},   │
│   {address: "node2:9100", labels: {...}}    │
│ ]                                            │
└─────────────────────────────────────────────┘
                    │
                    ▼
┌─────────────────────────────────────────────┐
│ 2. 标签处理                                 │
├─────────────────────────────────────────────┤
│ relabel_configs(采集前):                  │
│ • 过滤目标                                   │
│ • 添加/修改标签                              │
│ • 设置地址和路径                             │
│                                             │
│ 示例:                                       │
│ relabel_configs:                             │
│   - source_labels: [__address__]            │
│     target_label: instance                   │
└─────────────────────────────────────────────┘
                    │
                    ▼
┌─────────────────────────────────────────────┐
│ 3. HTTP请求                                 │
├─────────────────────────────────────────────┤
│ 请求:                                       │
│ GET http://node1:9100/metrics                │
│                                             │
│ 响应:                                       │
│ # HELP node_cpu_seconds_total ...           │
│ # TYPE node_cpu_seconds_total counter       │
│ node_cpu_seconds_total{cpu="0",mode="idle"} │
│   12345.67                                   │
└─────────────────────────────────────────────┘
                    │
                    ▼
┌─────────────────────────────────────────────┐
│ 4. 指标处理                                 │
├─────────────────────────────────────────────┤
│ metric_relabel_configs(采集后):           │
│ • 过滤指标                                   │
│ • 修改标签                                   │
│ • 删除不需要的指标                           │
│                                             │
│ 示例:                                       │
│ metric_relabel_configs:                      │
│   - source_labels: [__name__]               │
│     regex: 'go_.*'                           │
│     action: drop                             │
└─────────────────────────────────────────────┘
                    │
                    ▼
┌─────────────────────────────────────────────┐
│ 5. 数据存储                                 │
├─────────────────────────────────────────────┤
│ 写入TSDB:                                   │
│ • 写入内存Head Block                         │
│ • 定期刷入磁盘                               │
│ • 后台压缩合并                               │
└─────────────────────────────────────────────┘

五、数据存储 #

5.1 TSDB架构 #

text
Prometheus TSDB架构:

┌─────────────────────────────────────────────┐
│ 内存区域(Head Block)                      │
├─────────────────────────────────────────────┤
│ • 最新数据存储在内存                        │
│ • 写入速度快                                │
│ • 定期刷入磁盘                              │
│ • 保留约2小时数据                           │
└─────────────────────────────────────────────┘
                    │
                    ▼
┌─────────────────────────────────────────────┐
│ 磁盘存储                                    │
├─────────────────────────────────────────────┤
│ data/                                       │
│ ├── 01HXXXXX/        # Block 1              │
│ │   ├── chunks/      # 数据块               │
│ │   ├── index/       # 索引文件             │
│ │   └── meta.json    # 元数据               │
│ ├── 01HYYYYY/        # Block 2              │
│ │   ├── chunks/                             │
│ │   ├── index/                              │
│ │   └── meta.json                           │
│ ├── wal/             # 预写日志             │
│ └── tombstones/      # 删除标记             │
└─────────────────────────────────────────────┘

5.2 数据压缩 #

text
数据压缩过程:

┌─────────────────────────────────────────────┐
│ 压缩流程                                    │
├─────────────────────────────────────────────┤
│                                             │
│  小块(2小时)                              │
│  ┌─────┐ ┌─────┐ ┌─────┐                   │
│  │ 2h  │ │ 2h  │ │ 2h  │                   │
│  └──┬──┘ └──┬──┘ └──┬──┘                   │
│     │       │       │                       │
│     └───────┼───────┘                       │
│             ▼                               │
│  中块(6小时)                              │
│        ┌──────────┐                         │
│        │    6h    │                         │
│        └────┬─────┘                         │
│             │                               │
│             ▼                               │
│  大块(更长时间)                           │
│        ┌─────────────────┐                  │
│        │      更长        │                 │
│        └─────────────────┘                  │
│                                             │
└─────────────────────────────────────────────┘

压缩优势:
• 减少磁盘占用
• 提高查询效率
• 自动后台运行

5.3 数据保留 #

text
数据保留策略:

┌─────────────────────────────────────────────┐
│ 配置参数                                    │
├─────────────────────────────────────────────┤
│ --storage.tsdb.retention.time=30d           │
│ 按时间保留,默认15天                        │
│                                             │
│ --storage.tsdb.retention.size=10GB          │
│ 按大小保留                                  │
│                                             │
│ 同时配置时,任一条件满足即删除              │
└─────────────────────────────────────────────┘

删除机制:
• 压缩时删除过期数据
• 不影响正在写入的数据
• 可手动删除时间序列

六、查询处理 #

6.1 PromQL执行 #

text
PromQL执行流程:

┌─────────────────────────────────────────────┐
│ 1. 解析查询                                 │
├─────────────────────────────────────────────┤
│ 输入:rate(http_requests_total[5m])        │
│                                             │
│ 解析为AST:                                 │
│     rate                                    │
│       │                                     │
│       └── VectorSelector                    │
│            └── http_requests_total          │
│                 └── [5m]                    │
└─────────────────────────────────────────────┘
                    │
                    ▼
┌─────────────────────────────────────────────┐
│ 2. 数据检索                                 │
├─────────────────────────────────────────────┤
│ • 从索引中查找匹配的时间序列                │
│ • 从块中读取数据点                          │
│ • 合并来自不同块的数据                      │
└─────────────────────────────────────────────┘
                    │
                    ▼
┌─────────────────────────────────────────────┐
│ 3. 表达式计算                               │
├─────────────────────────────────────────────┤
│ • 执行函数计算                              │
│ • 执行操作符运算                            │
│ • 执行聚合操作                              │
└─────────────────────────────────────────────┘
                    │
                    ▼
┌─────────────────────────────────────────────┐
│ 4. 结果返回                                 │
├─────────────────────────────────────────────┤
│ 返回类型:                                  │
│ • 即时向量(Instant Vector)                │
│ • 范围向量(Range Vector)                  │
│ • 标量(Scalar)                            │
│ • 字符串(String)                          │
└─────────────────────────────────────────────┘

6.2 查询类型 #

text
查询类型:

┌─────────────────────────────────────────────┐
│ 即时查询(Instant Query)                   │
├─────────────────────────────────────────────┤
│ 查询某个时间点的数据                        │
│                                             │
│ 示例:                                       │
│ http_requests_total                          │
│                                             │
│ 结果:                                       │
│ http_requests_total{instance="a"} 100       │
│ http_requests_total{instance="b"} 200       │
└─────────────────────────────────────────────┘

┌─────────────────────────────────────────────┐
│ 范围查询(Range Query)                     │
├─────────────────────────────────────────────┤
│ 查询一段时间范围的数据                      │
│                                             │
│ 示例:                                       │
│ http_requests_total[5m]                      │
│                                             │
│ 结果:                                       │
│ http_requests_total{instance="a"}:          │
│   1700000000: 100                            │
│   1700000015: 105                            │
│   1700000030: 110                            │
└─────────────────────────────────────────────┘

七、总结 #

核心概念总结:

概念 说明
Pull模式 Prometheus主动拉取指标数据
时序数据 指标名称+标签+数据点
TSDB 内置时序数据库
PromQL 查询语言
Exporter 暴露指标的组件
Alertmanager 告警管理器

工作流程:

text
服务发现 → 数据采集 → 数据存储 → 数据查询 → 告警处理

下一步,让我们学习Prometheus快速入门!

最后更新:2026-03-27