← Volver al índice
⚡ Infraestructura Hyper-V

HyperV Monitor

Monitor de clusters Hyper-V con seguimiento de Cluster Shared Volumes, alertas de espacio en disco y panel web con historial de métricas.

🐍 Python 3 + Flask + Waitress
🗄️ SQLite WAL
🌐 Puerto 8086
🪟 WinSW Service
En producción
3
Clusters monitorizados
~38
CSVs en total
300s
Intervalo de polling
4h
Cooldown de alertas

Cómo funciona

Un daemon de polling ejecuta PowerShell remoto contra cada cluster y persiste los resultados en SQLite. El panel web muestra el estado en tiempo real y el historial de cada volumen.

1
scheduler._run_loop() — cada N segundos, para cada cluster habilitado
2
cluster_collector.collect_cluster() — lanza pwsh.exe collect_cluster_data.ps1 via Invoke-Command remoto, recibe NDJSON por stdout
3
update_db() — upsert de nodos, CSVs y csv_history (serie temporal)
4
alert_manager.evaluate_thresholds() — si free_pct < umbral: crear/actualizar alerta y POST a SisAlerts si cooldown superado
5
Auto-resolución — si el espacio se recupera, la alerta se cierra automáticamente

Sistema de umbrales en cascada

Los umbrales se resuelven de lo más específico a lo más general, permitiendo configuración granular por volumen.

Tanto el umbral en porcentaje libre como en GB libres se evalúan independientemente. La alerta salta si cualquiera de los dos se supera.

🎯 Por volumen

Columnas warning_threshold_pct / warning_threshold_gb en csv_volumes. Máxima prioridad si no es NULL. Configurable desde Admin → Clusters → Volúmenes.

🏗️ Por cluster

Columnas warning_threshold_pct / warning_threshold_gb en clusters. Se aplica a todos los volúmenes del cluster sin umbral propio.

🌐 Global

thresholds.warning_percent en app-config.json. Fallback global, por defecto 20% warning / 10% crítico. No existe umbral global en GB (NULL = solo aplica %).

⚙️ Administración por volumen

Desde Admin → Clusters → Volúmenes se puede editar el umbral warning/crítico en % y GB para cada CSV individualmente. Los campos vacios heredan el valor del cluster. La columna de espacio libre muestra el estado actual con el color correspondiente al nivel de alerta.

Esquema SQLite

TablaDescripción
clustersClusters monitorizados con umbrales por cluster (warning/critical_threshold_pct y _gb) y estado habilitado/deshabilitado
cluster_nodesÚltimo estado de cada nodo (upsert por cluster + node_name)
csv_volumesÚltimo estado de cada CSV con espacio libre y umbrales individuales por volumen (warning/critical_threshold_pct y _gb)
csv_historySerie temporal de métricas de espacio para gráficas de historial
alertsHistorial de alertas con lifecycle completo (created_at, sent_at, resolved_at)
poll_logLog de cada ciclo de polling por cluster (duración, errores)
settingsKey-value para settings persistentes de la app
usersUsuarios SSO con flag is_admin

Alertas via SisAlerts

Cuando un volumen baja del umbral configurado, se envía un POST al endpoint /api/ingest de SisAlerts con deduplicación por external_id.

POST {sisalerts.url}/api/ingest X-Api-Key: {sisalerts.api_key} { "source": "hyperv-monitor", "sender": "hyperv-monitor", "priority": "critical" | "high", "external_id": "hvmon-{cluster_id}-{volume_name}", "subject": "CSV crítico: {volume_name} — X% libre", "body": "..." }

El external_id permite deduplicación en SisAlerts. El cooldown (default 4h) evita spam. Se reenvía siempre si la severity empeora de warning a critical. El campo rule_id (opcional) indica a SisAlerts qué regla de enrutamiento aplicar (canales, menciones).

PowerShell Remoting

El script collect_cluster_data.ps1 usa Invoke-Command -ComputerName sin credenciales explícitas. La cuenta del servicio Windows debe tener permisos de administrador Hyper-V en todos los clusters.

# Salida NDJSON por stdout: {"type":"node","name":"HV01","state":"Up","uptime_hours":720} {"type":"csv","name":"Cluster Disk 1","size_bytes":1099511627776,"free_bytes":549755813888,"state":"Online","owner_node":"HV01"}

Deploy y configuración

Deploy

cd C:\apps\jmfernandez\hypervmonitor .\deploy.ps1 # git pull + pip install sisapps-ui + restart

Config clave (app-config.json)

polling.enabledActivar/desactivar polling
polling.interval_secondsIntervalo entre ciclos (default 300)
thresholds.warning_percent% libre para warning (default 20)
thresholds.critical_percent% libre para crítico (default 10)
sisalerts.url / api_keyConexión a SisAlerts
sso.auto_adminTodos los usuarios SSO son admins
HyperV Monitor · Equipo de Sistemas · 2026