Prometheus 采集与 Grafana 可视化指南

一、Prometheus 数据采集原理

Prometheus 是一个开源的系统监控和警报工具包,采用拉取(pull)模式从目标收集指标数据。其核心采集机制包括:

  1. 数据模型:Prometheus 将所有数据存储为时间序列,每个时间序列由指标名称(metric name)和一组键值对标签(label)唯一标识。时间序列数据格式为:<metric name>{<label name>=<label value>,...} value [timestamp]

  2. 指标类型

    • Counter(计数器):单调递增的数值,适合记录请求数量、任务完成数等
    • Gauge(仪表盘):可以任意变化的数值,适合记录内存使用量、温度等瞬时值
    • Histogram(直方图):采样观察值,自动计算分位数,适合记录请求延迟、响应大小
    • Summary(摘要):类似直方图但可直接在客户端计算分位数,适合记录高精度延迟数据
  3. 采集方式

    • 通过HTTP端点定期抓取指标(默认路径/metrics)
    • 支持多种服务发现机制(静态配置、DNS、Kubernetes、Consul等)
    • 可配置抓取间隔(scrape_interval)和超时时间(scrape_timeout)
    • 支持Pushgateway用于短期任务指标推送

二、配置Prometheus采集

1. 基本配置示例

global:
  scrape_interval: 15s      # 默认抓取间隔
  evaluation_interval: 15s  # 规则评估间隔
  external_labels:          # 外部系统标识
    monitor: 'production'

scrape_configs:
  - job_name: 'prometheus'   # 监控Prometheus自身
    scrape_interval: 10s     # 覆盖全局设置
    static_configs:
      - targets: ['localhost:9090']
  
  - job_name: 'node_exporter'  # 监控节点指标
    metrics_path: '/metrics'    # 指标路径
    static_configs:
      - targets: 
          - 'node-exporter:9100'
          - 'node-exporter2:9100'
    relabel_configs:          # 标签重写
      - source_labels: [__address__]
        regex: '(.*):9100'
        target_label: 'instance'
        replacement: '$1'

2. 高级采集配置

  • 文件服务发现
