3. Prometheus 数据源:安装与配置、指标抓取、PromQL 基础查询

Prometheus 是 Grafana 最核心的时序数据源之一,也是灰度发布准入面板中实时流量、错误率、延迟等指标的主要来源。本章将围绕 Prometheus 的本地安装、数据源配置、指标抓取机制以及 PromQL 基础查询展开,为后续面板开发打下数据基础。

3.1 Prometheus 安装与启动

在开发环境中,推荐使用 Docker 快速部署 Prometheus 实例。以下为标准的启动流程:

  1. 拉取镜像:docker pull prom/prometheus:latest
  2. 准备配置文件:创建 prometheus.yml,定义全局配置与抓取目标。
  3. 启动容器:将配置文件挂载至容器内 /etc/prometheus/ 目录。
  4. 验证运行:访问 http://localhost:9090 确认 Prometheus UI 正常加载。
快速启动命令示例:
docker run -d \
  --name prometheus \
  -p 9090:9090 \
  -v $(pwd)/prometheus.yml:/etc/prometheus/prometheus.yml \
  prom/prometheus:latest

3.2 数据源配置(Grafana 侧)

Prometheus 运行后,需在 Grafana 中将其添加为数据源。配置路径为 Configuration → Data Sources → Add data source → Prometheus。关键配置项如下:

配置项 说明 推荐值
Name 数据源名称,用于面板中引用 Prometheus
URL Prometheus HTTP API 地址 http://localhost:9090
Access 访问模式,Browser 或 Server Server(推荐)
Scrape interval Grafana 默认查询步长 15s
Timeout 查询超时时间 30s
提示: 若 Grafana 与 Prometheus 部署在同一 Docker 网络,URL 可使用容器名称代替 localhost,例如 http://prometheus:9090。

3.3 指标抓取机制

Prometheus 通过 Pull 模型 主动从目标端点抓取指标。每个目标需暴露 /metrics 端点,返回符合 Prometheus 格式的文本数据。抓取配置在 prometheus.yml 的 scrape_configs 块中定义。

以下为灰度发布场景中常见的抓取配置示例:

scrape_configs:
  - job_name: 'gray-release-app'
    scrape_interval: 10s
    metrics_path: '/metrics'
    static_configs:
      - targets:
        - 'app-canary:8080'
        - 'app-stable:8080'
        labels:
          group: 'gray-release'
  - job_name: 'envoy-stats'
    scrape_interval: 15s
    metrics_path: '/stats/prometheus'
    static_configs:
      - targets:
        - 'envoy-admin:9901'
注意: 灰度发布场景中,务必为金丝雀(canary)和稳定(stable)实例添加区分标签(如 version、group),以便在 PromQL 中按版本聚合对比。
Prometheus 指标抓取架构 Prometheus Server App-Canary:8080 App-Stable:8080 Envoy-Admin:9901 抓取流程说明: 1. Prometheus 按 scrape_interval 定时向 targets 发起 HTTP GET 请求。 2. 目标返回 /metrics 文本,包含指标名、标签、时间戳、值。 3. Prometheus 解析并存储至本地 TSDB,等待 Grafana 查询。

3.4 PromQL 基础查询

PromQL(Prometheus Query Language)是 Grafana 面板中查询时序数据的核心语言。以下为灰度发布面板中最常用的 PromQL 模式:

3.4.1 即时查询与范围查询

查询类型 语法示例 返回结果
即时向量 http_requests_total{version="canary"} 当前最新值
范围向量 http_requests_total{version="canary"}[5m] 过去 5 分钟所有样本
速率计算 rate(http_requests_total{version="canary"}[1m]) 每秒请求增长率

3.4.2 灰度发布常用 PromQL 模式

  • 金丝雀 vs 稳定流量对比:
    sum(rate(http_requests_total{version="canary"}[1m])) / sum(rate(http_requests_total{version="stable"}[1m]))
  • 错误率计算:
    sum(rate(http_requests_total{status=~"5..", version="canary"}[1m])) / sum(rate(http_requests_total{version="canary"}[1m])) * 100
  • P99 延迟:
    histogram_quantile(0.99, sum(rate(http_request_duration_seconds_bucket{version="canary"}[5m])) by (le))
关键概念: 在 Grafana 面板中,PromQL 查询通常配合 模板变量(如 $version、$app)使用,实现动态切换金丝雀/稳定版本。
PromQL 查询处理流程 Grafana 面板 PromQL 查询 TSDB 存储 时序数据返回 图表/表格渲染 查询链路: Grafana 发送 PromQL → Prometheus 解析并读取 TSDB → 返回时序数据 → Grafana 渲染为可视化组件。

3.5 数据源验证与调试

完成配置后,在 Grafana 数据源设置页点击 Save & Test,若返回绿色提示 "Data source is working" 则表示连接成功。常见问题排查:

  • 连接超时:检查 Grafana 与 Prometheus 之间的网络连通性,确认 URL 协议(http/https)与端口正确。
  • 无数据返回:在 Prometheus UI 的 Graph 页面手动执行 up 查询,确认目标是否处于 1(正常)状态。
  • 标签不匹配:在 PromQL 中使用 {__name__=~".*"} 列出所有指标,检查标签键名是否与面板模板变量一致。
调试技巧: 在 Grafana 面板的 Query 编辑器中,使用 Query Inspector 功能查看原始请求与响应,快速定位 PromQL 语法错误或数据格式问题。