Monitoreo en Tiempo Real de Tareas Asíncronas con Sidekiq-Status

Sidekiq-status es una extensión ligera y robusta para Sidekiq que permite supervisar el ciclo de vida completo de trabajos en segundo plano: desde su puesta en cola hasta su finalización o fallo, incluyendo progreso intermedio con granularidad.

Características clave

  • Indicadores de avance dinámicos: establece un total esperado y actualiza el índice actual para calcular automáticamente porcentajes
  • Ciclo de estados extendido: distingue entre queued, working, complete, failed, stopped y paused
  • Integración nativa con la UI de Sidekiq: agrega pestañas y endpoints específicos sin necesidad de construir dashboards desde cero

Instalación y configuración mínima

Agrega la gema al archivo Gemfile:

gem 'sidekiq-status', '~> 3.0'

Ejecuta bundle install, luego configura los middlewares en config/initializers/sidekiq.rb:

require 'sidekiq-status'

Sidekiq.configure_client do |cfg|
  cfg.client_middleware { |chain| chain.add Sidekiq::Status::ClientMiddleware }
end

Sidekiq.configure_server do |cfg|
  cfg.server_middleware { |chain| chain.add Sidekiq::Status::ServerMiddleware, expiration: 25.minutes }
end

Exposición de la interfaz web

En config/routes.rb, monta el panel adicional:

require 'sidekiq/web'
require 'sidekiq-status/web'

authenticate :admin do
  mount Sidekiq::Web => '/admin/sidekiq'
end

Definición de trabajadores rasterables

Extiende tu worker con el módulo Sidekiq::Status::Worker y usa métodos como total(), at() y message():

class DataImportJob
  include Sidekiq::Worker
  include Sidekiq::Status::Worker

  def perform(batch_id)
    records = Batch.find(batch_id).records
    total(records.count)

    records.each_with_index do |record, idx|
      at(idx + 1)
      message("Procesando #{record.id}")
      record.process! rescue nil
      sleep 0.2
    end
  end
end

Consulta programática del estado

Desde cualquire parte de la aplicación, obtén métricas en tiempo real:

job = DataImportJob.perform_async(123)
status_key = job.jid

# Estado general
Sidekiq::Status.status(status_key) # => "working"

# Porcentaje completado (entero entre 0 y 100)
Sidekiq::Status.pct_complete(status_key) # => 67

# Datos estructurados completos
Sidekiq::Status::Hash.get(status_key)
# => { "at" => 67, "total" => 100, "pct_complete" => 67, "message" => "Procesando 4582", "status" => "working" }

Opciones avanzadas

Personaliza la duración de los metadatos por clase de trabajo:

class ShortLivedJob
  include Sidekiq::Worker
  include Sidekiq::Status::Worker
  self.expiration = 5.minutes
end

Implementa manejo de interrupción con verificación explícita:

def perform
  total(200)
  200.times do |step|
    raise Sidekiq::Status::Stop if stopped?
    at(step + 1)
    process_step(step)
  end
end

Etiquetas: sidekiq ruby-on-rails Ruby background-jobs task-monitoring

Publicado el 10-11 21:29