基于Prometheus和Grafana的服务器监控系统搭建
基于Prometheus和Grafana的服务器监控系统搭建
从零搭建企业级监控告警平台,实时掌握服务器性能与业务健康状态
引言
服务器一旦上线,如何及时发现CPU爆满、磁盘将满、服务宕机?传统方式是人肉top、df -h,效率低且无法回溯。本项目建设了一套开源监控解决方案:使用Prometheus采集服务器指标,Grafana展示可视化仪表盘,并配置Alertmanager实现邮件/钉钉告警。通过这个项目,我掌握了监控系统的设计思路、指标采集原理以及告警规则配置,具备初级运维开发(SRE)的实操能力。
建议配图:整体架构图(Node Exporter → Prometheus → Grafana + Alertmanager → 告警通知)
一、项目环境准备
1.1 组件说明
组件 作用 端口
Node Exporter 采集服务器硬件指标(CPU、内存、磁盘、网络) 9100
Prometheus 存储时序数据,执行告警规则 9090
Grafana 可视化仪表盘,查询展示指标 3000
Alertmanager 管理告警,发送通知(邮件、钉钉等) 9093
1.2 环境要求
· 一台Linux服务器(Ubuntu 22.04,也可以是你的VPS)
· 开放端口:9100、9090、3000、9093(或通过防火墙仅允许内网/特定IP访问)
建议配图:服务器基础信息截图(uname -a、lsb_release -a)
二、安装与配置Node Exporter
Node Exporter负责暴露服务器指标给Prometheus抓取。
2.1 下载并运行
# 下载最新版(以1.7.0为例)
wget https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gz
tar -xzf node_exporter-1.7.0.linux-amd64.tar.gz
cd node_exporter-1.7.0.linux-amd64
# 后台运行(生产环境建议用systemd)
nohup ./node_exporter &
2.2 验证采集
访问 http://服务器IP:9100/metrics,应看到大量以node_开头的指标文本。
建议配图:浏览器访问metrics页面的截图,展示部分指标
2.3 使用systemd管理(推荐)
创建服务文件 /etc/systemd/system/node_exporter.service:
[Unit]
Description=Node Exporter
After=network.target
[Service]
User=nobody
ExecStart=/usr/local/bin/node_exporter
Restart=always
[Install]
WantedBy=multi-user.target
启动并设置开机自启:
sudo systemctl daemon-reload
sudo systemctl start node_exporter
sudo systemctl enable node_exporter
三、安装与配置Prometheus
3.1 下载并解压
wget https://github.com/prometheus/prometheus/releases/download/v2.51.0/prometheus-2.51.0.linux-amd64.tar.gz
tar -xzf prometheus-2.51.0.linux-amd64.tar.gz
mv prometheus-2.51.0.linux-amd64 /opt/prometheus
3.2 配置抓取任务
编辑 /opt/prometheus/prometheus.yml:
global:
scrape_interval: 15s # 每15秒采集一次
scrape_configs:
- job_name: 'node'
static_configs:
- targets: ['localhost:9100'] # 如果是多台服务器,用逗号分隔
3.3 运行Prometheus
/opt/prometheus/prometheus --config.file=/opt/prometheus/prometheus.yml --web.listen-address=:9090 &
访问 http://服务器IP:9090,在Status → Targets中看到node状态为UP即成功。
建议配图:Prometheus Targets界面截图,显示UP状态
四、安装与配置Grafana
4.1 安装Grafana
使用官方APT源(Ubuntu):
sudo apt-get install -y software-properties-common
sudo add-apt-repository "deb https://packages.grafana.com/oss/deb stable main"
sudo apt-get update
sudo apt-get install grafana -y
sudo systemctl start grafana-server
sudo systemctl enable grafana-server
4.2 添加Prometheus数据源
- 访问 http://服务器IP:3000,默认用户名/密码:admin/admin,强制修改密码。
- 左侧菜单:Configuration → Data Sources → Add data source → Prometheus。
- URL填写 http://localhost:9090,保存并测试。
4.3 导入仪表盘模板
Grafana官网有大量现成模板。推荐Node Exporter专用模板ID:1860。
· 左侧菜单:Dashboards → Import → 输入1860 → Load
· 选择Prometheus数据源 → Import
几秒后即可看到CPU、内存、磁盘、网络流量的精美图表。
建议配图:Grafana仪表盘截图,展示多个图表(CPU、内存、磁盘)
五、配置Alertmanager告警
5.1 安装Alertmanager
wget https://github.com/prometheus/alertmanager/releases/download/v0.26.0/alertmanager-0.26.0.linux-amd64.tar.gz
tar -xzf alertmanager-0.26.0.linux-amd64.tar.gz
mv alertmanager-0.26.0.linux-amd64 /opt/alertmanager
5.2 配置邮件告警(示例:使用QQ邮箱SMTP)
编辑 /opt/alertmanager/alertmanager.yml:
global:
smtp_smarthost: 'smtp.qq.com:465'
smtp_from: '你的QQ号@qq.com'
smtp_auth_username: '你的QQ号@qq.com'
smtp_auth_password: '授权码'
smtp_require_tls: false
route:
group_by: ['alertname']
receiver: 'email'
receivers:
- name: 'email'
email_configs:
- to: '接收邮箱@example.com'
5.3 在Prometheus中添加告警规则
创建告警规则文件 /opt/prometheus/alerts.yml:
groups:
- name: node_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使用率过高"
description: "服务器 {{ $labels.instance }} CPU使用率超过80%"
- alert: DiskSpaceLow
expr: (node_filesystem_free_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"}) * 100 < 10
for: 2m
labels:
severity: critical
annotations:
summary: "磁盘空间不足"
description: "根分区剩余空间不足10%"
修改 prometheus.yml,加入:
rule_files:
- "alerts.yml"
alerting:
alertmanagers:
- static_configs:
- targets: ['localhost:9093']
重启Prometheus,访问Alerts页面可看到规则。
建议配图:Prometheus Alerts页面截图,展示规则状态(Inactive/Pending/Firing)
六、进阶:接入钉钉告警(Webhook)
Alertmanager支持Webhook,可以对接钉钉机器人。
- 在钉钉群添加自定义机器人,获取Webhook URL。
- 编写一个简单的Python脚本将Alertmanager告警转发到钉钉,或使用开源工具prometheus-webhook-dingtalk。
# 下载并运行 prometheus-webhook-dingtalk
wget https://github.com/timonwong/prometheus-webhook-dingtalk/releases/download/v2.1.0/prometheus-webhook-dingtalk-2.1.0.linux-amd64.tar.gz
tar -xzf prometheus-webhook-dingtalk-2.1.0.linux-amd64.tar.gz
./prometheus-webhook-dingtalk --ding.profile="webhook1=钉钉机器人URL"
修改Alertmanager配置,增加webhook receiver。

建议配图:
七、排错记录(Troubleshooting)
问题1:Prometheus无法抓取Node Exporter指标
现象:Targets页面显示DOWN。
原因:防火墙未开放9100端口,或Node Exporter未启动。
解决:
# 检查Node Exporter是否运行
ps aux | grep node_exporter
# 检查端口监听
netstat -tlnp | grep 9100
# 开放防火墙(如果有ufw)
ufw allow 9100/tcp
问题2:Grafana导入仪表盘后无数据
现象:图表显示“No data”。
原因:数据源选择错误,或Prometheus中指标名称与仪表盘不匹配(不同版本的Node Exporter指标名可能略有差异)。
解决:在Grafana的Explore中查询node_cpu_seconds_total,确认有数据。若没有,检查Node Exporter版本,或改用更新的仪表盘模板(如16098)。
问题3:告警一直处于Pending状态
现象:CPU已超过80%,但状态仍为Pending。
原因:告警规则中设置了for: 5m,需要持续5分钟才触发。这是为了防止瞬时波动误报。
解决:可以调低for时间测试,但生产环境保持合理阈值。
建议配图:Prometheus Alerts页面中Pending状态的截图
八、成果与总结
最终交付物
· 一套完整的监控告警系统,实时采集服务器CPU、内存、磁盘、网络等指标
· Grafana可视化仪表盘,直观展示历史趋势和实时负载
· 配置了CPU高负载和磁盘空间告警,并通过邮件/钉钉自动通知
· 编写了部署文档和故障排查记录
掌握的技能
· Prometheus时序数据库的基本使用和PromQL查询
· Node Exporter指标采集原理
· Grafana仪表盘创建与数据源配置
· Alertmanager告警规则编写与通知集成
· 服务器运维:systemd服务管理、防火墙配置、进程守护
项目扩展(简历溢价点)
· 监控多台服务器:在prometheus.yml的targets中加入多个IP:9100
· 使用mysqld_exporter、redis_exporter监控中间件
· 对接Grafana的Alerting(新版内置告警)替代Alertmanager
· 将全部组件容器化(Docker Compose一键部署)
项目地址
(可放GitHub仓库,包含docker-compose.yml、告警规则文件等)
写在最后
监控是运维的眼睛。通过这个项目,我从“被动处理故障”转变为“主动发现隐患”,真正理解了可观测性的价值。Prometheus + Grafana已经是云原生时代的标配,掌握它们无论对求职还是实际工作都很有帮助。如果你也想搭建一套属于自己的监控系统,按照本文操作即可。