Prometheus + Grafana 监控体系搭建:从安装到仪表盘实战
Prometheus + Grafana 是目前最流行的开源监控方案,被 Kubernetes、微服务等云原生生态广泛使用。对于个人开发者和中小公司,这套方案完全免费,而且能做到媲美商业监控产品的效果。本文从零开始搭建一套完整的监控体系。
一、监控体系架构
被监控的服务器/应用
↓ 暴露 /metrics 端点
各种 Exporter(node_exporter, mysqld_exporter 等)
↑ Prometheus 定期抓取(Pull 模式)
Prometheus Server(存储时序数据,支持 PromQL 查询)
↓
Alertmanager(告警路由:钉钉/邮件/Slack)
↓
Grafana(可视化仪表盘,订阅 Prometheus 作为数据源)
Prometheus 使用 Pull(拉取) 模式,主动从 Exporter 抓取数据,而不是等 Exporter 推送。这使得监控系统可以感知 Exporter 是否存活。
二、快速搭建(Docker Compose 版)
# compose.yaml(监控全家桶)
version: '3.9'
services:
prometheus:
image: prom/prometheus:v2.50.0
ports:
- "9090:9090"
volumes:
- ./prometheus:/etc/prometheus # 挂载配置目录
- prometheus_data:/prometheus # 持久化数据
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.retention.time=30d' # 数据保留30天
- '--web.enable-lifecycle' # 支持 HTTP API 热重载
restart: unless-stopped
grafana:
image: grafana/grafana:10.3.0
ports:
- "3000:3000"
environment:
- GF_SECURITY_ADMIN_USER=admin
- GF_SECURITY_ADMIN_PASSWORD=Admin@2026
- GF_USERS_ALLOW_SIGN_UP=false
volumes:
- grafana_data:/var/lib/grafana
restart: unless-stopped
alertmanager:
image: prom/alertmanager:v0.27.0
ports:
- "9093:9093"
volumes:
- ./alertmanager:/etc/alertmanager
restart: unless-stopped
volumes:
prometheus_data:
grafana_data:
三、Prometheus 配置文件
# prometheus/prometheus.yml
global:
scrape_interval: 15s # 每15秒抓取一次
evaluation_interval: 15s # 每15秒评估告警规则
rule_files:
- "rules/*.yml" # 告警规则文件
alerting:
alertmanagers:
- static_configs:
- targets: ['alertmanager:9093']
scrape_configs:
# 监控 Prometheus 自身
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
# 监控 Linux 主机(需要安装 node_exporter)
- job_name: 'node'
static_configs:
- targets:
- '192.168.1.10:9100' # 服务器1
- '192.168.1.11:9100' # 服务器2
labels:
env: production
# 监控 MySQL(需要安装 mysqld_exporter)
- job_name: 'mysql'
static_configs:
- targets: ['192.168.1.10:9104']
# 监控 Nginx(需要安装 nginx-vts-exporter 或 nginx_prometheus_exporter)
- job_name: 'nginx'
static_configs:
- targets: ['192.168.1.10:9113']
四、安装 Node Exporter(在每台被监控服务器上)
# 下载并安装 node_exporter
VERSION="1.7.0"
wget https://github.com/prometheus/node_exporter/releases/download/v${VERSION}/node_exporter-${VERSION}.linux-amd64.tar.gz
tar xvf node_exporter-*.tar.gz
sudo cp node_exporter-*/node_exporter /usr/local/bin/
# 创建 systemd service
sudo tee /etc/systemd/system/node_exporter.service <<EOF
[Unit]
Description=Node Exporter
[Service]
User=nobody
ExecStart=/usr/local/bin/node_exporter
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now node_exporter
# 验证(浏览器打开 http://服务器IP:9100/metrics)
curl http://localhost:9100/metrics | head -20
五、告警规则配置
# prometheus/rules/linux.yml
groups:
- name: linux_alerts
rules:
# CPU 使用率超过 80% 持续 5 分钟
- 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 使用率过高"
description: "{{ $labels.instance }} CPU 使用率为 {{ printf "%.1f" $value }}%"
# 内存使用率超过 85%
- alert: HighMemoryUsage
expr: (1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100 > 85
for: 5m
labels:
severity: warning
annotations:
summary: "服务器内存使用率过高"
description: "{{ $labels.instance }} 内存使用率为 {{ printf "%.1f" $value }}%"
# 磁盘使用率超过 80%
- alert: DiskUsageHigh
expr: (1 - (node_filesystem_avail_bytes / node_filesystem_size_bytes)) * 100 > 80
for: 5m
labels:
severity: critical
annotations:
summary: "磁盘空间不足"
description: "{{ $labels.instance }} 挂载点 {{ $labels.mountpoint }} 使用率 {{ printf "%.1f" $value }}%"
六、Grafana 配置数据源和导入仪表盘
- 登录 Grafana(http://localhost:3000,admin/Admin@2026)
- 添加数据源:Connections → Data sources → Prometheus,URL 填
http://prometheus:9090 - 导入社区仪表盘:Dashboards → Import → 输入模板 ID
| 仪表盘 | Grafana ID | 说明 |
|---|---|---|
| Node Exporter Full | 1860 | Linux 服务器全面监控 |
| MySQL Overview | 7362 | MySQL 性能监控 |
| Nginx | 9614 | Nginx 请求监控 |
| Redis Dashboard | 763 | Redis 监控 |
七、常用 PromQL 查询语句
# CPU 使用率
100 - (avg by(instance)(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
# 内存使用率(%)
(1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100
# 磁盘写入速率(MB/s)
rate(node_disk_written_bytes_total[5m]) / 1024 / 1024
# 网络入流量(Mbps)
rate(node_network_receive_bytes_total{device="eth0"}[5m]) * 8 / 1024 / 1024
# 查看某个 target 最后一次成功抓取时间
up{job="node"}
总结
Prometheus + Grafana 这套方案上手成本低、扩展性强、社区活跃。从一台服务器开始,10分钟内就能看到 CPU、内存、磁盘的实时图表和历史趋势。配置好告警规则,才能从”发现问题”升级为”预防问题”。这是个人开发者和中小团队构建监控体系的最佳起点。
