Prometheus + Grafana + Alertmanager轻量级监控告警系统

一、工具简介与官网

工具作用官网文档地址
Prometheus指标采集、存储与告警规则管理prometheus.io/docs
Node Exporter暴露服务器硬件/OS指标github.com/prometheus/node_exporter
Alertmanager告警聚合与通知发送prometheus.io/docs/alerting
Grafana数据可视化与仪表盘grafana.com/docs

二、安装与配置

1. Prometheus 安装

1.1 下载与解压


wget https://github.com/prometheus/prometheus/releases/download/v2.51.0/prometheus-2.51.0.linux-amd64.tar.gz
tar xvf prometheus-2.51.0.linux-amd64.tar.gz
cd prometheus-2.51.0.linux-amd64

1.2 配置监控目标

编辑 prometheus.yml

global:
  scrape\_interval: 15s
  evaluation\_interval: 15s

scrape\_configs:
  \- job\_name: "prometheus"    \# 监控自身
    static\_configs:
      \- targets: \["localhost:9090"\]
  \- job\_name: "node"          \# 监控服务器
    static\_configs:
      \- targets: \["<NODE\_IP>:9100"\]  \# 替换为Node Exporter的IP

1.3 启动 Prometheus

./prometheus \--config.file\=prometheus.yml

访问 http://<PROMETHEUS_IP>:9090 验证。

2. Node Exporter 安装(被监控服务器)

2.1 下载与启动


wget https://github.com/prometheus/node\_exporter/releases/download/v1.7.0/node\_exporter-1.7.0.linux-amd64.tar.gz
tar xvf node\_exporter-1.7.0.linux-amd64.tar.gz
cd node\_exporter-1.7.0.linux-amd64
./node\_exporter

默认端口 9100,访问 http://<NODE_IP>:9100/metrics 查看指标。

2.2(可选)配置为系统服务

创建 /etc/systemd/system/node_exporter.service

\[Unit\]
Description\=Node Exporter
\[Service\]
ExecStart\=/path/to/node\_exporter
\[Install\]
WantedBy\=multi-user.target

启动服务:


sudo systemctl enable \--now node\_exporter

3. Alertmanager 安装

3.1 下载与解压


wget https://github.com/prometheus/alertmanager/releases/download/v0.27.0/alertmanager-0.27.0.linux-amd64.tar.gz
tar xvf alertmanager-0.27.0.linux-amd64.tar.gz
cd alertmanager-0.27.0.linux-amd64

3.2 配置邮件告警

编辑 alertmanager.yml


route:
  receiver: 'email-alerts'
receivers:
\- name: 'email-alerts'
  email\_configs:
  \- to: 'your-email@example.com'
    from: 'alertmanager@example.com'
    smarthost: 'smtp.example.com:587'
    auth\_username: 'user@example.com'
    auth\_password: 'your-password'

3.3 启动 Alertmanager


./alertmanager \--config.file\=alertmanager.yml

访问 http://<ALERTMANAGER_IP>:9093 管理告警。

4. 配置 Prometheus 告警规则

4.1创建告警规则文件

在 Prometheus 目录下创建 alert.rules.yml:

groups:
- name: server-alerts
  rules:
  - alert: HighCPUUsage
    expr: 100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[1m])) * 100 > 80
    for: 5m
    labels:
      severity: warning
    annotations:
      summary: "High CPU usage on {{ $labels.instance }}"
      description: "CPU usage is {{ $value }}%"

4.2 修改 prometheus.yml 加载规则

rule_files:
  - 'alert.rules.yml'

alerting:
  alertmanagers:
  - static_configs:
    - targets: ['<ALERTMANAGER_IP>:9093']  # 替换为 Alertmanager 的 IP

4.3 重启 Prometheus

pkill prometheus
./prometheus --config.file=prometheus.yml

5. 安装 Grafana

5.1 下载与安装

wget https://dl.grafana.com/oss/release/grafana-10.4.3.linux-amd64.tar.gz
tar xvf grafana-10.4.3.linux-amd64.tar.gz
cd grafana-10.4.3
./bin/grafana-server

访问 http://<GRAFANA_IP>:3000(默认账号 admin/admin)。

5.2 添加 Prometheus 数据源

  1. 进入 Configuration > Data Sources > Add data source。
  2. 选择 Prometheus,填写 URL http://<PROMETHEUS_IP>:9090。

5.3 导入仪表盘

  1. 进入 Dashboards > Import。
  2. 输入仪表盘 ID 1860(Node Exporter 官方模板),点击 Load。

三、使用示例

1. PromQL 查询

在 Prometheus 的 Web UI 中尝试查询:
* CPU 使用率:
    ```promql
    100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[1m])) * 100
    ```
* 内存剩余:
    ```promql
    node_memory_MemAvailable_bytes / 1024 / 1024  # MB
    ```

2. 告警测试

触发 HighCPUUsage 告警后,检查邮箱是否收到通知。

Grafana 仪表盘

优化与扩展

  • 长期存储:集成 Thanos 或 VictoriaMetrics。
  • 监控更多服务
    • 数据库:mysqld_exporter、postgres_exporter。
    • 高可用:部署多副本 Prometheus + Alertmanager。

四、常见问题

