17.6.2 Prometheus数据源配置与最佳实践

Prometheus 作为 Grafana 的核心数据源,配置质量直接影响查询性能、告警稳定性与可视化体验。本节给出数据源配置原理、完整示例、排错流程与练习,便于落地。

原理草图(Grafana 访问 Prometheus 数据流)

文章图片

安装与基础前置(Grafana 运行环境)

# 1) 安装 Grafana(以 CentOS/RHEL 为例)
sudo yum install -y https://dl.grafana.com/oss/release/grafana-10.4.2-1.x86_64.rpm

# 2) 启动并设置开机自启
sudo systemctl enable --now grafana-server

# 3) 验证服务端口
ss -lntp | grep 3000
# 预期:LISTEN 0 128 0.0.0.0:3000 ...

命令解释
- systemctl enable --now:立即启动并设置开机自启
- ss -lntp:查看监听端口,确认 Grafana 运行正常

Prometheus 数据源配置(UI 与文件化 Provisioning)

1)UI 配置关键参数(示例)
- URL:http://prometheus:9090
- Access:Server
- Min step:15s(与 Prometheus scrape_interval 对齐)
- Query Timeout:60s

2)文件化 Provisioning(推荐,避免手工漂移)
文件路径:/etc/grafana/provisioning/datasources/prometheus.yaml

apiVersion: 1
datasources:
  - name: prom-prod
    type: prometheus
    access: proxy
    url: http://prometheus:9090
    isDefault: true
    jsonData:
      timeInterval: 15s          # 对齐 scrape_interval
      httpMethod: GET
      queryTimeout: 60s
    secureJsonData: {}

应用配置并重载:

sudo systemctl restart grafana-server

验证数据源是否可用(命令与预期)

# Grafana API 查询数据源(默认管理员账号 admin/admin)
curl -s -u admin:admin http://localhost:3000/api/datasources | jq '.[].name'

# 预期输出包含:
# "prom-prod"

命令解释
- curl -u:Basic Auth 访问 Grafana API
- jq '.[].name':只输出数据源名称,便于确认

安全与访问控制示例(Nginx 反向代理 + 基础认证)

# /etc/nginx/conf.d/prometheus.conf
server {
  listen 8080;
  server_name prom.example.com;

  location / {
    auth_basic "Prometheus";
    auth_basic_user_file /etc/nginx/.htpasswd;
    proxy_pass http://prometheus:9090;
    proxy_set_header Host $host;
  }
}
# 创建基础认证用户
sudo yum install -y httpd-tools
htpasswd -c /etc/nginx/.htpasswd promuser
sudo systemctl restart nginx

命令解释
- htpasswd -c:生成认证文件并写入用户
- proxy_pass:将 Grafana 的访问统一走代理入口

性能最佳实践示例(Min step 与录制规则)
- Min step 与抓取间隔对齐:15s30s
- 热点指标使用 Recording Rules:

# /etc/prometheus/rules/recording.yml
groups:
  - name: node_cpu
    interval: 30s
    rules:
      - record: job:node_cpu:avg
        expr: avg(rate(node_cpu_seconds_total[5m])) by (job)

常见问题排查(命令可直接执行)

1)数据源连接失败

# Grafana 到 Prometheus 的网络连通性
curl -s http://prometheus:9090/-/healthy
# 预期:Prometheus is Healthy.

说明:如果失败,检查 DNS、路由或防火墙。

2)查询无数据

# 检查 Prometheus 是否有目标
curl -s http://prometheus:9090/api/v1/targets | jq '.data.activeTargets[].labels.job'

说明:确认 job 标签与面板 PromQL 一致。

3)查询慢或超时

# 查看 Prometheus 查询日志/慢查询
grep "query" /var/log/prometheus/prometheus.log | tail -n 20

说明:缩小时间范围,设置合理 Min step,使用录制规则。

练习题(可操作)
1. 使用 Provisioning 创建 prom-staging 数据源并设为非默认。
2. 将 timeInterval 调整为 30s,观察 Dashboard 查询速度变化。
3. 使用 curl 调用 /api/v1/query 查询 up 指标,验证数据源正确性:

curl -s "http://prometheus:9090/api/v1/query?query=up" | jq '.data.result[0].value'

配置要点速记
- URL 使用内部访问地址,命名统一如 prom-prod
- Access 选 Server/Proxy,避免跨域
- Min step 与 scrape_interval 对齐
- Query Timeout 建议 30s~60s
- 多集群接入使用统一标签 cluster/env/job