Prometheus + Grafana 监控系统搭建

说明: 本文为配置思路与示例整理,不代表作者已在自己的服务器上逐项验证全部命令。执行涉及公网暴露、账户权限、数据删除或服务重启的操作前,请先备份,并结合官方文档与实际环境核验。

在运维和开发工作中,"服务器又挂了"可能是最让人头疼的一句话。更让人崩溃的是,你甚至不知道它是什么时候挂的、为什么挂的、挂了多久。搭建一套完善的监控系统,就是解决这些问题的关键。本文将手把手带你搭建 Prometheus + Grafana 监控系统,实现指标采集、数据存储、可视化展示和告警通知的完整链路。

为什么选择 Prometheus + Grafana?

市面上的监控方案不少,为什么 Prometheus + Grafana 是目前最流行的组合?

Prometheus 的核心优势:

  • Pull 模型:主动拉取指标数据,无需在被监控端安装复杂 Agent
  • 强大的查询语言 PromQL:支持灵活的聚合、过滤和数学运算
  • 时间序列数据库:原生高性能时序存储,压缩率极高
  • 服务发现:自动发现 Kubernetes、Docker 等环境中的服务
  • 告警引擎 Alertmanager:支持多渠道、分组、静默等高级告警功能

Grafana 的核心优势:

  • 美观的仪表盘:开箱即用的图表组件,支持热力图、仪表盘等
  • 多数据源支持:同时接入 Prometheus、InfluxDB、MySQL 等
  • 灵活的告警:基于面板阈值的可视化告警配置
  • 丰富的插件生态:数百种社区插件扩展功能

两者结合,就是目前云原生监控的事实标准。

环境准备

本文基于 Linux 环境演示,推荐使用 Docker Compose 部署,降低环境依赖。你需要准备:

  • 一台 Linux 服务器(2核4G以上配置)
  • Docker 和 Docker Compose 已安装
  • 基本的命令行操作能力

创建项目目录

BASH
mkdir -p /opt/monitoring/{prometheus,grafana,alertmanager}
cd /opt/monitoring

第一步:部署 Prometheus

编写配置文件

Prometheus 的核心是 prometheus.yml 配置文件,定义了数据采集的目标和规则。

YAML
# prometheus/prometheus.yml
global:
  scrape_interval: 15s      # 全局采集间隔
  evaluation_interval: 15s   # 规则评估间隔

# 告警规则文件
rule_files:
  - "alert_rules.yml"

# Alertmanager 配置
alerting:
  alertmanagers:
    - static_configs:
        - targets:
            - alertmanager:9093

# 采集目标配置
scrape_configs:
  # Prometheus 自身监控
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']

  # Node Exporter - 系统指标
  - job_name: 'node-exporter'
    static_configs:
      - targets: ['node-exporter:9100']
        labels:
          instance: 'main-server'

编写告警规则

