Prometheus教程
5分钟阅读
Prometheus 基础
一、Prometheus 简介
Prometheus 是一个开源的系统监控和告警工具,最初由 SoundCloud 开发,现在是 Cloud Native Computing Foundation (CNCF) 的毕业项目。它专为云原生环境设计,特别适合监控动态的微服务架构。
Prometheus 的特点
- 多维数据模型:使用时间序列数据,通过指标名称和键值对标识
- 灵活的查询语言:PromQL 允许对时间序列数据进行复杂查询
- 不依赖分布式存储:单个服务器节点是自治的
- 通过 HTTP 拉取数据:主动从目标拉取指标数据
- 支持推送网关:用于短期任务的指标推送
- 服务发现:支持多种服务发现机制
- 丰富的可视化:内置表达式浏览器,集成 Grafana
二、Prometheus 核心概念
1. 时间序列(Time Series)
时间序列是由指标名称和一组标签(键值对)唯一标识的数据流。每个时间序列包含一系列带时间戳的样本值。
http_requests_total{method="GET", endpoint="/api/users", status="200"} 1234 @1609459200
组成部分:
- 指标名称:
http_requests_total - 标签:
method="GET",endpoint="/api/users",status="200" - 样本值:
1234 - 时间戳:
1609459200
2. 指标(Metrics)
指标是对系统某个方面的度量,Prometheus 支持四种指标类型:
Counter(计数器)
只增不减的累计指标,用于统计请求数、错误数等。
# 示例:HTTP 请求总数
http_requests_total{method="GET"} 1234
Gauge(仪表盘)
可增可减的瞬时值,用于统计内存使用、温度等。
# 示例:当前内存使用量
memory_usage_bytes{instance="server1"} 1073741824
Histogram(直方图)
对观察结果进行采样,并在可配置的桶中计数,用于统计请求延迟、响应大小等。
# 示例:HTTP 请求延迟分布
http_request_duration_seconds_bucket{le="0.1"} 100
http_request_duration_seconds_bucket{le="0.5"} 250
http_request_duration_seconds_bucket{le="1.0"} 300
http_request_duration_seconds_sum 450.5
http_request_duration_seconds_count 300
Summary(摘要)
类似于 Histogram,但在客户端计算分位数。
# 示例:HTTP 请求延迟摘要
http_request_duration_seconds{quantile="0.5"} 0.2
http_request_duration_seconds{quantile="0.9"} 0.8
http_request_duration_seconds{quantile="0.99"} 1.5
http_request_duration_seconds_sum 450.5
http_request_duration_seconds_count 300
3. 标签(Labels)
标签是键值对,用于区分同一指标的不同维度。标签使 Prometheus 的数据模型变得多维。
http_requests_total{
method="GET",
endpoint="/api/users",
status="200",
instance="server1:8080"
}
标签命名规范:
- 使用小写字母、数字和下划线
- 以字母开头
- 避免使用
__开头(保留给内部使用)
4. 任务和实例(Jobs and Instances)
- Instance(实例):可以抓取的单个端点,通常对应一个进程
- Job(任务):具有相同目的的实例集合
# 示例:一个 Job 包含多个 Instance
job: api-server
- instance: 192.168.1.10:8080
- instance: 192.168.1.11:8080
- instance: 192.168.1.12:8080
三、Prometheus 架构
整体架构图
┌─────────────────────────────────────────────────────────────┐
│ Prometheus Server │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Retrieval │ │ Storage │ │ PromQL │ │
│ │ (拉取) │─▶│ (存储) │◀─│ (查询) │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
└─────────────────────────────────────────────────────────────┘
▲ │
│ ▼
┌────┴────┐ ┌──────────────┐
│ Targets │ │ Alertmanager│
│ (监控目标)│ │ (告警管理) │
└─────────┘ └──────────────┘
▲ │
│ ▼
┌────┴────┐ ┌──────────────┐
│ Exporters│ │ Notification│
│ (导出器) │ │ (通知渠道) │
└─────────┘ └──────────────┘
▲
│
┌────┴────┐ ┌──────────────┐
│Pushgateway│ │ Grafana │
│ (推送网关)│ │ (可视化) │
└─────────┘ └──────────────┘
核心组件
1. Prometheus Server
- Retrieval(检索):负责从配置的目标拉取指标数据
- TSDB(时间序列数据库):本地存储抓取的时间序列数据
- HTTP Server:提供 PromQL 查询接口和 Web UI
2. Client Libraries(客户端库)
为应用程序提供指标埋点,支持多种编程语言:
- Go
- Java/Scala
- Python
- Ruby
- .NET/C#
3. Exporters(导出器)
将第三方系统的指标转换为 Prometheus 格式:
- Node Exporter:Linux 系统指标
- MySQL Exporter:MySQL 数据库指标
- Blackbox Exporter:黑盒监控(HTTP、TCP、ICMP)
- Redis Exporter:Redis 指标
4. Pushgateway(推送网关)
用于短期任务的指标推送,适合批处理任务。
5. Alertmanager(告警管理器)
处理 Prometheus 发送的告警,支持:
- 告警分组
- 告警抑制
- 告警静默
- 多种通知渠道(邮件、Slack、PagerDuty 等)
6. Service Discovery(服务发现)
自动发现监控目标,支持:
- Kubernetes
- Consul
- EC2
- Azure
- 文件
四、Prometheus 的工作流程
数据采集流程
- 服务发现:Prometheus 通过配置的服务发现机制找到监控目标
- 指标拉取:定期(默认 15 秒)从目标的
/metrics端点拉取数据 - 数据存储:将拉取的时间序列数据存储到本地 TSDB
- 规则评估:定期评估告警规则和记录规则
- 告警发送:将触发的告警发送到 Alertmanager
- 数据查询:通过 PromQL 查询存储的时间序列数据
数据流向图
┌──────────────┐
│ Application │
│ (应用程序) │
└──────┬───────┘
│ 暴露 /metrics
▼
┌──────────────┐
│ Exporter │
│ (导出器) │
└──────┬───────┘
│ HTTP GET /metrics
▼
┌──────────────┐
│ Prometheus │
│ Server │
└──────┬───────┘
│ 存储时间序列
▼
┌──────────────┐
│ TSDB │
│ (时间序列库) │
└──────┬───────┘
│ PromQL 查询
▼
┌──────────────┐
│ Grafana │
│ (可视化) │
└──────────────┘
五、Prometheus 的优势
1. 云原生设计
- 专为动态环境设计
- 支持容器和微服务
- 与 Kubernetes 深度集成
2. 强大的查询语言
- PromQL 提供灵活的数据查询
- 支持聚合、过滤、数学运算
- 可以进行复杂的时间序列分析
3. 高效的存储
- 本地时间序列数据库
- 高效的数据压缩
- 支持远程存储集成
4. 灵活的告警
- 基于 PromQL 的告警规则
- 灵活的告警路由
- 支持多种通知渠道
5. 丰富的生态
- 大量的 Exporters
- 与 Grafana 完美集成
- 活跃的社区支持
六、Prometheus 的应用场景
1. 基础设施监控
- 服务器 CPU、内存、磁盘、网络
- 容器资源使用情况
- 虚拟机性能指标
2. 应用性能监控(APM)
- HTTP 请求延迟
- 请求成功率
- 应用错误率
- 业务指标
3. 微服务监控
- 服务间调用链路
- 服务健康状态
- API 性能指标
- 服务依赖关系
4. 数据库监控
- 查询性能
- 连接池状态
- 慢查询统计
- 数据库资源使用
5. 业务指标监控
- 用户注册数
- 订单量
- 支付成功率
- 用户活跃度
七、Prometheus vs 其他监控系统
| 特性 | Prometheus | Zabbix | Nagios | InfluxDB |
|---|---|---|---|---|
| 数据模型 | 多维时间序列 | 传统监控 | 传统监控 | 时间序列 |
| 查询语言 | PromQL | SQL | - | InfluxQL |
| 数据采集 | Pull | Pull/Push | Pull | Push |
| 服务发现 | 支持 | 有限 | 有限 | 不支持 |
| 云原生 | 是 | 否 | 否 | 是 |
| 告警 | 内置 | 内置 | 内置 | 需要 Kapacitor |
| 可视化 | 基础 | 内置 | 有限 | Chronograf |
| 学习曲线 | 中等 | 陡峭 | 陡峭 | 中等 |
八、Prometheus 的局限性
1. 单机存储
- 不支持集群
- 存储容量受限于单机
- 需要远程存储方案实现高可用
2. 数据持久性
- 本地存储可能丢失数据
- 需要定期备份
- 建议使用远程存储
3. 长期存储
- 本地存储不适合长期保存
- 需要集成 Thanos 或 Cortex
- 存储成本较高
4. 安全性
- 默认无认证
- 需要额外配置安全措施
- 建议使用反向代理
九、总结
Prometheus 是一个强大的监控系统,特别适合云原生和微服务架构。它的多维数据模型、灵活的查询语言和丰富的生态系统使其成为现代监控的首选工具。
关键要点:
- Prometheus 使用拉取模式采集指标
- 支持四种指标类型:Counter、Gauge、Histogram、Summary
- 多维数据模型通过标签实现灵活查询
- 与 Kubernetes 和 Grafana 深度集成
- 适合动态的云原生环境
在接下来的章节中,我们将学习如何安装和配置 Prometheus,以及如何使用 PromQL 进行数据查询。