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 数据源
- 进入 Configuration > Data Sources > Add data source。
- 选择 Prometheus,填写 URL http://<PROMETHEUS_IP>:9090。
5.3 导入仪表盘
- 进入 Dashboards > Import。
- 输入仪表盘 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 数据源
- 进入设置:点击左侧侧边栏的 Connections -> Data sources。
- 添加数据源:点击 Add data source 按钮。
- 选择 Prometheus:在列表中选择 Prometheus。
- 配置 URL:
- 如果 Prometheus 和 Grafana 在同一个 Docker 网络:填写 http://prometheus:9090。
- 如果在同一台机器但不在同一个 Docker 网络:填写 http://宿主机内网IP:9090。
- 注意:如果你的 Prometheus 开启了 Basic Auth,请在下方的 Authentication 开启 Basic Auth 并输入账号密码。
- 保存测试:滚动到底部点击 Save & test。如果显示绿色对勾“Successfully queried the Prometheus API”,说明连接成功。
第二步:导入现成的仪表盘 (Dashboards)
- 进入导入页面:点击左侧菜单的 Dashboards,然后点击右侧的 New -> Import。
- 输入 ID 导入:在 “Import via grafana.com” 输入框中输入以下经典 ID,然后点击 Load:
- 1860
- 监控 MySQL:输入 7362 (MySQL Overview) 或 12132。
- 监控 Redis:输入 11835 (Redis Dashboard for Prometheus)。
- 监控宿主机 (CPU/内存):输入 1860 (Node Exporter Full)。
- 配置数据源:在导入页面的下拉框中选择你刚才第一步创建的 Prometheus 数据源。
- 完成:点击 Import,炫酷的图表就会立即显示出来。
- 如果出现卡顿可以尝试增加资源 docker update –memory 256m –memory-swap 256m grafana
如果需要更换密码
docker exec -it grafana grafana-cli admin reset-admin-password 新密码
注意事项:
原生 Prometheus 没有任何内置的登录鉴权功能。 官方的设计哲学是:Prometheus 应该运行在受信任的内网环境中,安全性由网络策略(防火墙)或反向代理来负责。
如果你的 9090 端口直接暴露在公网,任何人都可以通过浏览器查看你的监控指标、甚至通过 API 接口关掉你的 Prometheus 服务。