Prometheus + Grafana 云原生监控体系搭建

FreeGuideOnline 最新 2026-06-12

Prometheus 监控与 Grafana 告警实战指南

引言

在现代云原生架构中,可观测性是不可或缺的一环。Prometheus 作为指标采集与告警领域的标准,配合 Grafana 强大的可视化能力,能够帮助我们构建一套完整的监控体系。本教程将从零开始,手把手带你完成 Prometheus + Grafana 的搭建,并实现指标采集、仪表板展示和告警通知。

基础环境准备

在开始之前,请确保你已具备以下条件:

  • 一台 Linux 服务器(本教程以 Ubuntu 20.04 为例)
  • Docker 与 Docker Compose 已安装(我们将使用容器化部署)
  • 基础的 YAML 和命令行操作能力

安装 Docker 与 Docker Compose

# 更新包索引并安装依赖
sudo apt update
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common

# 添加 Docker 官方 GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# 设置稳定版仓库
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list

# 安装 Docker
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io

# 将当前用户加入 docker 组(可选,避免每次使用 sudo)
sudo usermod -aG docker $USER
newgrp docker

# 安装 Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

Prometheus 部署与配置

编写 Prometheus 配置文件

新建一个工作目录 prometheus-grafana,并在其中创建 prometheus.yml

mkdir prometheus-grafana && cd prometheus-grafana

编辑 prometheus.yml

global:
  scrape_interval: 15s      # 采集间隔
  evaluation_interval: 15s  # 规则评估间隔

alerting:
  alertmanagers:
    - static_configs:
        - targets: ['alertmanager:9093']  # 后续将使用 Alertmanager

rule_files:
  - "rules/*.yml"           # 告警规则文件路径

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']

  - job_name: 'node_exporter'
    static_configs:
      - targets: ['node-exporter:9100']   # 采集宿主机指标

说明scrape_configs 中定义了采集目标,这里先保留两个基础任务:监控 Prometheus 自身,以及通过 Node Exporter 采集系统指标。

使用 Docker Compose 运行 Prometheus

创建 docker-compose.yml

version: '3.8'
services:
  prometheus:
    image: prom/prometheus:latest
    container_name: prometheus
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
      - ./rules:/etc/prometheus/rules   # 告警规则目录
      - prometheus_data:/prometheus     # 持久化数据
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.path=/prometheus'
      - '--web.console.libraries=/etc/prometheus/console_libraries'
      - '--web.console.templates=/etc/prometheus/consoles'
      - '--web.enable-lifecycle'        # 允许热加载配置
    ports:
      - "9090:9090"
    networks:
      - monitor

  node-exporter:
    image: prom/node-exporter:latest
    container_name: node-exporter
    volumes:
      - /proc:/host/proc:ro
      - /sys:/host/sys:ro
      - /:/rootfs:ro
    command:
      - '--path.procfs=/host/proc'
      - '--path.sysfs=/host/sys'
      - '--path.rootfs=/rootfs'
      - '--collector.filesystem.ignored-mount-points=^/(sys|proc|dev|host|etc)($$|/)'
    ports:
      - "9100:9100"
    networks:
      - monitor

volumes:
  prometheus_data:

networks:
  monitor:
    driver: bridge

启动服务:

mkdir rules   # 创建规则目录(暂时为空)
docker-compose up -d

验证:访问 http://<服务器IP>:9090,查看 Targets 页面,确认 Prometheus 和 node-exporter 均为 UP 状态。

Grafana 安装与数据源配置

添加 Grafana 服务

docker-compose.yml 中追加 Grafana 服务:

  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=admin   # 初始管理员密码
      - GF_USERS_ALLOW_SIGN_UP=false
    volumes:
      - grafana_data:/var/lib/grafana
    ports:
      - "3000:3000"
    networks:
      - monitor

同时在 volumes 中添加 grafana_data:,然后重新启动容器:

docker-compose up -d

配置 Prometheus 数据源

  1. 浏览器访问 http://<服务器IP>:3000,使用 admin/admin 登录(首次登录会要求修改密码)。
  2. 左侧菜单选择 ConfigurationData SourcesAdd data source
  3. 选择 Prometheus,在 URL 栏填入 http://prometheus:9090(容器内网络通信)。
  4. 点击 Save & Test,看到绿色提示即表示成功。

导入节点监控仪表板

Grafana 提供了丰富的社区仪表板,我们可以直接导入一个现成的 Node Exporter 仪表板。

  1. 在 Grafana 左侧菜单点击 +Import
  2. 输入仪表板 ID 1860(Node Exporter Full 仪表板),点击 Load
  3. 在 Options 中选择刚刚添加的 Prometheus 数据源。
  4. 点击 Import,即可看到完整的系统监控面板。

现在你可以实时查看 CPU、内存、磁盘、网络等指标,熟悉这些图表后,我们可以进入告警环节。

编写 Prometheus 告警规则

