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,stoppedypaused - 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