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