告警规则定义了触发告警的条件。我们在 rules 目录下创建 node_alerts.yml

vim rules/node_alerts.yml

内容示例:

groups:
- name: node_alerts
  rules:
  - alert: HighCPUUsage
    expr: 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
    for: 2m
    labels:
      severity: warning
    annotations:
      summary: "CPU usage is above 80% on {{ $labels.instance }}"
      description: "CPU usage has been above 80% for more than 2 minutes. Current value: {{ $value }}%"

  - alert: LowDiskSpace
    expr: (node_filesystem_avail_bytes{fstype!="tmpfs"} / node_filesystem_size_bytes{fstype!="tmpfs"}) * 100 < 15
    for: 5m
    labels:
      severity: critical
    annotations:
      summary: "Disk space is low on {{ $labels.instance }}"
      description: "Available disk space is below 15% on mountpoint {{ $labels.mountpoint }}. Current available: {{ $value }}%"

  - alert: InstanceDown
    expr: up == 0
    for: 1m
    labels:
      severity: critical
    annotations:
      summary: "Instance {{ $labels.instance }} is down"
      description: "The monitored target has been down for more than 1 minute."

保存后,热加载 Prometheus 配置:

docker exec -it prometheus kill -HUP 1

在 Prometheus 的 Alerts 页面可以查看已加载的规则及其状态。

Alertmanager 部署与配置

Prometheus 仅负责触发告警,真正的通知分发由 Alertmanager 完成。

添加 Alertmanager 服务

docker-compose.yml 中新增:

  alertmanager:
    image: prom/alertmanager:latest
    container_name: alertmanager
    volumes:
      - ./alertmanager.yml:/etc/alertmanager/alertmanager.yml
      - alertmanager_data:/alertmanager
    command:
      - '--config.file=/etc/alertmanager/alertmanager.yml'
      - '--storage.path=/alertmanager'
    ports:
      - "9093:9093"
    networks:
      - monitor

并在 volumes 中声明 alertmanager_data:

编写 Alertmanager 配置文件

创建 alertmanager.yml

global:
  smtp_smarthost: 'smtp.example.com:587'
  smtp_from: 'alert@example.com'
  smtp_auth_username: 'alert@example.com'
  smtp_auth_password: 'your_password'
  smtp_require_tls: true

route:
  receiver: 'team-email'
  group_by: ['alertname', 'severity']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 3h

receivers:
- name: 'team-email'
  email_configs:
  - to: 'devops@example.com'
    send_resolved: true

inhibit_rules:
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['alertname']

注意:请替换为真实的 SMTP 信息。若仅测试,可暂时使用简单的日志接收器,或集成 Webhook 通知(如钉钉、企业微信)。

启动容器组:

docker-compose up -d

验证告警链路

  1. 手动停掉 node-exporter 容器:docker stop node-exporter
  2. 等待约 1 分钟后,在 Prometheus Alerts 页面看到 InstanceDown 变为 Firing 状态。
  3. 登录 Alertmanager 界面(http://<IP>:9093)可看到告警已接收。
  4. 若配置了邮件,你会收到告警通知;当服务恢复后,还会收到 resolved 邮件。

Grafana 告警集成(可选替代方案)

除了使用 Prometheus + Alertmanager 外,Grafana 自身也支持直接基于仪表板数据配置告警通道。适合希望在同一平台内完成所有配置的小团队。

配置 Grafana 告警通道

  1. 进入 AlertingNotification channelsAdd channel
  2. 选择类型(如 Email 或 Webhook),填写必要参数并保存。

在面板上创建告警

  1. 编辑已有面板,切换到 Alert 选项卡。
  2. 设置 Evaluate everyFor 时间,定义条件(如 avg() of query(A, 5m, now) is above 80)。
  3. 选择上方创建的通知通道,并填入告警总结和描述。
  4. 保存仪表板,告警即刻生效。

这种方法无需修改 Prometheus 规则,但告警生命周期管理较弱,复杂场景仍建议使用 Prometheus + Alertmanager。

进阶扩展建议

  • 服务发现:当监控容器或 Kubernetes 时,使用基于 Consul、Kubernetes 的 SD 配置,避免手动维护 targets。
  • 联邦与长期存储:对于大规模集群,可通过联邦(federation)汇总数据,并考虑 Thanos 或 VictoriaMetrics 实现长期存储和高可用。
  • 更加丰富的导出器:部署 Blackbox Exporter(HTTP/TCP 探测)、cAdvisor(容器监控)、Mysqld Exporter 等,覆盖全栈监控。

总结

至此,你已成功搭建了一套云原生监控体系:Prometheus 负责采集与告警,Grafana 呈现可视化仪表板,Alertmanager 管理通知路由。这套组合足以应对绝大多数中小型系统的监控需求。下一步可以根据生产环境优化规则阈值、接入自定义指标,并沉淀出符合团队习惯的运维面板。