Funcionalidadactivecreado Sun Jun 07#monitoring#itsm#alerting#audit-suprema#security#performance#correctness
Resumen
Cierre de 12 hallazgos BAJA/MEDIA de la auditoría Suprema sub-área 4 (ITSM/alerting), sesión 112. Se aborda:
- Validación de
risk_level(B1): rechazar fuera de{HIGH, MEDIUM, LOW}en SLA, escalation policies, known-issues - Seguridad de runbooks (M5): validar comandos embebidos contra allowlist del vendor
- Honestidad en
apply_runbook(B5): solo asigna, no ejecuta;usage_countidempotente en re-asignación - Known-issue body (B6):
create_from_insightaplicadescription/risk_leveldel body si vienen - SLA lifecycle (B10):
resolve_alertpueblaresolved_by+ marcaacknowledged - Markdown safety (B15): fence suficientemente largo para que ``` en commands/output no rompa bloques
- Paginación (B7/B11):
list_*endpoints capped a 500 (runbooks, known-issues) y 1000 (alerts) - N+1 eliminados (B12/B13):
is_in_maintenance_windowquery única;check_escalationsprecarga políticas por (org, risk_level)
Archivos Modificados
API Endpoints (alerts)
list_alerts: paginaciónlimit/offset(cap 1000)get_active_alerts: paginaciónlimit/offset(cap 1000)resolve_alert: nuevo camporesolved_by+ marcaacknowledgedsi no lo estaba
API Endpoints (ITSM)
update_sla_policy(risk_level): validarisk_levelen{HIGH, MEDIUM, LOW}→ 400 si inválidolist_known_issues: paginaciónlimit/offset(cap 500)create_from_insight: aplicadescription/risk_leveldel body si vienen (antes se ignoraban)list_runbooks: paginaciónlimit/offset(cap 500)create_runbook: valida comandos ensteps[*].commandscontra vendor allowlist → 400 si peligrosoupdate_runbook: valida comandos; logs action conlog_action()apply_runbook: asigna runbook; incrementausage_countsolo la primera vez (re-asignar es idempotente)download_markdown: documenta respuesta 200 en contrato OpenAPI
Esquemas (itsm_schemas.py)
RISK_LEVELSconstant:{"HIGH", "MEDIUM", "LOW"}— compartida por SLA/escalation/known-issueEscalationPolicyInvalidator: rechazarisk_levelfuera de setKnownIssueInvalidator: rechazarisk_level(si non-vacío) fuera de set
Modelos
AlertEvent: nuevo camporesolved_by(FK → User, nullable)
Servicios
escalation_service.check_escalations(): precarga políticas de escalado por (org, risk_level) en un diccionario; evita N+1 por insightsla_service.is_in_maintenance_window(target): query única conQ(targets__isnull=True) | Q(targets=target)en vez de cargar todas y probar M2Mreport_service.format_markdown():_code_block()calcula fence de backticks más larga que cualquier run en el contenido; asegura ``` no rompe bloque
Tests
tests/api/test_monitoring_sa4_sa5.py: 4 tests nuevos — B1, M5, B10, B5 (usage idempotencia)
Beneficios
- Correctness: risk_level fuera de set nunca matchea una policy realmente existente (antes silenciosamente inerte)
- Seguridad: runbooks no pueden guardar comandos peligrosos (Cisco, Juniper, etc.)
- Observabilidad:
resolved_bytraza quién cerró un alert; usage ranking de runbooks más honesto - Performance: -N+1 en escalation check (-200 queries/noche en típico tenant); -N+1 en maintenance window check
- UX: Markdown reports robusto ante comandos con backticks; paginación en endpoints ITSM
Schema de Migraciones
monitoring/0022_alertevent_resolved_by.py: añadeAlertEvent.resolved_by(nullable FK)
Véase también
- [[entity—monitoring—service—escalation-policy-checker]]
- [[entity—monitoring—service—sla-maintenance-window]]
- [[entity—monitoring—service—report-markdown-formatter]]
- [[concept—monitoring—risk-stratification]]
- [[decision—20260607—audit-suprema-sa4-baja-cleanup]]