Skip to content

Sharpulin/ctm-dependency-graph

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Control-M Dependency Graph

Herramienta de analisis estructural estatico de mallas Control-M. Lee los XML exportados del Enterprise Manager, construye un grafo de dependencias y lo expone en una interfaz 3D interactiva (WebGL) con una API REST.

Fase 1 — analisis estatico offline. Sin integracion en vivo con la Automation API.


Inicio rapido

# 1. Instalar dependencias
pip install -r requirements.txt

# 2. Parsear los XML de produccion (colocalos en data/xml/)
python3 -m src.parser.ctm_parser data/xml/ data/graph/

# 3. Arrancar API + UI
uvicorn src.api.main:app --reload --port 8000

# 4. Abrir en el navegador
#    App 3D:      http://localhost:8000/app
#    Swagger UI:  http://localhost:8000/docs

Requisitos

  • Python 3.10+
  • Ver requirements.txt para dependencias Python (networkx, fastapi, uvicorn, pydantic, httpx, pytest)
  • Navegador con WebGL (Chrome, Edge, Firefox modernos)

Funcionalidades

Visualizacion 3D interactiva

  • Grafo 3D con Three.js/WebGL — rotar, orbitar, hacer zoom con el mouse
  • Nodos separados por plano Z segun datacenter (PROD_BCO / PROD_FIFCH / PROD_FIFREG)
  • Tamano de nodo proporcional al bottleneck score
  • Aristas cross-datacenter con animacion de particulas

Interaccion con nodos

  • Click en un nodo: camara vuela al job seleccionado
  • Se resaltan en amarillo los ancestros (dependencias previas)
  • Se resaltan en verde los descendientes (jobs impactados)
  • El grafo se expande progresivamente a medida que se explora
  • Panel lateral con todos los atributos del job (JOBNAME, FOLDER, APPLICATION, NODEID, RUN_AS, CRITICAL...)

Analisis disponibles

Funcion Descripcion
Cuellos de botella Ranking por in-degree + out-degree + betweenness centrality
Ciclos Deteccion SCC via algoritmo de Tarjan iterativo
Cross-datacenter Aristas entre distintos Control-M servers via Global Conditions
Impacto transitivo Descendientes/ancestros completos de cualquier job
Busqueda Por jobname, aplicacion o datacenter

Estructura del proyecto

ctm-dependency-graph/
├── src/
│   ├── parser/
│   │   ├── models.py          JobNode, DependencyEdge, ParseStats (dataclasses)
│   │   └── ctm_parser.py      Parser XML dos-pasadas con Tarjan SCC
│   ├── graph/
│   │   ├── loader.py          GraphStore singleton (NetworkX DiGraph)
│   │   └── metrics.py         impact, bottlenecks, cycles, search, paths, cross_dc
│   ├── api/
│   │   ├── main.py            FastAPI app, lifespan, CORS, StaticFiles
│   │   ├── schemas.py         Pydantic v2 response models
│   │   └── routers/
│   │       ├── graph.py       GET/POST /api/graph/*
│   │       └── jobs.py        GET /api/jobs/*
│   └── frontend/
│       ├── index.html         SPA shell
│       ├── app.js             Logica 3D (3d-force-graph)
│       ├── styles.css         Tema oscuro
│       └── 3d-force-graph.min.js  Bundle local (692KB, Three.js incluido)
├── tests/
│   ├── test_parser.py         24 tests unitarios del parser
│   ├── test_metrics.py        24 tests de funciones de metricas
│   └── test_api.py            33 tests de integracion API (FastAPI TestClient)
├── data/
│   ├── xml/                   XML fuente de Control-M (NO commitear datos reales)
│   └── graph/                 JSON generados por el parser (NO commitear)
├── ctm_parser.py              Shim de backward-compat
├── requirements.txt
├── CHANGELOG.md
└── COPILOT.MD                 Contexto LLM del proyecto

API REST

Metodo Path Descripcion
POST /api/graph/load Cargar/recargar el grafo desde JSON
GET /api/graph/stats Estado del grafo en memoria
GET /api/graph/summary Conteos por datacenter y top aplicaciones
GET /api/graph/subgraph Subgrafo para un conjunto de job_ids
GET /api/graph/bottlenecks Ranking de cuellos de botella
GET /api/graph/cycles SCCs con ciclos reales (Tarjan)
GET /api/graph/paths Caminos simples entre dos jobs
GET /api/graph/cross-datacenter Aristas cross-datacenter
GET /api/jobs/search Buscar por jobname / application / datacenter
GET /api/jobs/{job_id} Detalle completo de un job
GET /api/jobs/{job_id}/neighbors Vecinos directos (predecesores + sucesores)
GET /api/jobs/{job_id}/impact Impacto transitivo (ancestors / descendants)

Tests

python3 -m pytest tests/ -v
# 81 tests, todos pasan

Volumenes de produccion verificados

Datacenter Jobs Folders
PROD_BCO 6,738 111
PROD_FIFCH 31,591 76
PROD_FIFREG 27,402 34
Total 65,692 221
  • Aristas totales: 88,057
  • Nodos virtuales externos: 122
  • Aristas cross-datacenter (Global Conditions): 1,233
  • Ciclos reales (Tarjan SCC): 9,714 nodos en 63 SCCs

Modelos de condicion reconocidos

Patron Ejemplo Descripcion
A-TO-B JOB_A-TO-JOB_B Dependencia directa entre dos jobs
JOBNAME ACC00001AHE La condicion tiene el mismo nombre que el job productor
JOBNAME-ENDED ACC00001AHE-ENDED Variante con sufijo -ENDED
Global Condition GCFIFCL-JOB_A-TO-JOB_B Cross-datacenter via Global Condition (GC-prefix)

Fase 2 (fuera de este MVP)

  • Integracion con Control-M Automation API (ejecucion en vivo)
  • Capa GraphRAG (embeddings sobre nodos del grafo)
  • Monitoreo de ejecuciones reales / SLA / historicos de duracion
  • Edicion o despliegue de jobs desde la herramienta

About

Analisis estructural 3D de mallas Control-M: grafo de dependencias interactivo con WebGL, FastAPI y NetworkX

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors