Grafana官方文档:https://grafana.com/zh-cn/grafana/
Prometheus官方文档:https://prometheus.io/docs/introduction/overview/
说起来也是机缘巧合,之前用的是Zabbix,但是那个界面...怎么说呢,就像是上个世纪的产物。后来听同事推荐说Prometheus很火,我就试了试。
Prometheus最大的优点就是它的时序数据库设计得很棒,而且采用拉取模式收集数据,这样就不用担心客户端推送数据把服务器搞挂了。再加上Grafana那个颜值爆表的仪表盘,简直就是天作之合。
我记得第一次看到Grafana的仪表盘时,那种震撼感...就像从诺基亚换到iPhone一样。老板看了都说这个监控系统看起来很专业,给我涨了工资(开玩笑的哈哈)。
我这里用的是Debian 13系统,内存4G,硬盘50G。其实配置不用太高,我之前在2G内存的机器上也跑过,就是稍微卡一点。
# 先更新一下系统
apt update && apt upgrade -y
# 安装一些必要的工具
apt install wget curl gnupg2 software-properties-common apt-transport-https ca-certificates -yDebian系统相比CentOS来说,包管理器用的是apt,而且默认没有防火墙服务,这点还是挺方便的。
去官网下载最新版本,我这里用的是3.5.0版本。下载地址:https://prometheus.io/download/
cd /opt
wget https://github.com/prometheus/prometheus/releases/download/v3.5.0/prometheus-3.5.0.linux-amd64.tar.gz
tar -xzf prometheus-3.5.0.linux-amd64.tar.gz
mv prometheus-3.5.0.linux-amd64 prometheus创建prometheus用户:
useradd --no-create-home --shell /bin/false prometheus
chown -R prometheus:prometheus /opt/prometheus配置文件我一般放在/etc/prometheus目录下:
mkdir /etc/prometheus
mkdir /var/lib/prometheus
chown prometheus:prometheus /etc/prometheus
chown prometheus:prometheus /var/lib/prometheus编辑配置文件/etc/prometheus/prometheus.yml:
global:
scrape_interval: 15s
evaluation_interval: 15s
rule_files:
# - "first_rules.yml"
# - "second_rules.yml"
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'node'
static_configs:
- targets: ['localhost:9100']这个配置文件其实很简单,就是告诉Prometheus去哪里抓取数据。scrape_interval是抓取间隔,我设置的15秒,你也可以根据需要调整。
创建systemd服务文件/etc/systemd/system/prometheus.service:
[Unit]
Description=Prometheus
Wants=network-online.target
After=network-online.target
[Service]
User=prometheus
Group=prometheus
Type=simple
ExecStart=/opt/prometheus/prometheus \
--config.file /etc/prometheus/prometheus.yml \
--storage.tsdb.path /var/lib/prometheus/ \
--web.console.templates=/opt/prometheus/consoles \
--web.console.libraries=/opt/prometheus/console_libraries \
--web.listen-address=0.0.0.0:9090 \
--web.enable-lifecycle
[Install]
WantedBy=multi-user.target启动服务:
systemctl daemon-reload
systemctl start prometheus
systemctl enable prometheus这时候你可以通过浏览器访问http://你的IP:9090看看Prometheus是否正常启动了。

image-20251009213333817

image-20251009213419666
光有Prometheus还不够,我们需要Node Exporter来收集系统指标。
其他收集器可以在这地址查看:https://github.com/prometheus

