Prometheus 监控入门

2026-06-22 · 6 阅读 · 435字
Kubernetes监控

Prometheus 监控入门

什么是 Prometheus

Prometheus 是一个开源的系统监控和告警工具包,最初由 SoundCloud 开发,现为 CNCF 毕业项目。它以 Pull 方式采集时间序列数据,提供强大的查询语言 PromQL。

核心特性

  • 多维数据模型:指标名称 + Key/Value 标签
  • PromQL 查询语言:灵活的数据聚合和分析
  • Pull 采集模式:主动拉取目标暴露的指标
  • 服务发现:自动发现监控目标
  • 告警管理:灵活的告警规则和通知

架构概览

+-------------+    +-------------+
|   Node      |    |   App       |
|  Exporter   |    |  Metrics    |
+------+------+    +------+------+
       |                   |
       +---------+---------+
                 |
         Pull /metrics
                 |
        +--------v--------+
        |   Prometheus     |
        |    Server        |
        +--------+--------+
                 |
     +-----------+-----------+
     |                       |
+----v----+           +------v------+
| Alert   |           |   Grafana   |
| Manager |           | (可视化)    |
+---------+           +-------------+

安装与启动

Docker 方式

# docker-compose.yml
version: '3.8'
services:
  prometheus:
    image: prom/prometheus:latest
    ports:
      - "9090:9090"
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
      - prometheus_data:/prometheus

volumes:
  prometheus_data:

配置文件

# prometheus.yml
global:
  scrape_interval: 15s
  evaluation_interval: 15s

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']

  - job_name: 'node'
    static_configs:
      - targets: ['node-exporter:9100']

  - job_name: 'api'
    metrics_path: '/metrics'
    static_configs:
      - targets: ['api:8080']

指标类型

类型 说明 示例
Counter 只增不减的计数器 请求总数、错误总数
Gauge 可增可减的测量值 CPU 使用率、内存使用量
Histogram 直方图,观测值的分布 请求延迟分布
Summary 摘要,计算分位数 请求延迟的 P99

Histogram 和 Summary 的区别

  • Histogram:在客户端分桶,服务端计算分位数,可聚合
  • Summary:在客户端计算分位数,不可聚合

PromQL 入门

基础查询

# 直接查询指标
http_requests_total

# 带标签过滤
http_requests_total{status="500", method="GET"}

# 范围向量(过去 5 分钟)
http_requests_total[5m]

聚合操作

# 求和
sum(http_requests_total)

# 按标签分组
sum by (status) (http_requests_total)

# 计算速率
rate(http_requests_total[5m])

# 增长量
increase(http_requests_total[1h])

常用查询示例

# CPU 使用率
100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)

# 内存使用率
(1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100

# 磁盘使用率
(node_filesystem_size_bytes{mountpoint="/"} - node_filesystem_free_bytes{mountpoint="/"}) / node_filesystem_size_bytes{mountpoint="/"} * 100

# 请求错误率
sum(rate(http_requests_total{status=~"5.."}[5m])) / sum(rate(http_requests_total[5m])) * 100

# P99 延迟
histogram_quantile(0.99, sum(rate(http_request_duration_seconds_bucket[5m])) by (le))

告警配置

告警规则

# alerts.yml
groups:
  - name: node_alerts
    rules:
      - alert: NodeDown
        expr: up{job="node"} == 0
        for: 5m
        labels:
          severity: critical
        annotations:
          summary: "Node {{ $labels.instance }} is down"

      - alert: HighCPUUsage
        expr: node_cpu_utilization > 0.9
        for: 10m
        labels:
          severity: warning
        annotations:
          summary: "High CPU usage on {{ $labels.instance }}"

Alertmanager 配置

# alertmanager.yml
route:
  receiver: team-email
  group_by: [alertname]
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 4h

receivers:
  - name: team-email
    email_configs:
      - to: team@example.com

服务发现

Kubernetes 服务发现

scrape_configs:
  - job_name: 'kubernetes-pods'
    kubernetes_sd_configs:
      - role: pod
    relabel_configs:
      - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
        action: keep
        regex: true
      - source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port]
        action: replace
        regex: (.+):(?:\d+);(\d+)
        replacement: $1:$2
        target_label: __address__

最佳实践

指标命名规范

  • 使用下划线分隔单词:http_requests_total
  • 使用基础单位:secondsbytesrequests
  • 使用后缀表示类型:_total_count_sum_bucket
  • 包含足够但不过多的标签

避免的高基数标签

  • 不要使用 user_idemailIP 等取值无限的标签
  • 高基数标签会导致性能问题

可视化建议

  • 展示速率而非累计值(用 rate()
  • 合理设置时间范围
  • 使用 Grafana 面板模板

总结

Prometheus 是一个强大而简洁的监控系统,配合 Grafana 和 Alertmanager 可以构建完整的监控体系。从核心指标采集开始,逐步添加告警规则和可视化面板,最终实现全方位的系统可观测性。