HyperV Monitor — Monitor de Clusters Hyper-V

Resumen
Servicio Python (puerto 8086) que monitoriza el espacio en disco de los Cluster Shared Volumes (CSV) de los clusters Hyper-V del equipo. Recopila datos remotamente via PowerShell, persiste un historial de métricas, alerta via SisAlerts cuando el espacio libre cae por debajo de umbrales configurables y ofrece un panel web con estado en tiempo real. Integrado con la plataforma SisApps (sidebar compartida, SSO via Entra ID App Proxy).

1. Acceso al sistema

DatoValor
URLhttps://hypervmonitor-idealistaa82505660.msappproxy.net
AutenticaciónEntra ID Application Proxy (SSO con cuenta corporativa)
Puerto interno8086
Acceso adminTodos los usuarios SSO son admins (sso.auto_admin: true)
Servicio WindowsWinSW: hypervmonitor-service.xml

2. Qué hace el sistema

  1. Polling de clusters — Cada 5 minutos (configurable) ejecuta remotamente via PowerShell collect_cluster_data.ps1 en cada cluster habilitado. El script usa Invoke-Command para obtener el estado de nodos y CSVs sin credenciales explícitas (usa la cuenta de servicio del proceso Windows).
  2. Persistencia — Hace upsert del estado actual de nodos y volúmenes, y guarda un punto en la serie temporal de cada CSV para las gráficas de historial.
  3. Evaluación de umbrales — Para cada volumen, compara el espacio libre (en % y en GB) con los umbrales configurados (por volumen, por cluster o global). Si cualquiera de los dos umbrales se supera, activa la alerta.
  4. Notificación SisAlerts — POST a /api/ingest de SisAlerts con deduplicación por external_id. Respeta un cooldown (default 4h) para no enviar spam, pero siempre reenvía si la severidad empeora.
  5. Auto-resolución — Cuando el espacio se recupera por encima del umbral, la alerta se cierra automáticamente.

3. Sistema de umbrales en cascada

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

NivelFuentePrioridad
Por volumencsv_volumes.warning_threshold_pct / warning_threshold_gbMáxima — si no es NULL
Por clusterclusters.warning_threshold_pct / warning_threshold_gbMedia — si no está configurado por volumen
Globalthresholds.warning_percent en app-config.jsonMínima — fallback global (solo % ,no GB)
Configuración por volumen
Desde Admin → Clusters → Volúmenes se puede definir un umbral independiente para cada CSV. Los campos vacíos heredan el valor del cluster. Útil para volúmenes con comportamiento distinto al resto del cluster.

Severidades

NivelPrioridad SisAlertsCondición
críticocriticalEspacio libre ≤ umbral crítico (% o GB)
warninghighEspacio libre ≤ umbral warning pero > umbral crítico
resueltoEspacio libre recuperado por encima del umbral

4. Panel web

Dashboard (/)

Detalle de cluster

Alertas (/alerts)


5. Integración SisAlerts

Cuando un volumen supera el umbral, se envía un POST al endpoint /api/ingest de SisAlerts:

POST {sisalerts.url}/api/ingest
X-Api-Key: {sisalerts.api_key}
Content-Type: application/json

{
  "source":      "hyperv-monitor",
  "sender":      "hyperv-monitor",
  "priority":    "critical" | "high",
  "external_id": "hvmon-{cluster_id}-{volume_name}",
  "subject":     "CSV crítico: {volume_name} — X% libre (Yz GB)",
  "body_html":   "...",
  "rule_id":     5
}
Deduplicación y cooldown
El campo external_id garantiza que SisAlerts no duplique alertas del mismo volumen. El cooldown (default 4h) evita spam. Se reenvía siempre si la severidad empeora (warning → critical). El campo rule_id indica a SisAlerts qué regla de enrutamiento aplicar (canales Teams/Telegram, menciones).

6. Administración

SecciónDescripción
ClustersCRUD de clusters con nombre, dirección, estado habilitado/deshabilitado, umbrales warning/crítico (% y GB). Botón "Volúmenes" para configurar umbrales por CSV.
VolúmenesTabla editable de umbrales por cada CSV del cluster. Los campos vacíos heredan el umbral del cluster. Se muestra el espacio libre actual con color según el estado de alerta.
AlertasHistorial completo con lifecycle (creada, enviada, resuelta). Permite resolver manualmente alertas falsas.
AjustesConfiguración de SisAlerts (URL, API key, habilitado), test de conectividad, umbrales globales, intervalo de polling.
Test de conectividad SisAlerts
El botón Test SisAlerts en Admin → Ajustes envía una alerta de prueba con external_id: hvmon-test-connectivity. Bypasa el flag sisalerts.enabled y devuelve errores concretos: connection refused, timeout, 401, HTTP status. Se puede indicar un rule_id para probar el enrutamiento.

