🛸 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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user