class OpenTelemetry::Instrumentation::Sidekiq::Middlewares::Server::TracerMiddleware

TracerMiddleware propagates context and instruments Sidekiq requests by way of its middleware system

Public Instance Methods

call(_worker, msg, _queue) { || ... } click to toggle source
# File lib/opentelemetry/instrumentation/sidekiq/middlewares/server/tracer_middleware.rb, line 15
def call(_worker, msg, _queue) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/PerceivedComplexity
  attributes = {
    'messaging.system' => 'sidekiq',
    'messaging.sidekiq.job_class' => msg['wrapped']&.to_s || msg['class'],
    'messaging.message_id' => msg['jid'],
    'messaging.destination' => msg['queue'],
    'messaging.destination_kind' => 'queue'
  }
  attributes['peer.service'] = config[:peer_service] if config[:peer_service]

  span_name = case config[:span_naming]
              when :job_class then "#{msg['wrapped']&.to_s || msg['class']} process"
              else "#{msg['queue']} process"
              end

  extracted_context = OpenTelemetry.propagation.extract(msg)
  OpenTelemetry::Context.with_current(extracted_context) do
    if config[:propagation_style] == :child
      tracer.in_span(span_name, attributes: attributes, kind: :consumer) do |span|
        span.add_event('created_at', timestamp: msg['created_at'])
        span.add_event('enqueued_at', timestamp: msg['enqueued_at'])
        yield
      end
    else
      links = []
      span_context = OpenTelemetry::Trace.current_span(extracted_context).context
      links << OpenTelemetry::Trace::Link.new(span_context) if config[:propagation_style] == :link && span_context.valid?
      span = tracer.start_root_span(span_name, attributes: attributes, links: links, kind: :consumer)
      OpenTelemetry::Trace.with_span(span) do
        span.add_event('created_at', timestamp: msg['created_at'])
        span.add_event('enqueued_at', timestamp: msg['enqueued_at'])
        yield
      rescue Exception => e # rubocop:disable Lint/RescueException
        span.record_exception(e)
        span.status = OpenTelemetry::Trace::Status.error("Unhandled exception of type: #{e.class}")
        raise e
      ensure
        span.finish
      end
    end
  end
end

Private Instance Methods

config() click to toggle source
# File lib/opentelemetry/instrumentation/sidekiq/middlewares/server/tracer_middleware.rb, line 60
def config
  Sidekiq::Instrumentation.instance.config
end
tracer() click to toggle source
# File lib/opentelemetry/instrumentation/sidekiq/middlewares/server/tracer_middleware.rb, line 64
def tracer
  Sidekiq::Instrumentation.instance.tracer
end