🛸 Fase 1.5 completa: AtomicDrones con visibilidad en Bitácora Web

Bugs corregidos (12): B1-B12 — crashes, tipos, métodos, logger
Ejecutor reescrito: evento web → heartbeat 30s → cierre automático
copiloto.rb y novato.rb deprecados → redirigen a dron lanzar
Plan P009 v3.2 — Fase 1.5 100%% completa
This commit is contained in:
Ricardo Monla
2026-04-09 10:12:04 -03:00
parent fb8c8eefe5
commit 6d7394b22e
9 changed files with 415 additions and 147 deletions
+16 -11
View File
@@ -118,8 +118,7 @@ module ADN
# @return [Hash, nil] Datos del dron o nil si no existe
def obtener_dron(dron_id)
sql = 'SELECT * FROM bitacoras.dron_logs WHERE dron_id = $1'
resultado = BitacorasDB::BitacoraDB.with_connection { |db| db.execute(sql, [dron_id]) }.first.to_h
resultado.first
BitacorasDB::BitacoraDB.with_connection { |db| db.execute(sql, [dron_id]) }.first
end
# Obtener drones por estado
@@ -176,8 +175,8 @@ module ADN
RETURNING reintentos
SQL
resultado = BitacorasDB::BitacoraDB.with_connection { |db| db.execute(sql, [dron_id]) }.first.to_h
resultado.first['reintentos'].to_i
resultado = BitacorasDB::BitacoraDB.with_connection { |db| db.execute(sql, [dron_id]) }.first&.to_h
resultado ? resultado['reintentos'].to_i : 0
end
# Registrar avance de un paso en flujo multi-paso
@@ -229,8 +228,7 @@ module ADN
# @return [Hash, nil] Métricas o nil si no existen
def obtener_metricas(fecha:, tipo:)
sql = 'SELECT * FROM bitacoras.dron_metricas WHERE fecha = $1 AND dron_tipo = $2'
resultado = BitacorasDB::BitacoraDB.with_connection { |db| db.execute(sql, [fecha, tipo]) }.first.to_h
resultado.first
BitacorasDB::BitacoraDB.with_connection { |db| db.execute(sql, [fecha, tipo]) }.first&.to_h
end
# Actualizar métricas diarias (llamado automáticamente al finalizar un dron)
@@ -240,13 +238,19 @@ module ADN
dron = obtener_dron(dron_id)
return unless dron
fecha = dron['started_at'].to_date
require 'time'
require 'date'
started_time = dron['started_at'].is_a?(String) ? Time.parse(dron['started_at']) : dron['started_at']
fecha = started_time.to_date
tipo = dron['tipo']
# Calcular duración
started = dron['started_at']
completed = dron['completed_at'] || Time.now
duracion = completed - started
started = started_time
completed_raw = dron['completed_at'] || Time.now
completed = completed_raw.is_a?(String) ? Time.parse(completed_raw) : completed_raw
duracion_secs = (completed - started).to_i
duracion = "#{duracion_secs} seconds"
# Upsert de métricas
sql = <<-SQL
@@ -335,10 +339,11 @@ module ADN
DELETE FROM bitacoras.dron_logs
WHERE estado IN ('completed', 'failed', 'zombie')
AND completed_at < NOW() - INTERVAL '#{dias} days'
RETURNING id
SQL
resultado = BitacorasDB::BitacoraDB.with_connection { |db| db.execute(sql).to_a }
resultado.first['count'].to_i
resultado.length
end
end
end