You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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