[FIX] Bitácora Web: Filtrar logs de PostgreSQL en heartbeats

Se implementó filtrado de output para que la Bitácora Web muestre
solo las líneas relevantes del progreso del dron, no los ~40 logs
repetitivos de conexión a PostgreSQL.

Cambios:
- filtrar_lineas_relevantes(): Filtra líneas de PostgreSQL en tiempo real
- filtrar_output_relevante(): Filtra y mantiene últimas 20 líneas para heartbeat
- Heartbeat web: Ahora muestra solo progreso del dron, no conexiones DB

Beneficio: La Bitácora Web ahora muestra información útil y legible
en lugar de cientos de líneas de logs técnicos repetitivos.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Ricardo Monla
2026-04-15 11:26:13 -03:00
co-authored by Claude Opus 4.6
parent db86f86e59
commit b7ff2e7183
+39 -7
View File
@@ -80,11 +80,11 @@ module Dron
start_time = Time.now start_time = Time.now
output = [] output = []
last_out = "" last_out = ""
accumulated_out = [] # Acumular todas las líneas de output para el heartbeat accumulated_out = [] # Acumular líneas relevantes para heartbeat web
exit_code = nil exit_code = nil
progreso_visible = !ENV['BATCH_MODE'] # Solo mostrar progreso si no es batch progreso_visible = !ENV['BATCH_MODE']
# Mostrar encabezado de progreso # Mostrar encabezado de progreso (solo CLI)
if progreso_visible if progreso_visible
puts "\n#{Color::BOLD}#{Color::CYAN}⏳ Ejecutando...#{Color::RESET}" puts "\n#{Color::BOLD}#{Color::CYAN}⏳ Ejecutando...#{Color::RESET}"
print " [" print " ["
@@ -102,10 +102,13 @@ module Dron
# Actualizar tabla interna (dron_logs.heartbeat) # Actualizar tabla interna (dron_logs.heartbeat)
ADN::DB::DronDB.actualizar_heartbeat(dron_id) ADN::DB::DronDB.actualizar_heartbeat(dron_id)
# Actualizar Bitácora Web (events.descripcion) — VISIBLE para el usuario # Actualizar Bitácora Web con output filtrado (solo líneas relevantes)
actualizar_heartbeat_web(evento_id, dron_id, nota, cmd, inicio, tick, accumulated_out.join("\n")) if evento_id if evento_id
output_filtrado = filtrar_output_relevante(accumulated_out)
actualizar_heartbeat_web(evento_id, dron_id, nota, cmd, inicio, tick, output_filtrado.join("\n"))
end
# Actualizar barra de progreso local # Actualizar barra de progreso local (solo CLI)
if progreso_visible if progreso_visible
mins = elapsed / 60 mins = elapsed / 60
segs = elapsed % 60 segs = elapsed % 60
@@ -126,7 +129,9 @@ module Dron
output << chunk output << chunk
lineas = chunk.split(/[\r\n]/).reject(&:empty?) lineas = chunk.split(/[\r\n]/).reject(&:empty?)
last_out = lineas.last&.strip || last_out last_out = lineas.last&.strip || last_out
accumulated_out.concat(lineas) # Acumular líneas para heartbeat # Filtrar y acumular solo líneas relevantes (no PostgreSQL)
lineas_relevantes = filtrar_lineas_relevantes(lineas)
accumulated_out.concat(lineas_relevantes) unless lineas_relevantes.empty?
end end
rescue EOFError, IOError rescue EOFError, IOError
end end
@@ -159,6 +164,33 @@ module Dron
{ exit_code: exit_code || 1, output: safe_output, duration: (Time.now - start_time).round(2) } { exit_code: exit_code || 1, output: safe_output, duration: (Time.now - start_time).round(2) }
end end
# ─── Filtrado de output para Bitácora Web ─────────────────────
# Filtra líneas repetitivas de PostgreSQL y deja solo lo relevante
def filtrar_lineas_relevantes(lineas)
lineas.reject do |linea|
# Filtrar logs de conexión a PostgreSQL (son ~40 líneas repetitivas por dron)
linea.include?('Conectando a PostgreSQL') ||
linea.include?('Conexión a PostgreSQL establecida') ||
linea.include?('Conexión a PostgreSQL cerrada') ||
linea.include?(' Conectando') ||
linea.include?(' Conexión')
end
end
def filtrar_output_relevante(accumulated_out)
# Filtrar y dejar solo las últimas 20 líneas relevantes
filtrado = accumulated_out.reject do |linea|
linea.include?('Conectando a PostgreSQL') ||
linea.include?('Conexión a PostgreSQL') ||
linea.include?(' Conectando') ||
linea.include?(' Conexión')
end
# Mantener últimas 20 líneas para no saturar la bitácora
filtrado.last(20) || []
end
# ─── Bitácora Web: Crear/Vincular evento ───────────────────── # ─── Bitácora Web: Crear/Vincular evento ─────────────────────
def crear_o_vincular_evento_web(dron_id, nota, evento_id, cmd, nodo) def crear_o_vincular_evento_web(dron_id, nota, evento_id, cmd, nodo)