Prometheus + Grafana 云原生监控体系搭建
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 数据源
- 浏览器访问
http://<服务器IP>:3000,使用admin/admin登录(首次登录会要求修改密码)。 - 左侧菜单选择 Configuration → Data Sources → Add data source。
- 选择 Prometheus,在 URL 栏填入
http://prometheus:9090(容器内网络通信)。 - 点击 Save & Test,看到绿色提示即表示成功。
导入节点监控仪表板
Grafana 提供了丰富的社区仪表板,我们可以直接导入一个现成的 Node Exporter 仪表板。
- 在 Grafana 左侧菜单点击 + → Import。
- 输入仪表板 ID
1860(Node Exporter Full 仪表板),点击 Load。 - 在 Options 中选择刚刚添加的 Prometheus 数据源。
- 点击 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
验证告警链路
- 手动停掉 node-exporter 容器:
docker stop node-exporter - 等待约 1 分钟后,在 Prometheus Alerts 页面看到
InstanceDown变为 Firing 状态。 - 登录 Alertmanager 界面(
http://<IP>:9093)可看到告警已接收。 - 若配置了邮件,你会收到告警通知;当服务恢复后,还会收到 resolved 邮件。
Grafana 告警集成(可选替代方案)
除了使用 Prometheus + Alertmanager 外,Grafana 自身也支持直接基于仪表板数据配置告警通道。适合希望在同一平台内完成所有配置的小团队。
配置 Grafana 告警通道
- 进入 Alerting → Notification channels → Add channel。
- 选择类型(如 Email 或 Webhook),填写必要参数并保存。
在面板上创建告警
- 编辑已有面板,切换到 Alert 选项卡。
- 设置 Evaluate every 和 For 时间,定义条件(如
avg() of query(A, 5m, now) is above 80)。 - 选择上方创建的通知通道,并填入告警总结和描述。
- 保存仪表板,告警即刻生效。
这种方法无需修改 Prometheus 规则,但告警生命周期管理较弱,复杂场景仍建议使用 Prometheus + Alertmanager。
进阶扩展建议
- 服务发现:当监控容器或 Kubernetes 时,使用基于 Consul、Kubernetes 的 SD 配置,避免手动维护 targets。
- 联邦与长期存储:对于大规模集群,可通过联邦(federation)汇总数据,并考虑 Thanos 或 VictoriaMetrics 实现长期存储和高可用。
- 更加丰富的导出器:部署 Blackbox Exporter(HTTP/TCP 探测)、cAdvisor(容器监控)、Mysqld Exporter 等,覆盖全栈监控。
总结
至此,你已成功搭建了一套云原生监控体系:Prometheus 负责采集与告警,Grafana 呈现可视化仪表板,Alertmanager 管理通知路由。这套组合足以应对绝大多数中小型系统的监控需求。下一步可以根据生产环境优化规则阈值、接入自定义指标,并沉淀出符合团队习惯的运维面板。