在企业级监控场景中,我们通常需要一套完整的解决方案来收集、存储、展示和告警服务器指标。这套基于Docker的监控方案由四个核心组件构成:
这种架构的优势在于:
生产环境建议:主控节点(运行prometheus+grafana)建议4核8G配置,数据保留周期根据存储容量调整(默认配置为100天)
Node-exporter需要部署在所有被监控主机上,以下是关键参数解析:
bash复制docker run -d --name node-exporter --restart=always -p 9100:9100 \
-v "/proc:/host/proc:ro" \
-v "/sys:/host/sys:ro" \
-v "/:/rootfs:ro" \
prom/node-exporter:v1.10.2
/proc:提供进程和系统统计信息/sys:获取硬件和内核指标/:根目录用于计算磁盘使用率部署完成后,通过以下方式验证:
bash复制curl http://localhost:9100/metrics | grep 'node_cpu_seconds_total'
正常应看到类似输出:
code复制node_cpu_seconds_total{cpu="0",mode="idle"} 38245.72
node_cpu_seconds_total{cpu="0",mode="system"} 456.12
当需要监控多个节点时,在Prometheus配置中添加targets即可:
yaml复制scrape_configs:
- job_name: 'node-cluster'
static_configs:
- targets: ['node1:9100', 'node2:9100', 'node3:9100']
正确的目录权限是Prometheus稳定运行的前提:
bash复制mkdir -p /opt/prometheus/{config,data,rules}
chown -R 65534:65534 /opt/prometheus/{data,rules}
prometheus.yml核心配置说明:
yaml复制global:
scrape_interval: 15s # 抓取间隔
evaluation_interval: 15s # 规则评估间隔
alerting:
alertmanagers:
- static_configs:
- targets: ['alertmanager:9093'] # 告警管理器地址
rule_files:
- "/prometheus/rules/*.yml" # 告警规则路径
scrape_configs:
- job_name: 'prometheus' # 监控Prometheus自身
static_configs:
- targets: ['localhost:9090']
- job_name: 'nodes' # 节点监控
metrics_path: '/metrics'
static_configs:
- targets: ['node1:9100', 'node2:9100']
以CPU告警为例详解PromQL语法:
yaml复制- alert: CPU使用率过高
expr: 100 - (avg by (instance) (irate(node_cpu_seconds_total{mode="idle"}[30s])) * 100) > 80
for: 5m # 持续5分钟才触发
labels:
severity: critical
annotations:
summary: "{{ $labels.instance }} CPU负载过高"
description: "当前CPU使用率 {{ $value | printf "%.2f" }}%"
关键点说明:
irate():计算时间范围内指标的瞬时增长率avg by (instance):按实例分组计算平均值for:持续时长避免瞬时抖动误报在Grafana中添加Prometheus数据源时需注意:
http://prometheus:9090(容器间通信)使用官方ID 8919导入Node-exporter仪表盘时:
Job变量为实际的job_name(默认为nodes)refresh时间为30s(生产环境建议1m)示例:创建内存使用率图表
promql复制(1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100
alertmanager.yml配置示例:
yaml复制route:
group_by: ['alertname', 'cluster']
group_wait: 30s
group_interval: 5m
repeat_interval: 1h
receiver: 'ops-team'
routes:
- match:
severity: 'critical'
receiver: 'oncall-engineer'
Python Webhook服务增强建议:
改进后的告警处理逻辑:
python复制@app.route('/alert', methods=['POST'])
def handle_alert():
try:
data = request.get_json()
for alert in data.get('alerts', []):
status = alert['status']
labels = alert.get('labels', {})
if status == 'firing':
send_alert_message(
name=labels.get('alertname'),
instance=labels.get('instance'),
severity=labels.get('severity'),
value=alert['annotations'].get('value')
)
elif status == 'resolved':
send_resolved_notification(
alert_name=labels.get('alertname'),
instance=labels.get('instance')
)
return jsonify({"status": "success"}), 200
except Exception as e:
logger.error(f"处理告警失败: {str(e)}")
return jsonify({"status": "error"}), 500
Prometheus启动参数优化:
bash复制docker run ... prom/prometheus \
--storage.tsdb.retention.time=30d \ # 保留周期
--storage.tsdb.wal-compression \ # 启用WAL压缩
--query.max-concurrency=20 \ # 最大查询并发
--query.timeout=2m # 查询超时
推荐架构:
现象:Prometheus targets页面显示DOWN
排查步骤:
docker logs node-exporter检查清单:
解决方案:
这套监控方案经过多个生产环境验证,能够满足中小规模集群的监控需求。实际部署时建议先在小范围测试,再逐步推广到全部节点。对于特殊需求(如自定义指标采集),可以通过开发额外的exporter来扩展功能。