class OpenTracing::Instrumentation::Rack::ExtractMiddleware

ExtractMiddleware extract trace context and push it to scope manager.

Public Class Methods

new( app, tracer: OpenTracing.global_tracer, logger: nil ) click to toggle source

@param app [RackApp] inner rack application @param tracer [OpenTracing::Tracer] @param logger [Logger]

# File lib/opentracing/instrumentation/rack/extract_middleware.rb, line 22
def initialize(
  app,
  tracer: OpenTracing.global_tracer,
  logger: nil
)
  @app = app
  @tracer = tracer
  @logger = logger
end

Public Instance Methods

call(env) click to toggle source

@param env [Hash<String, String>] rack env

# File lib/opentracing/instrumentation/rack/extract_middleware.rb, line 33
def call(env)
  span_context = @tracer.extract(OpenTracing::FORMAT_RACK, env)
  return @app.call(env) unless span_context

  with_scope(span_context) do
    @app.call(env)
  end
end

Private Instance Methods

safe_close_scope(scope) click to toggle source
# File lib/opentracing/instrumentation/rack/extract_middleware.rb, line 60
def safe_close_scope(scope)
  scope&.close
rescue StandardError => e
  @logger&.error(e)
end
safe_create_scope(span_context) click to toggle source
# File lib/opentracing/instrumentation/rack/extract_middleware.rb, line 52
def safe_create_scope(span_context)
  fake_span = FakeSpan.new(span_context)
  @tracer.scope_manager.activate(fake_span, finish_on_close: false)
rescue StandardError => e
  @logger&.error(e)
  nil
end
with_scope(span_context) { || ... } click to toggle source
# File lib/opentracing/instrumentation/rack/extract_middleware.rb, line 44
def with_scope(span_context)
  scope = safe_create_scope(span_context)

  yield
ensure
  safe_close_scope(scope)
end