背景:公司要求監控系統按業務服務分組實時展示圖表,參考 Zabbix/Cacti 的分組視圖功能,在 Nagios 基礎上進行二次開發。
[root@nagios ~]# cat /etc/redhat-release CentOS release 6.7 (Final) [root@nagios ~]# uname -r 2.6.32-573.el6.x86_64
# service_groups.yaml
- name: "交易系統"
hosts: ["trade-db-01", "trade-app-01", "trade-app-02"]
services:
- "CPU Load"
- "Memory Usage"
- "Disk /data"
- "Trade QPS"
- "Trade Latency P99"
- name: "用戶中心"
hosts: ["user-db-01", "user-app-01"]
services: [...]
import rrdtool
import os
def fetch_service_metric(host, service, metric, cf='AVERAGE', start='-1h'):
rrd_path = f"/var/lib/pnp4nagios/{host}/{service}/{metric}.rrd"
if not os.path.exists(rrd_path):
return None
# 返回 (time, value) 列表
data = rrdtool.fetch(rrd_path, cf, '-s', start)
return data
def aggregate_group_metrics(group_config, metric_name, cf='AVERAGE'):
all_series = []
for host in group_config['hosts']:
for service in group_config['services']:
series = fetch_service_metric(host, service, metric_name, cf)
if series:
all_series.append(series)
# 簡單平均聚合(需對齊時間戳)
if not all_series:
return []
# 這裡省略時間對齊插值邏輯
return compute_average(all_series)
from flask import Flask, jsonify, request
app = Flask(__name__)
@app.route('/api/group//metric/')
def group_metric(group_name, metric_name):
group = load_group_config(group_name)
data = aggregate_group_metrics(group, metric_name)
return jsonify({'metric': metric_name, 'data': data})
本系列將分為三篇:(一)架構與後端聚合,(二)前端儀表盤實現,(三)告警聯動與運維實踐。