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 的工作流程

数据采集流程

  1. 服务发现:Prometheus 通过配置的服务发现机制找到监控目标
  2. 指标拉取:定期(默认 15 秒)从目标的 /metrics 端点拉取数据
  3. 数据存储:将拉取的时间序列数据存储到本地 TSDB
  4. 规则评估:定期评估告警规则和记录规则
  5. 告警发送:将触发的告警发送到 Alertmanager
  6. 数据查询:通过 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 其他监控系统

特性PrometheusZabbixNagiosInfluxDB
数据模型多维时间序列传统监控传统监控时间序列
查询语言PromQLSQL-InfluxQL
数据采集PullPull/PushPullPush
服务发现支持有限有限不支持
云原生
告警内置内置内置需要 Kapacitor
可视化基础内置有限Chronograf
学习曲线中等陡峭陡峭中等

八、Prometheus 的局限性

1. 单机存储

  • 不支持集群
  • 存储容量受限于单机
  • 需要远程存储方案实现高可用

2. 数据持久性

  • 本地存储可能丢失数据
  • 需要定期备份
  • 建议使用远程存储

3. 长期存储

  • 本地存储不适合长期保存
  • 需要集成 Thanos 或 Cortex
  • 存储成本较高

4. 安全性

  • 默认无认证
  • 需要额外配置安全措施
  • 建议使用反向代理

九、总结

Prometheus 是一个强大的监控系统,特别适合云原生和微服务架构。它的多维数据模型、灵活的查询语言和丰富的生态系统使其成为现代监控的首选工具。

关键要点

  • Prometheus 使用拉取模式采集指标
  • 支持四种指标类型:Counter、Gauge、Histogram、Summary
  • 多维数据模型通过标签实现灵活查询
  • 与 Kubernetes 和 Grafana 深度集成
  • 适合动态的云原生环境

在接下来的章节中,我们将学习如何安装和配置 Prometheus,以及如何使用 PromQL 进行数据查询。