7. Configuración (app-config.json)

ParámetroDescripción
polling.enabledActiva/desactiva el polling automático de clusters.
polling.interval_secondsSegundos entre ciclos de polling. Defecto: 300 (5 min).
thresholds.warning_percent% de espacio libre para alerta warning. Defecto: 20.
thresholds.critical_percent% de espacio libre para alerta crítico. Defecto: 10.
thresholds.alert_cooldown_hoursHoras mínimas entre reenvíos de la misma alerta. Defecto: 4.
sisalerts.urlURL base de SisAlerts (ej: http://localhost:8082).
sisalerts.api_keyAPI key para autenticar en SisAlerts (X-Api-Key).
sisalerts.enabledSi false, las alertas se crean en DB pero no se envían a SisAlerts (el test de conectividad bypasa este flag).
retention_daysDías de retención del historial de CSVs, poll_log y alertas resueltas. Defecto: 90.
sso.auto_adminSi true, cualquier usuario SSO tiene acceso admin. Recomendado para equipos pequeños.
graph.tenant_id / client_idApp Registration para obtener display names y avatares de los usuarios del equipo.

8. Arquitectura técnica

ComponenteTecnologíaDescripción
BackendPython 3 + Flask + WaitressWSGI server + scheduler en background thread.
Base de datosSQLite WAL8 tablas. WAL permite lecturas concurrentes. Auto-migración al arrancar.
RecolecciónPowerShell Remotingcollect_cluster_data.ps1 via Invoke-Command, salida NDJSON por stdout.
UmbralesPython alert_manager.pyEvalúa % y GB, gestiona lifecycle de alertas y cooldown.
NotificaciónSisAlerts /api/ingestsisalerts_client.py — deduplicación por external_id.
Auth webEntra ID Application ProxyCabecera X-MS-CLIENT-PRINCIPAL-NAME. SSO transparente.
UI shellsisapps-ui packageSidebar compartida, tema por cookie, navegación entre apps.
ServicioWinSW (Windows)hypervmonitor-service.xml. Deploy via deploy.ps1.

Flujo completo

scheduler._run_loop() cada 300s
  → por cada cluster habilitado:
     collect_cluster_data.ps1 (Invoke-Command remoto)
       NDJSON: nodos + CSVs con tamaño/espacio libre
     update_db(): upsert nodos, csvs, csv_history
     alert_manager.evaluate_thresholds():
       por cada CSV:
         resolver umbral_pct y umbral_gb (volumen → cluster → global)
         si free_pct ≤ umbral_pct OR free_gb ≤ umbral_gb:
           crear/actualizar alerta en DB
           si cooldown superado o sent_at es NULL: POST /api/ingest → SisAlerts
         si espacio recuperado: auto-resolver alerta
  → purge cada hora (csv_history + poll_log + alertas resueltas antiguas)

Tablas de base de datos

TablaDescripción
clustersClusters con umbrales pct y GB por cluster
cluster_nodesÚltimo estado de nodos (upsert)
csv_volumesÚltimo estado de CSVs con umbrales pct y GB por volumen
csv_historySerie temporal de espacio libre (base de gráficas)
alertsHistorial de alertas con created_at, sent_at, resolved_at
poll_logLog de ciclos de polling por cluster (duración, errores)
settingsKey-value para settings persistentes
usersUsuarios SSO con flag is_admin

9. PowerShell Remoting

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

# Salida NDJSON por stdout (un objeto JSON por línea):
{"type":"node","name":"HV01","state":"Up","uptime_hours":720}
{"type":"csv","name":"Cluster Disk 1","size_bytes":1099511627776,"free_bytes":219902325555,"state":"Online","owner_node":"HV01"}
Cuenta de servicio
La cuenta bajo la que corre el servicio WinSW necesita permisos WinRM hacia los tres clusters. En la configuración de clusters se puede especificar credenciales explícitas en remoting.username / remoting.secret si la cuenta de servicio no tiene los permisos necesarios.

10. Despliegue

Requisitos

Deploy

cd C:\apps\jmfernandez\hypervmonitor

# deploy.ps1: git pull + pip install sisapps-ui + restart servicio
.\deploy.ps1

# O deploy global de todas las apps:
cd C:\apps\jmfernandez\sisapps-hub
.\sisapps_deploy.ps1
Verificación inicial
1. Abrir https://hypervmonitor-idealistaa82505660.msappproxy.net — debe mostrar el dashboard.
2. Admin → Clusters: crear los clusters con la dirección correcta (nombre NetBIOS o FQDN del cluster).
3. Admin → Ajustes: configurar SisAlerts URL + API key y probar con "Test SisAlerts".
4. Dashboard: botón Poll ahora — verificar que retorna sin error y aparecen los volúmenes.
5. Admin → Clusters → Volúmenes: revisar umbrales por volumen si hay CSVs con comportamiento especial.