运维知识
悠悠
2025年10月9日

别再说监控难了!手把手教你用Prometheus+Grafana搭建监控系统,小白也能学会

为什么选择Prometheus+Grafana这个组合?

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 -y

Debian系统相比CentOS来说,包管理器用的是apt,而且默认没有防火墙服务,这点还是挺方便的。

安装Prometheus

去官网下载最新版本,我这里用的是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

安装Node Exporter

光有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_exporter

Node Exporter默认监听9100端口,你可以访问http://你的IP:9100/metrics看看是否有数据输出。

image-20251009214241755

image-20251009214304615

安装Grafana

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

配置Grafana连接Prometheus

打开浏览器访问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系统特有的一些监控指标

在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. 数据保留时间:默认是15天,如果磁盘空间不够可以调短一点。在启动参数中添加--storage.tsdb.retention.time=7d
  2. 抓取间隔:不要设置得太频繁,15秒或30秒就够了。太频繁会增加系统负载。
  3. 标签数量:尽量控制标签的数量和基数,标签太多会影响查询性能。

我之前就踩过坑,把抓取间隔设置成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类型:

  • Stat:显示单个数值,比如当前CPU使用率
  • Time series:显示时间序列图表,比如CPU使用率趋势
  • Gauge:显示仪表盘,比较直观
  • Table:显示表格数据

创建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服务,解压备份文件到数据目录,然后重启服务就行了。

监控系统的监控

这听起来有点绕,但确实很重要。监控系统本身也需要被监控,不然监控系统挂了你都不知道。

我会监控这些指标:

  • Prometheus服务状态
  • Grafana服务状态
  • 磁盘空间使用情况
  • 内存使用情况
  • 数据抓取成功率

可以设置一个简单的告警规则:

- alert: PrometheusDown
  expr: up{job="prometheus"} == 0
  for: 1m
  labels:
    severity: critical
  annotations:
    summary: "Prometheus is down"

一些使用心得

用了这么久的监控系统,我总结了一些经验:

  1. 不要过度监控:什么都监控等于什么都没监控。重点关注核心指标就行了。
  2. 告警阈值要合理:太低了会有很多误报,太高了可能错过真正的问题。需要根据历史数据来调整。
  3. 定期检查告警规则:业务在变化,告警规则也要跟着调整。
  4. 做好文档:记录每个监控指标的含义和告警处理流程,方便团队其他成员理解。

我之前就遇到过一个问题,设置了一个CPU使用率超过70%就告警的规则,结果每天都收到几十条告警。后来分析发现,这台服务器的正常CPU使用率就在60-80%之间,70%的阈值太低了。

安全考虑

监控系统包含了很多敏感信息,安全性不能忽视:

  1. 访问控制:Grafana要设置合适的用户权限,不要所有人都是admin。
  2. 网络隔离:监控系统最好部署在内网,通过VPN或跳板机访问。
  3. 数据加密:如果需要远程访问,记得配置HTTPS。
  4. 定期更新:及时更新Prometheus和Grafana版本,修复安全漏洞。

我见过有些公司把Grafana直接暴露在公网上,而且用的还是默认密码,这是很危险的。

总结

Prometheus+Grafana这套监控方案真的很不错,界面漂亮、功能强大、扩展性好。在Debian 13上搭建相比其他发行版来说还是比较顺利的,包管理器apt用起来也很方便。

虽然刚开始配置可能有点复杂,但是一旦搭建好了就很省心。最重要的是要根据自己的实际需求来配置监控指标和告警规则,不要贪多。我见过有些人配置了一大堆告警,结果每天都收到几十条告警信息,最后都麻木了。

记住,监控系统的目的是帮助我们更好地管理服务器,而不是增加负担。适合自己的才是最好的。

从我个人的经验来看,这套系统搭建好之后基本上就能满足大部分的监控需求了。当然,如果要监控更复杂的应用,可能还需要安装其他的Exporter,但基本思路都是一样的。

现在我每天早上第一件事就是打开Grafana看看各项指标是否正常,那种掌控感还是很不错的。有时候半夜收到告警短信,虽然被吵醒了但心里还是很踏实的,至少知道系统在帮我看着。


如果这篇文章对你有帮助,别忘了点赞转发支持一下!想了解更多运维实战经验和技术干货,记得关注微信公众号@运维躬行录,领取学习大礼包!!!我会持续分享更多接地气的运维知识和踩坑经验。让我们一起在运维这条路上互相学习,共同进步!

公众号:运维躬行录

个人博客:躬行笔记

文章目录

博主介绍

热爱技术的云计算运维工程师,Python全栈工程师,分享开发经验与生活感悟。
欢迎关注我的微信公众号@运维躬行录,领取海量学习资料

微信二维码