Modelo AIInsight
Archivo: monitoring/models_insight.py | DB: PostgreSQL (monitoring app) | Migration: 0020 (2026-06-05)
Propósito
Modelo que captura insights de inteligencia artificial generados por el Tutor (LLM) sobre anomalías detectadas en el monitoreo. Transforma datos de red (SNMP, SSH, syslog) en diagnósticos estructurados con recomendaciones de remediación.
Post-SA3: incluye campo category para clasificación estructurada (CONNECTIVITY / SECURITY / PERFORMANCE / OTHER), eliminando la necesidad de regex-matching en lógica de negocio.
Campos
Identidad
| Campo | Tipo | Descripción |
|---|---|---|
id | PK | Autoincremento |
organization | FK → core.Organization | Alcance multi-tenant |
target | FK → monitoring.MonitoringTarget | Dispositivo/host monitoreado |
Anomalía original
| Campo | Tipo | Descripción |
|---|---|---|
anomaly_trigger | CharField(500) | Nombre/tipo de la alerta que dispara el insight (p.ej. “Interface Down”, “DHCP Pool Exhaustion”) |
snmp_data | JSONField | Raw SNMP walk / MIB values (-- para missing) |
ssh_logs | JSONField | Raw syslog / SSH logs (sanitizados para no exponer credenciales) |
raw_snmp_data | TextField | SNMP output, almacenado para auditabilidad |
raw_ssh_logs | TextField | SSH/syslog output, almacenado para auditabilidad |
Diagnóstico del Tutor
| Campo | Tipo | Descripción |
|---|---|---|
diagnosis_text | TextField | Diagnóstico en lenguaje natural (Tutor) |
summary | CharField(500) | Resumen ejecutivo del problema |
osi_layer | IntegerField(1-7, nullable) | Capa OSI (1=Physical, 2=DataLink, 3=Network, etc.) |
confidence_score | FloatField(0.0-1.0) | Confianza del Tutor en su diagnosis |
telemetry_insight | TextField | Meta-datos sobre el origen del insight (fuente de datos, timestamps, índices) |
Recomendación de acción
| Campo | Tipo | Descripción |
|---|---|---|
action_label | CharField(200) | Acción recomendada (p.ej. “Check interface configuration”, “Restart DHCP service”) |
action_description | TextField | Descripción detallada de la acción |
commands | JSONField | Array de comandos sugeridos (CLI, API, manual steps) |
rollback_commands | JSONField | Rollback en caso de que la acción cause problemas |
Clasificación estructurada (Etapa 3 B18)
| Campo | Tipo | Descripción |
|---|---|---|
category | CharField(20, indexed) | Enum: CONNECTIVITY | SECURITY | PERFORMANCE | OTHER |
Enum AIInsight.Category:
class Category(models.TextChoices):
CONNECTIVITY = "connectivity", "Connectivity"
SECURITY = "security", "Security"
PERFORMANCE = "performance", "Performance"
OTHER = "other", "Other"
Asignación: En create_insight(), vía classify_insight_category(trigger_text + summary_text), que busca keywords hardcodeadas (idénticas a las de la migration 0020 para determinismo).
Control de estado
| Campo | Tipo | Descripción |
|---|---|---|
status | CharField (Enum) | PENDING | ACKNOWLEDGED | RESOLVED |
ai_provider | CharField(50) | “anthropic”, “google”, “openai”, etc. |
acknowledged_at | DateTimeField(nullable) | Timestamp de ACK por el usuario |
acknowledged_notes | TextField(blank) | Notas del usuario |
created_at | DateTimeField(auto_now_add) | Timestamp de creación |
updated_at | DateTimeField(auto_now) | Timestamp de última edición |
Índices
| Campo | Uso |
|---|---|
organization | Scoping: filtrar por tenant |
target | Anomalías de un dispositivo |
status | Estados (PENDING, ACKNOWLEDGED, etc.) |
created_at | Timeseries / historial |
category | Etapa 3: auto_resolve_connectivity_insights() filtra category=CONNECTIVITY directamente |
Flujo de creación
- Anomalía detectada: MonitoringAlert → spike o threshold violation.
- Recolectar contexto: SNMP walk, SSH log snapshot, syslog.
- Llamada al Tutor:
create_insight(target, anomaly_description, snmp_data, ssh_logs, ...). - Clasificación automática:
classify_insight_category(f"{anomaly_description} {diagnosis_summary}")→ asignacategory. - Almacenar en DB:
AIInsight+AIInsightAuditLog.
Flujo de resolución automática (Etapa 3)
Antes (B18):
pending = AIInsight.objects.filter(target_id=target_id, status=PENDING)
for insight in pending:
text = f"{insight.summary} {insight.anomaly_trigger}".lower()
if any(kw in text for kw in ["total loss", "100%", ...]): # Substring match ❌
insight.status = ACKNOWLEDGED
Después (Etapa 3):
pending = AIInsight.objects.filter(
target_id=target_id,
status=PENDING,
category=AIInsight.Category.CONNECTIVITY # Estructurado, indexed ✓
)
for insight in pending:
insight.status = ACKNOWLEDGED # Sin regex
Ventajas:
- Más eficiente (query directa en DB vs. bucle en Python).
- Más mantenible (categoría definida en
create_insight, no en lógica de resolución). - Extensible (agregar SECURITY / PERFORMANCE auto-resolve en el futuro sin tocar modelo).
Migración 0020
Fecha: 2026-06-05 | Status: RunPython autónomo
La migración:
- Añade campo
category(CharField, choices, indexed, default=“other”). - Backfill: itera todos los
AIInsightexistentes, aplica la función_classify(snapshot de keywords) a cada uno. - Solo actualiza si
category != "other"(optimización: evita touchdowns innecesarios). - Bulk update en batches de 500 filas.
- Rollback:
noop_reverse(no puede deshacer el backfill de forma limpia sin pérdida de info).
Snapshot de keywords en la migration:
_CONNECTIVITY = ["total loss", "unreachable", "100%", "device down", "link_down", "link down"]
_SECURITY = ["rogue", "deauth", "evil twin", "arp spoof", ..., "spoofing"]
_PERFORMANCE = ["latency", "packet loss", ..., "duplex"]
Idéntico a insight_service._CONNECTIVITY_KEYWORDS etc., asegurando determinismo histórico.
Relaciones
| Relación | Modelo | Descripción |
|---|---|---|
organization | core.Organization | Multi-tenancy: un insight solo es visible a su org |
target | MonitoringTarget | FK: el insight está vinculado a un dispositivo/host |
audit_logs (reverse) | AIInsightAuditLog | Historial de cambios (creación, ACK, resolución) |
Auditoría
Todo cambio de estado crea un AIInsightAuditLog:
AIInsightAuditLog.objects.create(
insight=insight,
action="created" | "acknowledged" | "auto_resolved",
details={"reason": "...", "provider": "..."}
)
Véase también
- [[feature—monitoring—cierre-deudas-sa3]]
- [[entity—monitoring—service—insight-service]]
- [[entity—monitoring—model—monitoring-target]]
- [[entity—monitoring—model—monitoring-alert]]
- [[entity—monitoring—service—http-service]]
Referenciado desde
- Cierre de deudas Etapa 3 SA3 — DNS-rebinding + clasificación de insights
- Migración 0029 — Backfill del ciclo de cierre ITSM: resolved_at, grupos, patrones
- Patrón de renderizado Markdown → HTML en CNS y Help Widget
- Servicio insight_service — clasificación y generación de insights de IA
- Servicio notification_service — webhook y notificación con DNS-rebinding defense