当服务器上跑着多个自动化脚本时,单纯依赖系统报错日志来进行运维,无异于”瞎子摸象”。你不知道 CPU 是在凌晨几点开始飙升的,也不知道那 4GB 的内存是被哪个僵尸进程吃干抹净的。

今天,我们利用业界最流行的开源可观测性组合——Prometheus + Grafana,用几行 Docker 代码,为服务器装配上一套专属的监控”天网”。

什么是 Prometheus + Grafana?

  • Prometheus:时序数据库 + 数据采集引擎。定期从各种目标(Exporter)拉取指标数据并存储。
  • Grafana:数据可视化平台。连接 Prometheus 作为数据源,将枯燥的数字转化为漂亮的仪表盘。
  • Node Exporter:安装在每台被监控服务器上的代理,暴露 CPU、内存、磁盘、网络等系统指标。

三者关系:Node Exporter 产出数据 → Prometheus 采集存储 → Grafana 可视化展示

一键部署:Docker Compose 全栈

创建 docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
version: "3.8"
services:
prometheus:
image: prom/prometheus:latest
container_name: prometheus
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus_data:/prometheus
ports:
- "9090:9090"
restart: always

grafana:
image: grafana/grafana:latest
container_name: grafana
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin
volumes:
- grafana_data:/var/lib/grafana
ports:
- "3000:3000"
restart: always
depends_on:
- prometheus

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"
ports:
- "9100:9100"
restart: always

volumes:
prometheus_data:
grafana_data:

对应的 prometheus.yml 配置:

1
2
3
4
5
6
7
8
global:
scrape_interval: 15s
evaluation_interval: 15s

scrape_configs:
- job_name: "node"
static_configs:
- targets: ["node-exporter:9100"]

docker-compose up -d 一键启动,Prometheus 在 9090 端口,Grafana 在 3000 端口。

核心监控指标解读

指标 PromQL 查询 含义
CPU 使用率 100 - (avg(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) 整体 CPU 占用
内存使用率 (1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100 可用内存占比
磁盘使用率 (1 - (node_filesystem_avail_bytes / node_filesystem_size_bytes)) * 100 各挂载点使用率
网络流量 rate(node_network_receive_bytes_total[5m]) 每秒入站流量
系统负载 node_load1 / node_load5 / node_load15 1/5/15 分钟平均负载

Grafana 仪表盘导入

Grafana 官方市场有大量现成的仪表盘模板,无需从零搭建:

  1. 登录 Grafana(默认 http://your-ip:3000,账号 admin)
  2. 添加 Prometheus 数据源(URL 填 http://prometheus:9090
  3. 进入 Dashboard → Import,输入模板 ID 1860(最流行的 Node Exporter 仪表盘)
  4. 瞬间获得一套专业级监控大盘 — CPU 曲线、内存趋势、磁盘 I/O、网络吞吐量一目了然

Grafana 的仪表盘高度可定制。你可以自由拖拽面板、调整时间范围、设置自动刷新间隔。最关键的是,它可以嵌入到其他页面中(通过 iframe),让你在自建的运维面板中统一查看所有服务的健康状态。

告警规则配置

光看大盘还不够,关键是出问题时能自动通知你。创建 alert_rules.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
groups:
- name: server_alerts
rules:
- alert: HighCPUUsage
expr: 100 - (avg(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
for: 5m
labels:
severity: warning
annotations:
summary: "服务器 CPU 使用率超过 80%(持续 5 分钟)"

- alert: DiskAlmostFull
expr: (1 - (node_filesystem_avail_bytes{fstype!=""} / node_filesystem_size_bytes)) * 100 > 90
for: 1m
labels:
severity: critical
annotations:
summary: "磁盘使用率超过 90%,立即处理!"

- alert: OutOfMemory
expr: (1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100 > 95
for: 2m
labels:
severity: critical
annotations:
summary: "内存即将耗尽"

prometheus.yml 中挂载这个规则文件:

1
2
rule_files:
- "alert_rules.yml"

配合 Alertmanager 可以将告警发送到企业微信、钉钉或邮件——这样你就不需要 24 小时盯着屏幕了。

应用级监控扩展

除了系统级指标,你还可以为特定应用添加 Exporter:

  • Nginxnginx-prometheus-exporter 监控请求量、响应时间、状态码分布
  • MySQLmysqld_exporter 监控查询速率、连接数、慢查询
  • Redisredis_exporter 监控命中率、内存使用、键过期
  • Docker:cAdvisor(Google 出品)监控每个容器的 CPU/内存/网络

把这些 Exporter 的 target 加入 Prometheus 的 scrape_configs,就能在一张 Grafana 大盘上看到整个技术栈的全貌。

总结

Prometheus + Grafana 是运维领域的事实标准组合。三小时部署,终身受益。从”瞎子摸象”到”了如指掌”,差的只是一套监控体系。而且整套方案开源免费,没有任何 license 费用——对于个人服务器和中小团队来说,性价比无敌。