Log Analysis · Loki → LLM → Discord
Cada hora, este workflow consulta Loki buscando errores en los logs del cluster, procesa los resultados con JavaScript para optimizar el uso de tokens, los analiza con LLM y genera un reporte de salud del sistema en Discord.
Flujo del Workflow
Cinco nodos. A diferencia del Workflow 1 que es reactivo (webhook), este es proactivo (cron). No espera a que algo falle — busca proactivamente patrones de error en los logs.
Dispara el workflow automaticamente cada hora (0 * * * *). No requiere intervencion manual.
GET a la API de Loki consultando logs con nivel ERROR o WARN de las ultimas 2 horas en el namespace aiops.
JavaScript que agrupa los logs por servicio, limita a 20 lineas para no exceder tokens del LLM, y limpia timestamps y metadata innecesaria.
Envia los logs procesados al LLM para que identifique patrones, priorice problemas y sugiera acciones.
Envia el analisis del LLM a Discord como un mensaje estructurado con embed.
Query de Loki
La query busca patrones de error en los logs usando regex. Se limita a 50 resultados para mantener el tiempo de respuesta bajo y no saturar al LLM con tokens innecesarios.
GET http://loki.aiops.svc.cluster.local:3100/loki/api/v1/query_range
Query Params:
query: {namespace="aiops"} |~ "(?i)(error|warn|fail|critical)"
start: {{ $now.minus(7200) }}
end: {{ $now }}
limit: 50 Procesamiento con JavaScript
El nodo Code procesa los resultados de Loki antes de enviarlos al LLM. Agrupa por aplicacion, limita lineas y limpia metadata. Sin este paso, los logs crudos excederian el limite de tokens del modelo.
// Procesar resultados de Loki para el LLM
const streams = $input.first().json.data.result;
if (!streams || streams.length === 0) {
return [{ summary: 'No errors found' }];
}
// Agrupar por app y limitar lineas
const byApp = {};
streams.forEach(s => {
const app = s.stream.app || 'unknown';
if (!byApp[app]) byApp[app] = [];
s.values.forEach(v => byApp[app].push(v[1]));
});
// Limitar a 20 lineas total
let lines = [];
Object.entries(byApp).forEach(([app, logs]) => {
lines.push(`--- ${app} (${logs.length} errors) ---`);
lines = lines.concat(logs.slice(0, 5));
});
return [{ logSummary: lines.slice(0, 20).join('\n') }]; Variantes del Workflow
El workflow de analisis de logs tiene dos variantes complementarias que corren con diferentes frecuencias.
Siguiente: Workflow 3 — Incident Simulation
El momento de la verdad: grabar el loop completo crash → alerta → LLM → Discord. La demo que va en el README del proyecto.