1. Prometheus 无数据:检查 targets 页面(http://<PROMETHEUS_IP>:9090/targets)是否显示 UP。

2. 告警未触发:确认 alert.rules.yml 语法正确,且 Alertmanager 配置无误。

3. Grafana 无图表:检查数据源是否连接成功。

通过以上步骤,可以搭建一个完整的 轻量级监控告警系统,覆盖服务器指标采集、可视化、告警全流程!

五、低资源占用用Docker 部署方案及优化策略。

# Prometheus 是资源占用大户,我们通过减少数据保留天数、限制内存以及禁用不需要的操作来压榨资源。
docker run -d \
  --name prometheus \
  -p 9090:9090 \
  -v /opt/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml \
  -v /opt/prometheus/data:/prometheus \
  --memory="256m" \
  --cpus="0.5" \
  prom/prometheus:v2.45.0 \
  --config.file=/etc/prometheus/prometheus.yml \
  --storage.tsdb.path=/prometheus \
  --storage.tsdb.retention.time=7d \
  --storage.tsdb.retention.size=2GB \
  --query.max-concurrency=2 \
  --web.enable-lifecycle

#部署 Grafana (最低资源配置)
  docker run -d \
  --name grafana \
  -p 3000:3000 \
  --memory="256m" \
  --cpus="0.3" \
  -e "GF_SERVER_ROOT_URL=http://192.168.0.2:3000" \
  -e "GF_LIVE_ALLOWED_ORIGINS=http://192.168.0.2:3000" \
  -e "GF_ANALYTICS_REPORTING_ENABLED=false" \
  -e "GF_AUTH_ANONYMOUS_ENABLED=false" \
  grafana/grafana-oss:latest

# 部署极简 Node Exporter (监控服务器 CPU/内存)
  docker run -d \
  --name node-exporter \
  -p 9100:9100 \
  --memory="30m" \
  --net="host" \
  --pid="host" \
  -v "/:/host:ro,rslave" \
  prom/node-exporter:v1.6.0 \
  --path.rootfs=/host

# mysql
CREATE USER 'exporter'@'%' IDENTIFIED BY 'your_password';
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'%';
  # 监控mysql
docker run -d \
  --name mysql-exporter \
  -p 9104:9104 \
  --memory="50m" \
  -e DATA_SOURCE_NAME="exporter:你的密码@(内网IP:3306)/" \
  prom/mysqld-exporter:v0.15.0

#   监控redis
docker run -d \
  --name redis-exporter \
  -p 9121:9121 \
  --memory="50m" \
  oliver006/redis_exporter:latest \
  --redis.addr=redis://宿主机IP:6379 \
  --redis.password=你的密码

配置 Prometheus 拉取数据

prometheus.yml 示例内容:

global:
  scrape_interval: 30s # 降低频率省资源

scrape_configs:
  - job_name: 'node'
    static_configs:
      - targets: ['localhost:9100']

  - job_name: 'mysql'
    static_configs:
      - targets: ['宿主机IP:9104']

  - job_name: 'redis'
    static_configs:
      - targets: ['宿主机IP:9121']

  - job_name: 'hyperf'
    static_configs:
      - targets: ['宿主机IP:9501']

正常情况下访问ip:3000 会出现Grafana的web页面。

登录到 Grafana 后,你需要完成三个核心步骤:添加数据源(Prometheus)、导入仪表盘(Dashboard)、以及设置告警(可选)。

第一步:关联 Prometheus 数据源

  1. 进入设置:点击左侧侧边栏的 Connections -> Data sources
  2. 添加数据源:点击 Add data source 按钮。
  3. 选择 Prometheus:在列表中选择 Prometheus
  4. 配置 URL
    1. 如果 Prometheus 和 Grafana 在同一个 Docker 网络:填写 http://prometheus:9090。
    2. 如果在同一台机器但不在同一个 Docker 网络:填写 http://宿主机内网IP:9090。
    3. 注意:如果你的 Prometheus 开启了 Basic Auth,请在下方的 Authentication 开启 Basic Auth 并输入账号密码。
  5. 保存测试:滚动到底部点击 Save & test。如果显示绿色对勾“Successfully queried the Prometheus API”,说明连接成功。

第二步:导入现成的仪表盘 (Dashboards)

  1. 进入导入页面:点击左侧菜单的 Dashboards,然后点击右侧的 New -> Import。
  2. 输入 ID 导入:在 “Import via grafana.com” 输入框中输入以下经典 ID,然后点击 Load:
    1. 1860
    2. 监控 MySQL:输入 7362 (MySQL Overview) 或 12132。
    3. 监控 Redis:输入 11835 (Redis Dashboard for Prometheus)。
    4. 监控宿主机 (CPU/内存):输入 1860 (Node Exporter Full)。
  3. 配置数据源:在导入页面的下拉框中选择你刚才第一步创建的 Prometheus 数据源。
  4. 完成:点击 Import,炫酷的图表就会立即显示出来。
  5. 如果出现卡顿可以尝试增加资源 docker update –memory 256m –memory-swap 256m grafana

如果需要更换密码

docker exec -it grafana grafana-cli admin reset-admin-password 新密码

注意事项:

原生 Prometheus 没有任何内置的登录鉴权功能。 官方的设计哲学是:Prometheus 应该运行在受信任的内网环境中,安全性由网络策略(防火墙)或反向代理来负责。

如果你的 9090 端口直接暴露在公网,任何人都可以通过浏览器查看你的监控指标、甚至通过 API 接口关掉你的 Prometheus 服务。