scrape_configs:
  - job_name: 'file_sd'
    file_sd_configs:
      - files:
        - /etc/prometheus/targets/*.json
        refresh_interval: 5m  # 文件重新加载间隔
  • Kubernetes服务发现
scrape_configs:
  - job_name: 'kubernetes-nodes'
    kubernetes_sd_configs:
      - role: node  # 发现集群节点
    scheme: https
    tls_config:
      insecure_skip_verify: true
    bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
    relabel_configs:
      - action: labelmap  # 将K8s标签映射为Prometheus标签
        regex: __meta_kubernetes_node_label_(.+)
      - source_labels: [__address__]
        regex: '(.*):10250'
        replacement: '${1}:9100'  # 将kubelet端口替换为node-exporter端口
        target_label: __address__

三、Grafana可视化配置

1. 连接Prometheus数据源

  1. 登录Grafana(默认地址http://localhost:3000)
  2. 导航到Configuration > Data Sources
  3. 选择"Add data source"
  4. 选择Prometheus类型
  5. 配置参数:
    • URL: http://prometheus:9090
    • Scrape interval: 15s(与Prometheus配置一致)
    • HTTP Method: GET
    • Timeout: 30s
  6. 点击"Save & Test"验证连接

2. 创建仪表盘

CPU使用率面板示例
{
  "title": "CPU Usage by Instance",
  "description": "实时显示各节点CPU使用率",
  "type": "gauge",
  "datasource": "Prometheus",
  "gridPos": { "x": 0, "y": 0, "w": 8, "h": 6 },
  "targets": [
    {
      "expr": "100 - (avg by (instance) (irate(node_cpu_seconds_total{mode=\"idle\"}[5m])) * 100)",
      "legendFormat": "{{instance}}",
      "interval": "15s",
      "refId": "A"
    }
  ],
  "options": {
    "min": 0,
    "max": 100,
    "unit": "percent",
    "thresholds": {
      "mode": "absolute",
      "steps": [
        { "color": "green", "value": null },
        { "color": "orange", "value": 70 },
        { "color": "red", "value": 85 }
      ]
    },
    "showThresholdLabels": true,
    "showThresholdMarkers": true
  }
}
内存使用趋势图
{
  "title": "Memory Usage Trend",
  "type": "graph",
  "datasource": "Prometheus",
  "gridPos": { "x": 8, "y": 0, "w": 16, "h": 8 },
  "targets": [
    {
      "expr": "(node_memory_MemTotal_bytes - node_memory_MemFree_bytes - node_memory_Buffers_bytes - node_memory_Cached_bytes) / (1024*1024)",
      "legendFormat": "Used ({{instance}})",
      "step": "60s",
      "refId": "A"
    },
    {
      "expr": "node_memory_MemTotal_bytes / (1024*1024)",
      "legendFormat": "Total ({{instance}})",
      "step": "60s",
      "refId": "B"
    }
  ],
  "options": {
    "legend": {
      "show": true,
      "values": true,
      "min": false,
      "max": true,
      "current": true,
      "total": false,
      "alignAsTable": true
    },
    "tooltip": {
      "shared": true,
      "sort": 2  // 按值降序排序
    },
    "yaxes": [
      {
        "format": "MB",
        "min": 0
      },
      {
        "show": false
      }
    ],
    "lines": true,
    "fill": 1,
    "linewidth": 2
  }
}

四、最佳实践与技巧

  1. 标签使用建议

    • 避免高基数标签(如用户ID、IP地址),可能导致内存爆炸
    • 使用一致的标签命名约定(如snake_case)
    • 合理利用relabel_configs处理标签:
      relabel_configs:
        - source_labels: [__meta_kubernetes_pod_name]
          target_label: pod
        - regex: '.*_token;.*'  # 删除敏感标签
          action: labeldrop
      
  2. 采集优化

    • 关键指标:15s采集间隔
    • 次要指标:30-60s采集间隔
    • 使用记录规则预计算常用查询:
      groups:
      - name: node_rules
        rules:
        - record: instance:node_cpu:avg_rate5m
          expr: 100 - avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) by (instance) * 100
      
  3. Grafana高级技巧

    • 使用模板变量实现交互式仪表盘:
      "templating": {
        "list": [
          {
            "name": "instance",
            "datasource": "Prometheus",
            "query": "label_values(node_cpu_seconds_total, instance)",
            "refresh": 1,
            "multi": true
          }
        ]
      }
      
    • 利用Annotations标记部署、重启等重要事件
    • 配置警报规则并与Alertmanager集成
    • 使用Dashboard JSON Model进行版本控制
    • 应用Grafana插件(如Pie Chart, Worldmap Panel等)

五、常见问题排查

  1. Prometheus无法抓取指标

    • 检查目标端点是否可访问:curl http://target:port/metrics
    • 验证服务发现配置是否正确:http://prometheus:9090/service-discovery
    • 检查网络连接和防火墙设置
    • 查看Prometheus日志:journalctl -u prometheus -f
  2. Grafana显示无数据

    • 验证数据源连接:Grafana > Data Sources > Test
    • 检查查询时间范围设置(右上角时间选择器)
    • 确认PromQL查询语法正确:http://prometheus:9090/graph中测试
    • 检查指标名称是否存在:count({__name__=~".+"})
  3. 性能问题

    • 监控Prometheus自身指标:
      • 内存使用:process_resident_memory_bytes
      • 存储速率:rate(prometheus_tsdb_head_samples_appended_total[1m])
    • 优化高消耗查询:
      • 避免.*正则匹配
      • 使用rate()而非irate()处理长时间范围
    • 考虑分片或联邦部署:
      scrape_configs:
        - job_name: 'federate'
          honor_labels: true
          metrics_path: '/federate'
          params:
            'match[]':
              - '{job="prometheus"}'
              - '{__name__=~"job:.*"}'
          static_configs:
            - targets:
              - 'source-prometheus:9090'
      

通过合理配置Prometheus采集和Grafana可视化,您可以构建强大的监控系统,实时掌握系统运行状态,快速定位和解决问题。建议定期审查指标采集策略,删除无用指标,优化存储效率。

Logo

永洪科技,致力于打造全球领先的数据技术厂商,具备从数据应用方案咨询、BI、AIGC智能分析、数字孪生、数据资产、数据治理、数据实施的端到端大数据价值服务能力。

更多推荐