image-20251009213755125
cd /opt
wget https://github.com/prometheus/node_exporter/releases/download/v1.9.1/node_exporter-1.9.1.linux-amd64.tar.gz
tar -xzf node_exporter-1.9.1.linux-amd64.tar.gz
mv node_exporter-1.9.1.linux-amd64 node_exporter创建用户和服务:
useradd --no-create-home --shell /bin/false node_exporter
chown node_exporter:node_exporter /opt/node_exporter/node_exporter创建systemd服务文件/etc/systemd/system/node_exporter.service:
[Unit]
Description=Node Exporter
Wants=network-online.target
After=network-online.target
[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/opt/node_exporter/node_exporter
[Install]
WantedBy=multi-user.target启动服务:
systemctl daemon-reload
systemctl start node_exporter
systemctl enable node_exporterNode Exporter默认监听9100端口,你可以访问http://你的IP:9100/metrics看看是否有数据输出。

image-20251009214241755

image-20251009214304615
Grafana在Debian上的安装稍微有点不同,需要先添加官方仓库:
# 下载并安装 Grafana GPG 密钥
wget -q -O - https://packages.grafana.com/gpg.key | gpg --dearmor | sudo tee /usr/share/keyrings/grafana-archive-keyring.gpg > /dev/null
# 确保密钥权限正确
chmod 644 /usr/share/keyrings/grafana-archive-keyring.gpg
# 备份当前配置
cp /etc/apt/sources.list.d/grafana.list /etc/apt/sources.list.d/grafana.list.bak
# 创建新的正确配置
echo "deb [signed-by=/usr/share/keyrings/grafana-archive-keyring.gpg] https://packages.grafana.com/oss/deb stable main" > /etc/apt/sources.list.d/grafana.list
# 更新
apt update
#安装
apt install grafana
image-20251009214848427

image-20251009215026669
启动Grafana:
systemctl start grafana-server
systemctl enable grafana-server
image-20251009215050108
Grafana默认监听3000端口,默认用户名密码都是admin。
我刚开始用Debian的时候还不太习惯,总是想用yum命令,结果报错。后来慢慢适应了apt的语法,发现其实也挺好用的。

image-20251009215131926
打开浏览器访问http://你的IP:3000,用admin/admin登录。首次登录会要求修改密码。
进入后台后,点击左侧的(Connections),选择Data Sources,然后点击Add data source。
选择Prometheus,在URL那里填入http://localhost:9090,其他保持默认就行。点击Save & Test,如果看到绿色的"Data source is working"就说明连接成功了。

image-20251009215256073

image-20251009215420880
这里我要说一个小技巧,Grafana官方有很多现成的仪表盘模板,我们可以直接导入使用。
点击左侧的+号,选择Import,在Grafana.com Dashboard那里输入1860(这是一个很经典的Node Exporter仪表盘模板),点击Load。
选择刚才配置的Prometheus数据源,点击Import。

image-20251009215611615

image-20251009215629063
哇!是不是瞬间就有了一个很漂亮的监控仪表盘?CPU、内存、磁盘、网络...各种指标一目了然。

image-20251009215645227
我第一次看到这个仪表盘的时候真的被震撼到了,那些花花绿绿的图表,比之前用的Zabbix不知道高到哪里去了。
现在我们只监控了一台机器,实际工作中肯定要监控多台机器。很简单,在其他机器上安装Node Exporter,然后修改Prometheus的配置文件:
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'debian-servers'
static_configs:
- targets:
- '192.168.1.10:9100'
- '192.168.1.11:9100'
- '192.168.1.12:9100'修改配置后重启Prometheus服务就可以了:
systemctl restart prometheus监控系统不能只是好看,还要能在出问题时及时通知我们。Prometheus的告警功能需要配合Alertmanager使用。
先安装Alertmanager:
cd /opt
wget https://github.com/prometheus/alertmanager/releases/download/v0.25.0/alertmanager-0.25.0.linux-amd64.tar.gz
tar -xzf alertmanager-0.25.0.linux-amd64.tar.gz
mv alertmanager-0.25.0.linux-amd64 alertmanager创建告警规则文件/etc/prometheus/alert_rules.yml:
groups:
- name: basic-alerts
rules:
- alert: InstanceDown
expr: up == 0
for: 5m
labels:
severity: critical
annotations:
summary: "Instance {{ $labels.instance }} down"
description: "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 5 minutes."
- alert: HighCpuUsage
expr: 100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
for: 5m
labels:
severity: warning
annotations:
summary: "High CPU usage on {{ $labels.instance }}"
description: "CPU usage is above 80% for more than 5 minutes."
- alert: HighMemoryUsage
expr: (1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100 > 85
for: 5m
labels:
severity: warning
annotations:
summary: "High memory usage on {{ $labels.instance }}"
description: "Memory usage is above 85% for more than 5 minutes."修改Prometheus配置文件,添加告警规则:
rule_files:
- "/etc/prometheus/alert_rules.yml"
alerting:
alertmanagers:
- static_configs:
- targets:
- localhost:9093说实话,告警规则的配置是最让人头疼的部分。我刚开始的时候经常写错表达式,导致告警不生效或者误报。建议大家多看看官方文档,多试试。
在Debian系统上,有一些特殊的地方需要注意:
包管理器相关监控: 可以监控apt更新情况,看看有没有安全更新需要安装。
服务状态监控: Debian的服务管理用的是systemd,可以通过node_systemd_unit_state指标来监控服务状态。
磁盘分区监控: Debian默认的分区方案可能和其他发行版不太一样,需要注意监控/var/log分区的使用情况。
我之前就遇到过/var/log分区满了导致系统异常的情况,所以现在都会专门监控这个分区。
经过这么多年的摸索,我总结了一些比较实用的监控指标:
CPU使用率:
100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)内存使用率:
(1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100磁盘使用率:
100 - ((node_filesystem_avail_bytes * 100) / node_filesystem_size_bytes)网络流量:
irate(node_network_receive_bytes_total[5m])
irate(node_network_transmit_bytes_total[5m])系统负载:
node_load1
node_load5
node_load15这些指标基本上能覆盖日常监控的需求了。
用了这么久Prometheus,我发现有几个地方需要注意:
我之前就踩过坑,把抓取间隔设置成1秒,结果把服务器搞得很卡。后来才知道这样会产生大量的时序数据。
在Debian系统上,我还发现一个问题,就是默认的文件描述符限制比较低,如果监控目标多了可能会遇到"too many open files"的错误。可以在/etc/security/limits.conf中添加:
prometheus soft nofile 65536
prometheus hard nofile 65536问题1:Prometheus启动失败 一般是配置文件语法错误,可以用promtool检查:
/opt/prometheus/promtool check config /etc/prometheus/prometheus.yml问题2:Grafana图表显示No data 检查数据源配置是否正确,还有就是时间范围是否合适。我经常忘记调整时间范围,结果看不到数据。
问题3:内存占用过高 Prometheus会把数据缓存在内存中,如果监控目标太多可能会占用大量内存。可以调整--storage.tsdb.retention.size参数限制数据大小。
问题4:Debian特有的权限问题 有时候会遇到权限问题,特别是在/var/lib目录下创建文件时。记得检查SELinux状态,虽然Debian默认没有启用SELinux,但有些镜像可能会有。
我记得有一次在公司的Debian服务器上部署,怎么都启动不了Prometheus,后来发现是AppArmor在作怪。禁用了AppArmor就好了:
systemctl stop apparmor
systemctl disable apparmor虽然导入的模板很好用,但有时候我们需要根据自己的需求定制仪表盘。
我经常用的一些Panel类型:
创建Panel的时候,Query语句是关键。我刚开始的时候总是写不对,后来发现可以在Prometheus的Web界面先测试Query语句,确认没问题再复制到Grafana里。
比如我想监控磁盘IO,可以用这个Query:
irate(node_disk_read_bytes_total[5m])
irate(node_disk_written_bytes_total[5m])web页面配置:

image-20251009215913042
光有告警规则还不够,还要能及时通知到人。Alertmanager支持多种通知方式:邮件、钉钉、企业微信、Slack等等。
我一般用企业微信,配置比较简单。创建/etc/alertmanager/alertmanager.yml:
global:
smtp_smarthost: 'localhost:587'
smtp_from: 'alertmanager@example.org'
route:
group_by: ['alertname']
group_wait: 10s
group_interval: 10s
repeat_interval: 1h
receiver: 'web.hook'
receivers:
- name: 'web.hook'
webhook_configs:
- url: 'http://127.0.0.1:5001/'当然,你也可以配置邮件通知:
receivers:
- name: 'email'
email_configs:
- to: 'admin@example.com'
subject: 'Prometheus Alert'
body: |
{{ range .Alerts }}
Alert: {{ .Annotations.summary }}
Description: {{ .Annotations.description }}
{{ end }}监控数据虽然不是核心业务数据,但丢了也很麻烦。我一般会定期备份Prometheus的数据目录。
简单的备份脚本:
#!/bin/bash
DATE=$(date +%Y%m%d)
tar -czf /backup/prometheus-$DATE.tar.gz /var/lib/prometheus/
# 保留最近7天的备份
find /backup -name "prometheus-*.tar.gz" -mtime +7 -delete恢复的时候,停止Prometheus服务,解压备份文件到数据目录,然后重启服务就行了。
这听起来有点绕,但确实很重要。监控系统本身也需要被监控,不然监控系统挂了你都不知道。
我会监控这些指标:
可以设置一个简单的告警规则:
- alert: PrometheusDown
expr: up{job="prometheus"} == 0
for: 1m
labels:
severity: critical
annotations:
summary: "Prometheus is down"用了这么久的监控系统,我总结了一些经验:
我之前就遇到过一个问题,设置了一个CPU使用率超过70%就告警的规则,结果每天都收到几十条告警。后来分析发现,这台服务器的正常CPU使用率就在60-80%之间,70%的阈值太低了。
监控系统包含了很多敏感信息,安全性不能忽视:
我见过有些公司把Grafana直接暴露在公网上,而且用的还是默认密码,这是很危险的。
Prometheus+Grafana这套监控方案真的很不错,界面漂亮、功能强大、扩展性好。在Debian 13上搭建相比其他发行版来说还是比较顺利的,包管理器apt用起来也很方便。
虽然刚开始配置可能有点复杂,但是一旦搭建好了就很省心。最重要的是要根据自己的实际需求来配置监控指标和告警规则,不要贪多。我见过有些人配置了一大堆告警,结果每天都收到几十条告警信息,最后都麻木了。
记住,监控系统的目的是帮助我们更好地管理服务器,而不是增加负担。适合自己的才是最好的。
从我个人的经验来看,这套系统搭建好之后基本上就能满足大部分的监控需求了。当然,如果要监控更复杂的应用,可能还需要安装其他的Exporter,但基本思路都是一样的。
现在我每天早上第一件事就是打开Grafana看看各项指标是否正常,那种掌控感还是很不错的。有时候半夜收到告警短信,虽然被吵醒了但心里还是很踏实的,至少知道系统在帮我看着。