Class: Sidekiq::ResourceTelemetryMiddleware

Inherits:
Object
  • Object
show all
Includes:
ServerMiddleware
Defined in:
lib/sidekiq/resource_telemetry_middleware.rb

Overview

Records duration and process-RSS movement for every completed Sidekiq job.
Slow jobs and jobs followed by a large RSS increase also emit a structured
Rails event so AppSignal logs can identify workloads that deserve profiling.

Constant Summary collapse

DEFAULT_LONG_JOB_SECONDS =
60
DEFAULT_RSS_GROWTH_MB =
128

Instance Method Summary collapse

Constructor Details

#initialize(options = {}) ⇒ ResourceTelemetryMiddleware

Returns a new instance of ResourceTelemetryMiddleware.

Parameters:

  • options (Hash) (defaults to: {})

Options Hash (options):

  • :role (String)

    stable process role used in metrics

  • :long_job_seconds (Numeric)

    event threshold for duration

  • :rss_growth_mb (Numeric)

    event threshold for RSS growth



20
21
22
23
24
# File 'lib/sidekiq/resource_telemetry_middleware.rb', line 20

def initialize(options = {})
  @role = options.fetch(:role, ENV.fetch('SIDEKIQ_ROLE', 'sidekiq')).to_s
  @long_job_seconds = Float(options.fetch(:long_job_seconds, DEFAULT_LONG_JOB_SECONDS))
  @rss_growth_mb = Float(options.fetch(:rss_growth_mb, DEFAULT_RSS_GROWTH_MB))
end

Instance Method Details

#call(worker, job, queue) { ... } ⇒ Object

Returns the wrapped worker's result.

Parameters:

  • worker (Object)
  • job (Hash)
  • queue (String)

Yields:

  • the next server middleware or worker

Returns:

  • (Object)

    the wrapped worker's result



31
32
33
34
35
36
37
38
39
40
41
# File 'lib/sidekiq/resource_telemetry_middleware.rb', line 31

def call(worker, job, queue)
  started_at = safely_measure { monotonic_time }
  rss_before = safely_measure { current_rss_mb }
  completed = false

  result = yield
  completed = true
  result
ensure
  safely_record(worker, job, queue, started_at, rss_before, completed:)
end