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 已安装
- 基本的命令行操作能力
创建项目目录
mkdir -p /opt/monitoring/{prometheus,grafana,alertmanager}
cd /opt/monitoring第一步:部署 Prometheus
编写配置文件
Prometheus 的核心是 prometheus.yml 配置文件,定义了数据采集的目标和规则。
# 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'编写告警规则
# 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 的告警通知组件,负责接收告警并分发到不同渠道。
# 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
# 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第三步:启动服务
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 数据源
- 登录 Grafana(默认账号
admin,首次登录会要求修改密码) - 点击左侧菜单 Configuration → Data Sources → Add data source
- 选择 Prometheus
- 在 URL 栏填入:
http://prometheus:9090 - 点击 Save & Test,看到绿色提示表示连接成功
导入 Node Exporter 仪表盘
Grafana 社区有大量现成的仪表盘模板,推荐使用经典的 Node Exporter Full 面板:
- 点击左侧菜单 Dashboards → Import
- 输入 Dashboard ID:1860(Node Exporter Full)
- 点击 Load
- 选择刚才创建的 Prometheus 数据源
- 点击 Import
瞬间你就拥有了一个专业的系统监控面板!包含 CPU、内存、磁盘、网络等几十个指标的精美图表。
常用 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 界面中:
- 访问 Status → Rules 查看已加载的告警规则
- 访问 Alerts 页面查看当前告警状态
- 可以临时修改阈值来测试告警是否正常触发
常见问题排查
Prometheus 无法启动
# 检查配置文件语法
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 prometheusGrafana 无法连接 Prometheus
最常见的原因是网络名称配置错误。Docker Compose 创建的网络中,服务之间通过服务名(如 prometheus)互相访问,而不是 localhost。
# 检查网络连接
docker exec grafana ping prometheus
# 确认 Prometheus 容器正常运行
docker exec grafana curl -s http://prometheus:9090/-/healthy告警不触发
# 检查告警规则语法
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进阶方向
掌握了基础搭建后,可以从以下方向继续深入:
- 多节点监控:在更多服务器部署 Node Exporter,统一接入 Prometheus
- Docker 容器监控:使用 cAdvisor 采集容器级别的 CPU、内存、网络指标
- 数据库监控:部署 PostgreSQL Exporter 或 Redis Exporter,监控数据库性能
- 告警渠道对接:通过 Alertmanager Webhook 对接钉钉、企业微信、Telegram
- Grafana 告警:利用 Grafana 8+ 的统一告警功能,在面板上直接配置阈值告警
- 长期存储:使用 Thanos 或 VictoriaMetrics 实现 Prometheus 的长期存储和高可用
总结
Prometheus + Grafana 是目前最成熟、最流行的开源监控方案。通过本文的步骤,你已经完成了:
- Prometheus 数据采集与存储配置
- Node Exporter 系统指标暴露
- Alertmanager 告警规则与通知配置
- Grafana 可视化仪表盘搭建
- 常见故障排查方法
监控系统不是搭完就结束了,它的价值在于持续运营。建议根据实际业务需求,逐步完善告警规则、优化仪表盘、扩展监控覆盖范围。一个好的监控系统,是你的基础设施"第七感"——在问题发生之前,你就能感知到它的存在。
评论
游客无需注册即可评论。
你提交的昵称、邮箱、网址和评论内容会保存在服务端,用于展示评论身份、接收回复及必要的安全审计。
浏览器会本地保存已填游客信息和评论草稿,方便下次免填。
回复提醒会通过站内消息和邮件通知。