YAML
# prometheus/alert_rules.yml
groups:
  - name: system_alerts
    rules:
      # CPU 使用率过高
      - alert: HighCpuUsage
        expr: 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "CPU 使用率超过 80%"
          description: "实例 CPU 使用率已达 {{ $value }}%"

      # 内存使用率过高
      - alert: HighMemoryUsage
        expr: (1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100 > 85
        for: 5m
        labels:
          severity: critical
        annotations:
          summary: "内存使用率超过 85%"

      # 磁盘使用率过高
      - alert: HighDiskUsage
        expr: (1 - node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"}) * 100 > 90
        for: 5m
        labels:
          severity: critical
        annotations:
          summary: "根分区磁盘使用率超过 90%"

      # 服务宕机
      - alert: ServiceDown
        expr: up == 0
        for: 1m
        labels:
          severity: critical
        annotations:
          summary: "服务不可用"
          description: "任务 {{ $labels.job }} 的目标已不可达"

配置 Alertmanager

Alertmanager 是 Prometheus 的告警通知组件,负责接收告警并分发到不同渠道。

YAML
# alertmanager/alertmanager.yml
global:
  resolve_timeout: 5m

route:
  group_by: ['alertname', 'severity']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 4h
  receiver: 'default'

receivers:
  - name: 'default'
    webhook_configs:
      - url: 'http://localhost:8060/dingtalk/webhook/send'
        send_resolved: true

第二步:编写 Docker Compose

YAML
# docker-compose.yml
# version 字段在 Docker Compose v2 中已废弃,可省略

services:
  prometheus:
    image: prom/prometheus:latest
    container_name: prometheus
    restart: unless-stopped
    ports:
      - "9090:9090"
    volumes:
      - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml:ro
      - ./prometheus/alert_rules.yml:/etc/prometheus/alert_rules.yml:ro
      - prometheus_data:/prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.path=/prometheus'
      - '--storage.tsdb.retention.time=30d'
      - '--web.enable-lifecycle'
    networks:
      - monitoring

  node-exporter:
    image: prom/node-exporter:latest
    container_name: node-exporter
    restart: unless-stopped
    ports:
      - "9100:9100"
    volumes:
      - /proc:/host/proc:ro
      - /sys:/host/sys:ro
      - /:/rootfs:ro
    command:
      - '--path.procfs=/host/proc'
      - '--path.sysfs=/host/sys'
      - '--path.rootfs=/rootfs'
    networks:
      - monitoring

  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    restart: unless-stopped
    ports:
      - "3000:3000"
    environment:
      - GF_SECURITY_ADMIN_USER=admin
      - GF_SECURITY_ADMIN_PASSWORD=admin123
      - GF_INSTALL_PLUGINS=grafana-clock-panel,grafana-piechart-panel
    volumes:
      - grafana_data:/var/lib/grafana
    networks:
      - monitoring
    depends_on:
      - prometheus

  alertmanager:
    image: prom/alertmanager:latest
    container_name: alertmanager
    restart: unless-stopped
    ports:
      - "9093:9093"
    volumes:
      - ./alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml:ro
    command:
      - '--config.file=/etc/alertmanager/alertmanager.yml'
    networks:
      - monitoring

volumes:
  prometheus_data:
  grafana_data:

networks:
  monitoring:
    driver: bridge

第三步:启动服务

BASH
cd /opt/monitoring

# 拉取镜像
docker compose pull

# 启动所有服务
docker compose up -d

# 查看运行状态
docker compose ps

# 查看日志确认启动正常
docker compose logs -f prometheus

启动后你应该能看到四个容器都在正常运行。分别访问以下地址验证:

服务 端口 用途
Prometheus 9090 查询指标、查看告警规则
Grafana 3000 可视化仪表盘
Alertmanager 9093 告警管理
Node Exporter 9100 原始指标数据

第四步:配置 Grafana

添加 Prometheus 数据源

  1. 登录 Grafana(默认账号 admin,首次登录会要求修改密码)
  2. 点击左侧菜单 Configuration → Data Sources → Add data source
  3. 选择 Prometheus
  4. 在 URL 栏填入:http://prometheus:9090
  5. 点击 Save & Test,看到绿色提示表示连接成功

导入 Node Exporter 仪表盘

Grafana 社区有大量现成的仪表盘模板,推荐使用经典的 Node Exporter Full 面板:

  1. 点击左侧菜单 Dashboards → Import
  2. 输入 Dashboard ID:1860(Node Exporter Full)
  3. 点击 Load
  4. 选择刚才创建的 Prometheus 数据源
  5. 点击 Import

瞬间你就拥有了一个专业的系统监控面板!包含 CPU、内存、磁盘、网络等几十个指标的精美图表。

常用 PromQL 查询

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

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

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

-- 网络入站流量(MB/s)
rate(node_network_receive_bytes_total{device="eth0"}[5m]) / 1024 / 1024

-- 系统负载
node_load1
node_load5

第五步:验证告警

在 Prometheus Web 界面中:

  1. 访问 Status → Rules 查看已加载的告警规则
  2. 访问 Alerts 页面查看当前告警状态
  3. 可以临时修改阈值来测试告警是否正常触发

常见问题排查

Prometheus 无法启动

BASH
# 检查配置文件语法
docker run --rm -v $(pwd)/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml   prom/prometheus:latest promtool check config /etc/prometheus/prometheus.yml

# 查看详细日志
docker compose logs prometheus

Grafana 无法连接 Prometheus

最常见的原因是网络名称配置错误。Docker Compose 创建的网络中,服务之间通过服务名(如 prometheus)互相访问,而不是 localhost

BASH
# 检查网络连接
docker exec grafana ping prometheus

# 确认 Prometheus 容器正常运行
docker exec grafana curl -s http://prometheus:9090/-/healthy

告警不触发

BASH
# 检查告警规则语法
docker run --rm -v $(pwd)/prometheus/alert_rules.yml:/etc/prometheus/alert_rules.yml   prom/prometheus:latest promtool check rules /etc/prometheus/alert_rules.yml

# 热加载配置(无需重启)
curl -X POST http://localhost:9090/-/reload

进阶方向

掌握了基础搭建后,可以从以下方向继续深入:

  1. 多节点监控:在更多服务器部署 Node Exporter,统一接入 Prometheus
  2. Docker 容器监控:使用 cAdvisor 采集容器级别的 CPU、内存、网络指标
  3. 数据库监控:部署 PostgreSQL Exporter 或 Redis Exporter,监控数据库性能
  4. 告警渠道对接:通过 Alertmanager Webhook 对接钉钉、企业微信、Telegram
  5. Grafana 告警:利用 Grafana 8+ 的统一告警功能,在面板上直接配置阈值告警
  6. 长期存储:使用 Thanos 或 VictoriaMetrics 实现 Prometheus 的长期存储和高可用

总结

Prometheus + Grafana 是目前最成熟、最流行的开源监控方案。通过本文的步骤,你已经完成了:

  • Prometheus 数据采集与存储配置
  • Node Exporter 系统指标暴露
  • Alertmanager 告警规则与通知配置
  • Grafana 可视化仪表盘搭建
  • 常见故障排查方法

监控系统不是搭完就结束了,它的价值在于持续运营。建议根据实际业务需求,逐步完善告警规则、优化仪表盘、扩展监控覆盖范围。一个好的监控系统,是你的基础设施"第七感"——在问题发生之前,你就能感知到它的存在。

评论