class OpenTracing::Instrumentation::Rack::TraceMiddleware

TraceMiddleware observer rack requests.

Constants

DEFAULT_COMMAND_NAME_BUILDER
REQUEST_URI

Attributes

app[R]
http_tagger[R]
logger[R]
tracer[R]

Public Class Methods

new( app, logger: nil, command_name_builder: DEFAULT_COMMAND_NAME_BUILDER, http_tagger: HttpTagger.new, tracer: OpenTracing.global_tracer ) click to toggle source
# File lib/opentracing/instrumentation/rack/trace_middleware.rb, line 12
def initialize(
  app,
  logger: nil,
  command_name_builder: DEFAULT_COMMAND_NAME_BUILDER,
  http_tagger: HttpTagger.new,
  tracer: OpenTracing.global_tracer
)
  @app = app
  @logger = logger
  @command_name_builder = command_name_builder
  @http_tagger = http_tagger
  @tracer = tracer
end

Public Instance Methods

call(env) click to toggle source
# File lib/opentracing/instrumentation/rack/trace_middleware.rb, line 26
def call(env)
  trace_request(env) do |span|
    catch_error(span) do
      status, headers, body = app.call(env)

      set_response_tags(span, status, headers)
      [status, headers, body]
    end
  end
end

Private Instance Methods

catch_error(span) { || ... } click to toggle source
# File lib/opentracing/instrumentation/rack/trace_middleware.rb, line 57
def catch_error(span)
  yield
rescue StandardError => e
  logger&.error(e)
  error_tag(span, e)
  raise
end
error_tag(span, error) click to toggle source
# File lib/opentracing/instrumentation/rack/trace_middleware.rb, line 90
def error_tag(span, error)
  span.set_tag('error', true)
  span.log_kv('error.kind': error.class.to_s)
end
request_tags(env) click to toggle source
# File lib/opentracing/instrumentation/rack/trace_middleware.rb, line 67
def request_tags(env)
  {
    'http.method' => env[::Rack::REQUEST_METHOD],
    'http.url' => env[REQUEST_URI],
    'span.kind' => 'server',
  }.merge(http_tagger.request_tags(env))
end
set_header_tags(span, headers) click to toggle source
# File lib/opentracing/instrumentation/rack/trace_middleware.rb, line 84
def set_header_tags(span, headers)
  http_tagger
    .response_tags(headers)
    .each { |(key, value)| span.set_tag(key, value) }
end
set_response_tags(span, status, headers) click to toggle source
# File lib/opentracing/instrumentation/rack/trace_middleware.rb, line 75
def set_response_tags(span, status, headers)
  set_status_tag(span, status)
  set_header_tags(span, headers)
end
set_status_tag(span, status) click to toggle source
# File lib/opentracing/instrumentation/rack/trace_middleware.rb, line 80
def set_status_tag(span, status)
  span.set_tag('http.status', status)
end
trace_request(env) { |span| ... } click to toggle source
# File lib/opentracing/instrumentation/rack/trace_middleware.rb, line 44
def trace_request(env)
  extracted_ctx = tracer.extract(OpenTracing::FORMAT_RACK, env)
  logger&.info('Tracing context extracted') if extracted_ctx
  command_name = @command_name_builder.build_command_name(env)
  tracer.start_active_span(
    command_name,
    child_of: extracted_ctx,
    tags: request_tags(env),
  ) do |scope|
    yield(scope.span)
  end
end