Skip to content

Instantly share code, notes, and snippets.

@Envek
Last active June 28, 2022 10:04
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Envek/3f1ce54007b17a95cc36d3e7f53f15bb to your computer and use it in GitHub Desktop.
Save Envek/3f1ce54007b17a95cc36d3e7f53f15bb to your computer and use it in GitHub Desktop.
Examples of Sidekiq middlewares and exporter to collect and report essential Sidekiq metrics
class SidekiqMetricsServerMiddleware
def call(worker, job, queue)
prometheus = Prometheus::Client.registry
labels = { queue: queue, worker: worker.class }
start = Time.now
begin
yield
prometheus.get(:sidekiq_jobs_success_total).increment(labels)
rescue Exception # rubocop: disable Lint/RescueException
prometheus.get(:sidekiq_jobs_failed_total).increment(labels)
raise
ensure
prometheus.get(:sidekiq_job_runtime_seconds) \
.observe(labels, (Time.now - start).round(3))
prometheus.get(:sidekiq_jobs_executed_total).increment(labels)
end
end
class SidekiqMetricsClientMiddleware
def call(worker, job, queue, _redis_pool)
prometheus = Prometheus::Client.registry
labels = { queue: queue, worker: worker.class }
prometheus.get(:sidekiq_jobs_enqueued_total).increment(labels)
yield
end
end
class SidekiqExporter < Prometheus::Middleware::Exporter
def call(env)
refresh_sidekiq_stats if env["REQUEST_PATH"].start_with?(path)
super
end
def refresh_sidekiq_stats
r = Prometheus.registry
stats = ::Sidekiq::Stats.new
stats.queues.each do |k, v|
r.get(:sidekiq_jobs_waiting_count).set({ queue: k }, v)
end
r.get(:sidekiq_active_workers_count).set({}, stats.workers_size)
r.get(:sidekiq_jobs_scheduled_count).set({}, stats.scheduled_size)
r.get(:sidekiq_jobs_dead_count).set({}, stats.dead_size)
r.get(:sidekiq_active_processes).set({}, stats.processes_size)
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment