1. 为什么需要这套监控方案?
在分布式系统和容器化环境中,传统的监控手段往往力不从心。我曾经历过一次线上事故——某个微服务实例的内存泄漏导致整个集群雪崩,而传统的Zabbix监控因为采集粒度太粗(5分钟一次),等收到告警时服务已经瘫痪了半小时。这正是我转向Grafana+Prometheus技术栈的转折点。
这套组合拳的核心优势在于:
- 多维数据采集:node_exporter抓取主机指标,cAdvisor专攻容器指标,形成立体监控
- 秒级告警:Prometheus的Pull模型配合飞书webhook,最快10秒内触发告警
- 零侵入性:所有组件通过HTTP暴露metrics,无需修改业务代码
- 成本效益:相比商业方案,开源组合节省90%以上的监控成本
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 组件选型与架构设计
2.1 核心组件功能拆解
| 组件 | 职责范围 | 关键指标示例 | 部署位置 |
|---|---|---|---|
| Prometheus | 时序数据存储与告警规则管理 | 存储所有metrics,触发Alertmanager | 独立服务器 |
| Grafana | 数据可视化与仪表盘管理 | 展示CPU/内存/网络等面板 | 与Prometheus同机 |
| node_exporter | 主机级监控(物理机/虚拟机) | CPU温度、磁盘IO、网络吞吐量 | 所有被监控主机 |
| cAdvisor | 容器级监控(Docker/K8s) | 容器内存使用、CPU限额、OOM次数 | 容器环境节点 |
| Alertmanager | 告警去重与分发 | 对接飞书webhook | 与Prometheus同机 |
2.2 数据流向架构
code复制被监控主机(node_exporter+cAdvisor)
↓ HTTP暴露/metrics
Prometheus Server(定时Pull数据)
↓ 存储TSDB
Grafana(通过PromQL查询数据)
↑↓
Alertmanager(接收Prometheus告警 → 飞书机器人)
这个架构的巧妙之处在于:
- 无单点故障:每个组件都可以水平扩展
- 低耦合:组件间通过标准HTTP接口通信
- 弹性伸缩:新增节点只需部署exporter,Prometheus自动发现
3. 实战部署指南
3.1 环境准备(以CentOS 7为例)
先解决依赖问题:
bash复制# 安装基础工具
yum install -y wget tar gzip
# 关闭SELinux(生产环境需谨慎)
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
# 时间同步(关键!)
yum install -y ntpdate
ntpdate ntp.aliyun.com
3.2 Prometheus部署
下载最新版(截至2023年8月为2.47.0):
bash复制wget https://github.com/prometheus/prometheus/releases/download/v2.47.0/prometheus-2.47.0.linux-amd64.tar.gz
tar xvf prometheus-*.tar.gz -C /opt/
ln -s /opt/prometheus-2.47.0.linux-amd64 /opt/prometheus
配置监控目标(/opt/prometheus/prometheus.yml):
yaml复制global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'node'
file_sd_configs:
- files: ['/opt/prometheus/targets/nodes.yml']
relabel_configs:
- source_labels: [__address__]
target_label: __scheme__
replacement: http
- job_name: 'docker'
static_configs:
- targets: ['cadvisor:8080']
创建systemd服务(/etc/systemd/system/prometheus.service):
ini复制[Unit]
Description=Prometheus Server
After=network.target
[Service]
User=root
ExecStart=/opt/prometheus/prometheus \
--config.file=/opt/prometheus/prometheus.yml \
--storage.tsdb.path=/opt/prometheus/data \
--web.enable-lifecycle \
--web.external-url=http://your-server-ip:9090
Restart=on-failure
[Install]
WantedBy=multi-user.target
启动服务:
bash复制systemctl daemon-reload
systemctl enable --now prometheus
3.3 node_exporter部署
在所有被监控主机执行:
bash复制wget https://github.com/prometheus/node_exporter/releases/download/v1.6.1/node_exporter-1.6.1.linux-amd64.tar.gz
tar xvf node_exporter-*.tar.gz -C /opt/
ln -s /opt/node_exporter-1.6.1.linux-amd64 /opt/node_exporter
cat > /etc/systemd/system/node_exporter.service <<EOF
[Unit]
Description=Node Exporter
After=network.target
[Service]
User=root
ExecStart=/opt/node_exporter/node_exporter \
--collector.systemd \
--collector.tcpstat \
--collector.processes
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now node_exporter
3.4 cAdvisor部署(Docker环境)
对于容器监控:
bash复制docker run \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:ro \
--volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
--volume=/dev/disk/:/dev/disk:ro \
--publish=8080:8080 \
--detach=true \
--name=cadvisor \
--privileged \
--device=/dev/kmsg \
gcr.io/cadvisor/cadvisor:v0.47.2
3.5 Grafana安装配置
安装Grafana 10.2.0:
bash复制wget https://dl.grafana.com/oss/release/grafana-10.2.0.linux-amd64.tar.gz
tar xvf grafana-*.tar.gz -C /opt/
ln -s /opt/grafana-10.2.0 /opt/grafana
cat > /etc/systemd/system/grafana.service <<EOF
[Unit]
Description=Grafana
After=network.target
[Service]
User=root
WorkingDirectory=/opt/grafana
ExecStart=/opt/grafana/bin/grafana-server \
--config=/opt/grafana/conf/defaults.ini \
--homepath=/opt/grafana
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now grafana
初始化配置:
- 访问http://your-server-ip:3000
- 默认账号admin/admin
- 添加数据源 → 选择Prometheus → URL填http://localhost:9090
- 导入官方仪表盘:
- 主机监控:ID 1860
- Docker监控:ID 193
4. 飞书告警集成实战
4.1 Alertmanager配置
修改Prometheus告警规则(/opt/prometheus/rules/node.rules):
yaml复制groups:
- name: host-monitor
rules:
- alert: HighCPUUsage
expr: 100 - (avg by(instance)(irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 85
for: 5m
labels:
severity: warning
annotations:
summary: "高CPU使用率 (instance {{ $labels.instance }})"
description: "CPU使用率 {{ $value }}% 持续5分钟超过85%"
- alert: MemoryShortage
expr: (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes * 100) < 15
for: 5m
labels:
severity: critical
annotations:
summary: "内存不足 (instance {{ $labels.instance }})"
description: "可用内存仅剩 {{ $value }}%"
配置Alertmanager(/opt/prometheus/alertmanager.yml):
yaml复制route:
group_by: ['alertname']
group_wait: 30s
group_interval: 5m
repeat_interval: 1h
receiver: 'feishu-webhook'
receivers:
- name: 'feishu-webhook'
webhook_configs:
- url: 'https://open.feishu.cn/open-apis/bot/v2/hook/YOUR_WEBHOOK_KEY'
send_resolved: true
4.2 飞书机器人创建步骤
- 在飞书群聊 → 设置 → 群机器人 → 添加自定义机器人
- 复制webhook地址(格式:https://open.feishu.cn/open-apis/bot/v2/hook/xxx)
- 测试消息推送:
bash复制curl -X POST -H "Content-Type: application/json" \
-d '{"msg_type":"text","content":{"text":"Alertmanager测试消息"}}' \
https://open.feishu.cn/open-apis/bot/v2/hook/YOUR_WEBHOOK_KEY
4.3 告警模板优化
默认告警信息可读性差,建议修改alertmanager.yml增加模板:
yaml复制templates:
- '/opt/prometheus/template/*.tmpl'
创建模板文件/opt/prometheus/template/feishu.tmpl:
text复制{{ define "feishu.message" }}
{
"msg_type": "interactive",
"card": {
"config": {
"wide_screen_mode": true
},
"elements": [{
"tag": "div",
"text": {
"content": "{{ range .Alerts }}{{ .Annotations.description }}\n{{ end }}",
"tag": "lark_md"
}
}],
"header": {
"title": {
"content": "🚨 {{ .CommonLabels.alertname }}",
"tag": "plain_text"
},
"template": "{{ .CommonLabels.severity }}"
}
}
}
{{ end }}
5. 生产环境调优经验
5.1 Prometheus性能优化
- 存储优化:
bash复制# 启动参数添加以下配置 --storage.tsdb.retention.time=30d \ --storage.tsdb.wal-compression \ --storage.tsdb.max-block-duration=2h \ --storage.tsdb.min-block-duration=2h - 查询优化:
yaml复制# prometheus.yml添加 query_log_file: /var/log/prometheus/query.log
5.2 Grafana安全加固
- 禁用匿名访问(/opt/grafana/conf/defaults.ini):
ini复制[security] allow_embedding = false disable_initial_admin_creation = true - 配置HTTPS:
ini复制[server] protocol = https cert_file = /path/to/cert.pem cert_key = /path/to/key.pem
5.3 常见故障排查
问题1:Prometheus显示"up=0"但端口能通
- 检查selinux状态
- 验证exporter的/metrics端点是否返回数据
- 查看Prometheus日志中的scrape错误
问题2:Grafana图表显示"No data"
- 检查PromQL语法是否正确
- 确认时间范围选择合理
- 验证数据源配置的URL和端口
问题3:飞书收不到告警
- 在Alertmanager界面检查告警状态
- 用curl手动测试webhook地址
- 查看Alertmanager日志中的推送错误
这套监控方案在我负责的多个生产环境中稳定运行超过两年,曾成功预警过多次潜在故障。最惊险的一次是某台物理机的RAID卡电池故障,通过监控到的磁盘写入延迟异常,在数据丢失前完成了迁移。记住,好的监控系统不是摆设,而是工程师的"第二双眼睛"。
