Prometheus 是一个开源的系统监控和告警工具包,最初由 SoundCloud 开发。它现在是继 Kubernetes 之后的第二个加入 CNCF(Cloud Native Computing Foundation)的项目。本教程将帮助你深入了解 Prometheus 的核心概念和使用方法。

Prometheus 核心概念

数据模型

Prometheus 采用时间序列数据库(TSDB)存储数据,每个时间序列由以下部分组成:

  • 指标名称:描述监控指标的名称
  • 标签(Labels):键值对形式的元数据
  • 时间戳:数据采集的时间点
  • :实际的度量值

示例:

http_requests_total{method="POST", endpoint="/api/users"} 23 1608825600

数据类型

Prometheus 支持四种核心的数据类型:

  1. Counter(计数器):只增不减的计数器
  2. Gauge(仪表盘):可增可减的数值
  3. Histogram(直方图):对数据进行分组统计
  4. Summary(摘要):类似 Histogram,提供分位数统计

安装和配置

使用 Docker 安装

  1. 创建 Prometheus 配置文件 prometheus.yml
global:
  scrape_interval: 15s
  evaluation_interval: 15s

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']
  1. 运行 Prometheus 容器:
docker run -d \
  --name prometheus \
  -p 9090:9090 \
  -v $(pwd)/prometheus.yml:/etc/prometheus/prometheus.yml \
  prom/prometheus

基础配置说明

prometheus.yml 的主要配置项:

global:
  scrape_interval: 15s     # 抓取间隔
  evaluation_interval: 15s  # 规则评估间隔

# 告警管理器配置
alerting:
  alertmanagers:
    - static_configs:
        - targets: ['localhost:9093']

# 规则文件
rule_files:
  - "rules/*.yml"

# 抓取配置
scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']

PromQL 查询语言

基础查询

  1. 即时查询
http_requests_total
  1. 范围查询
http_requests_total[5m]
  1. 聚合操作
sum(http_requests_total) by (endpoint)

常用操作符

  1. 算术运算符
node_memory_free_bytes / (1024 * 1024)  # 转换为 MB
  1. 比较运算符
http_requests_total > 100
  1. 聚合运算符
avg_over_time(node_cpu_seconds_total[5m])

监控目标配置

静态配置

scrape_configs:
  - job_name: 'node-exporter'
    static_configs:
      - targets: ['localhost:9100']
        labels:
          environment: 'production'

服务发现

scrape_configs:
  - job_name: 'kubernetes-pods'
    kubernetes_sd_configs:
      - role: pod

告警配置

告警规则

创建告警规则文件 alert.rules.yml

groups:
- name: example
  rules:
  - alert: HighRequestLatency
    expr: http_request_duration_seconds > 1
    for: 10m
    labels:
      severity: warning
    annotations:
      summary: "High request latency on {{ $labels.instance }}"
      description: "Request latency is above 1s (current value: {{ $value }}s)"

配置 Alertmanager

创建 Alertmanager 配置文件 alertmanager.yml

global:
  resolve_timeout: 5m

route:
  group_by: ['alertname']
  group_wait: 10s
  group_interval: 10s
  repeat_interval: 1h
  receiver: 'web.hook'

receivers:
- name: 'web.hook'
  webhook_configs:
  - url: 'http://127.0.0.1:5001/'

与 Grafana 集成

添加数据源

  1. 登录 Grafana
  2. 配置 > Data Sources > Add data source
  3. 选择 Prometheus
  4. 配置 URL: http://localhost:9090
  5. 点击 "Save & Test"

创建仪表板

  1. 创建新的仪表板
  2. 添加面板
  3. 使用 PromQL 查询,例如:
rate(http_requests_total[5m])

最佳实践

命名规范

  • 使用有意义的指标名称
  • 遵循命名约定:<namespace>_<name>_<unit>_<type>
  • 标签名使用小写字母和下划线

示例:

http_request_duration_seconds_bucket

性能优化

  1. 合理的抓取间隔

    • 通常设置为 15-60 秒
    • 根据实际需求和资源调整
  2. 查询优化

    • 避免使用过多的聚合操作
    • 合理使用时间范围
    • 优化标签选择器
  3. 存储优化

    • 合理设置数据保留时间
    • 使用适当的压缩设置

常见问题排查

1. 抓取失败

检查以下几点:

  • 目标服务是否正常运行
  • 网络连接是否正常
  • 防火墙配置是否正确

2. 查询超时

可能的解决方案:

  • 优化查询语句
  • 增加查询超时时间
  • 减少时间范围

3. 高内存使用

处理方法:

  • 减少时间序列数量
  • 优化标签使用
  • 调整抓取间隔

总结

Prometheus 是一个强大的监控系统,它提供了:

  1. 灵活的数据模型
  2. 强大的查询语言
  3. 可靠的告警机制
  4. 丰富的集成选项

通过本教程,你应该已经掌握了:

  • Prometheus 的基本概念和架构
  • 安装和配置方法
  • PromQL 查询语言的使用
  • 告警配置
  • 与 Grafana 的集成
  • 最佳实践和问题排查方法

建议从小规模部署开始,逐步扩展监控范围,不断优化配置和查询,以建立一个高效可靠的监控系统。