4. Prometheus 与 Grafana 集成

Prometheus 作为云原生生态的事实标准监控系统,负责指标的采集、存储与告警计算;Grafana 则提供统一的可视化层。两者通过标准数据源协议集成,构成灰度发布准入调试中“数据驱动决策”的基石。本章将深入讲解从数据源配置到面板绑定的完整链路。

4.1 Prometheus 数据源配置

在 Grafana 中添加 Prometheus 数据源是集成的第一步。配置路径为 Configuration → Data Sources → Add data source → Prometheus。核心配置项如下表所示:

配置项 必填 说明 典型值
Name 是 数据源标识,用于面板和告警引用 Prometheus-Prod
URL 是 Prometheus HTTP API 地址 http://prometheus:9090
Access 是 请求模式:Server(推荐)或 Browser Server
Scrape interval 否 数据源级别的默认抓取步长 15s
Timeout 否 查询超时时间 60s
HTTP Method 否 POST 支持更长的查询体 POST
生产建议:在灰度发布场景中,建议为每个环境(canary / stable / staging)配置独立的数据源,并在数据源名称中加入环境后缀,便于面板切换时快速识别。

4.2 指标采集与存储机制

Prometheus 采用 拉(Pull)模式 采集指标,通过 scrape_config 定义目标端点。灰度发布场景下,通常需要为金丝雀实例和稳定实例分别添加标签以区分流量组。

以下是一个典型的采集配置片段,用于区分灰度组:

scrape_configs:
  - job_name: 'myapp-canary'
    kubernetes_sd_configs:
      - role: pod
    relabel_configs:
      - source_labels: [__meta_kubernetes_pod_label_release]
        regex: canary
        action: keep
      - source_labels: [__meta_kubernetes_pod_label_app]
        target_label: app
      - source_labels: [__meta_kubernetes_pod_label_release]
        target_label: release_group
  - job_name: 'myapp-stable'
    kubernetes_sd_configs:
      - role: pod
    relabel_configs:
      - source_labels: [__meta_kubernetes_pod_label_release]
        regex: stable
        action: keep
      - source_labels: [__meta_kubernetes_pod_label_app]
        target_label: app
      - source_labels: [__meta_kubernetes_pod_label_release]
        target_label: release_group

存储方面,Prometheus 使用本地 TSDB(时间序列数据库),默认保留 15 天。关键存储参数包括:

  • --storage.tsdb.retention.time:数据保留时长,灰度发布调试建议保留 7~30 天。
  • --storage.tsdb.retention.size:存储上限,避免磁盘写满。
  • --storage.tsdb.path:数据目录,建议挂载独立持久卷。

4.3 PromQL 基础查询

PromQL(Prometheus Query Language)是 Grafana 面板与 Prometheus 交互的核心语言。灰度发布准入调试中,最常用的三类查询模式如下:

查询模式 PromQL 示例 灰度场景用途
瞬时向量 http_requests_total{release_group="canary"} 查看金丝雀当前请求总量
范围向量 rate(http_requests_total{release_group="canary"}[5m]) 计算金丝雀 5 分钟平均 QPS
聚合查询 avg by (instance) (rate(http_request_duration_seconds_sum[1m])) 按实例聚合平均延迟
关键函数速记:
rate() — 计算每秒增长率,适用于 Counter 类型。
increase() — 计算时间窗口内的增量。
histogram_quantile() — 从 Histogram 计算分位数,如 p99 延迟。
label_replace() — 动态重写标签,用于统一不同版本的标签名。

4.4 Grafana 面板绑定 Prometheus

面板绑定是将 PromQL 查询结果可视化的最后一步。在 Grafana 面板编辑器中,按以下步骤完成绑定:

  1. 选择数据源:在面板右上角下拉框中选择已配置的 Prometheus 数据源。
  2. 输入查询:在 Metrics 输入框中写入 PromQL 表达式,支持自动补全。
  3. 设置 Legend 格式:使用 {{label_name}} 模板化图例,例如 {{release_group}} - {{instance}}。
  4. 配置时间范围:面板右上角的时间选择器会覆盖 PromQL 中的时间参数。
  5. 调整可视化类型:根据指标特性选择 Time series、Stat、Table 或 Bar gauge。
常见陷阱:当面板时间范围小于 Prometheus 抓取间隔的两倍时,可能出现“No data”错误。建议面板最小时间粒度设置为 30s 以上,或使用 $__rate_interval 变量自动适配。
Prometheus 与 Grafana 集成数据流 应用实例 /metrics 端点 Prometheus Server 拉取 + TSDB 存储 Grafana 面板 + 告警 scrape (pull) PromQL / HTTP API scrape_config Data Source 配置 Panel / Dashboard 灰度发布关键标签传递 • 应用实例通过 relabel_configs 注入 release_group=canary|stable 标签 • Prometheus 存储带标签的时间序列,Grafana 通过 PromQL 按标签过滤 • 面板使用 {{release_group}} 模板变量实现金丝雀/稳定组一键切换

4.5 灰度发布场景的 PromQL 实战模式

在准入调试阶段,以下三种 PromQL 模式可直接用于面板绑定:

  • 金丝雀 vs 稳定组对比:
    sum by (release_group) (rate(http_requests_total{job="myapp"}[5m])) — 在面板中通过图例区分两组流量。
  • 错误率准入门禁:
    sum(rate(http_requests_total{status=~"5..", release_group="canary"}[5m])) / sum(rate(http_requests_total{release_group="canary"}[5m])) — 计算金丝雀 5xx 错误率。
  • 延迟分位数监控:
    histogram_quantile(0.99, sum(rate(http_request_duration_seconds_bucket{release_group="canary"}[5m])) by (le)) — 展示 p99 延迟。
面板绑定最佳实践:在 Grafana 面板的 Query 选项中,将 Min step 设置为 $__rate_interval,将 Resolution 设置为 1/1,确保 PromQL 计算与面板时间范围自动对齐,避免因步长不匹配导致的锯齿或空数据。