Class: JCW::Rack::Tracer

Inherits:
Object
  • Object
show all
Defined in:
lib/jcw/rack_tracer.rb

Constant Summary collapse

REQUEST_URI =
"REQUEST_URI"
REQUEST_PATH =
"REQUEST_PATH"
REQUEST_METHOD =
"REQUEST_METHOD"

Instance Method Summary collapse

Constructor Details

#initialize(app, tracer: OpenTracing.global_tracer, on_start_span: nil, on_finish_span: nil, trust_incoming_span: true, ignore_path_patterns: Wrapper.config.rack_ignore_path_patterns, errors: [StandardError]) ⇒ Tracer

Create a new Rack Tracer middleware.

Parameters:

  • app

    The Rack application/middlewares stack.

  • tracer (OpenTracing::Tracer) (defaults to: OpenTracing.global_tracer)

    A tracer to be used when start_span, and extract is called.

  • on_start_span (Proc, nil) (defaults to: nil)

    A callback evaluated after a new span is created.

  • on_finish_span (Proc, nil) (defaults to: nil)

    A callback evaluated after a span is finished.

  • ignore_path_patterns (Array<Class>) (defaults to: Wrapper.config.rack_ignore_path_patterns)

    An array of paths to be skiped by the tracer.

  • errors (Array<Class>) (defaults to: [StandardError])

    An array of error classes to be captured by the tracer as errors. Errors are not muted by the middleware, they’re re-raised afterwards.



21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/jcw/rack_tracer.rb', line 21

def initialize(app, # rubocop:disable Metrics/ParameterLists
               tracer: OpenTracing.global_tracer,
               on_start_span: nil,
               on_finish_span: nil,
               trust_incoming_span: true,
               ignore_path_patterns: Wrapper.config.rack_ignore_path_patterns,
               errors: [StandardError])
  @app = app
  @tracer = tracer
  @on_start_span = on_start_span
  @on_finish_span = on_finish_span
  @trust_incoming_span = trust_incoming_span
  @errors = errors
  @ignore_path_patterns = ignore_path_patterns
end

Instance Method Details

#call(env) ⇒ Object



37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/jcw/rack_tracer.rb', line 37

def call(env)
  method = env[REQUEST_METHOD]
  path = env[REQUEST_PATH]
  url = env[REQUEST_URI]

  return @app.call(env) if @ignore_path_patterns.find { |pattern| pattern === path }

  set_extract_env(env)
  context = @tracer.extract(OpenTracing::FORMAT_TEXT_MAP, env) if @trust_incoming_span
  scope = build_scope(method, url, context)
  span = scope.span
  perform_on_start_span(env, span, @on_start_span)
  call_request(env, span)
rescue *@errors => error
  build_error_log(span, error)
  raise
ensure
  begin
    close_scope(scope)
  ensure
    perform_on_finish_span(span)
  end
end