首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Nagios 服務分組出圖實現原理與代碼講解(一)

     編輯:Java 綜合教學

Nagios 服務分組出圖實現原理與代碼講解(一)

背景:公司要求監控系統按業務服務分組實時展示圖表,參考 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

需求分析

  • Nagios 原生不支持服務分組聚合視圖與圖表嵌入。
  • 需實現:按業務線(如「交易系統」「用戶中心」「基礎設施」)分組,每組展示關鍵指標(CPU、內存、磁盤、QPS、延遲)實時圖表。
  • 數據來源:Nagios 績效數據 + PNP4Nagios / Graphite / InfluxDB 時序庫。

整體架構設計

  1. 配置層:定義服務組與主機/服務映射關係(JSON/YAML/DB)。
  2. 數據收集層:Nagios 進程性能數據 -> PNP4Nagios/RRDTool 或轉發至 Graphite/InfluxDB。
  3. 聚合計算層:定時任務讀取時序數據,按服務組聚合(平均、最大、百分位)。
  4. 展示層:Web 門戶調用 ECharts/Highcharts 渲染圖表,支持下鉆到單機服務。

核心代碼模塊(伪代碼)

1. 服務組配置模型

# 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: [...]

2. 從 PNP4Nagios 讀取 RRD 數據

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

3. 服務組聚合邏輯

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)

4. Web API 接口

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})

下一步計劃

  • 完善時間序列對齊與插值算法(不同採集間隔)。
  • 引入 Redis 緩存聚合結果,降低 RRD 讀取壓力。
  • 前端 Vue/React + ECharts 實現儀表盤:分組卡片、圖表下鉆、時間範圍選擇、告警標註。
  • 支持動態服務發現(Consul/Nacos)自動更新分組配置。

本系列將分為三篇:(一)架構與後端聚合,(二)前端儀表盤實現,(三)告警聯動與運維實踐。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved