Class: OpenTelemetry::Instrumentation::Excon::Middlewares::Dup::TracerMiddleware

Inherits:
Excon::Middleware::Base
  • Object
show all
Defined in:
lib/opentelemetry/instrumentation/excon/middlewares/dup/tracer_middleware.rb

Overview

Excon middleware for instrumentation

Constant Summary collapse

HTTP_METHODS_TO_UPPERCASE =
%w[connect delete get head options patch post put trace].each_with_object({}) do |method, hash|
  uppercase_method = method.upcase
  hash[method] = uppercase_method
  hash[method.to_sym] = uppercase_method
  hash[uppercase_method] = uppercase_method
end.freeze
HTTP_METHODS_TO_SPAN_NAMES =
HTTP_METHODS_TO_UPPERCASE.values.each_with_object({}) do |uppercase_method, hash|
  hash[uppercase_method] ||= uppercase_method
end.freeze
HTTP_STATUS_SUCCESS_RANGE =

Constant for the HTTP status range

(100..399)

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.around_default_stackObject

Returns a copy of the default stack with the trace middleware injected



72
73
74
75
76
77
78
79
80
81
# File 'lib/opentelemetry/instrumentation/excon/middlewares/dup/tracer_middleware.rb', line 72

def self.around_default_stack
  ::Excon.defaults[:middlewares].dup.tap do |default_stack|
    # If the default stack contains a version of the trace middleware already...
    existing_trace_middleware = default_stack.find { |m| m <= TracerMiddleware }
    default_stack.delete(existing_trace_middleware) if existing_trace_middleware
    # Inject after the ResponseParser middleware
    response_middleware_index = default_stack.index(::Excon::Middleware::ResponseParser).to_i
    default_stack.insert(response_middleware_index + 1, self)
  end
end

Instance Method Details

#error_call(datum) ⇒ Object



66
67
68
69
# File 'lib/opentelemetry/instrumentation/excon/middlewares/dup/tracer_middleware.rb', line 66

def error_call(datum)
  handle_response(datum)
  @stack.error_call(datum)
end

#request_call(datum) ⇒ Object



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/opentelemetry/instrumentation/excon/middlewares/dup/tracer_middleware.rb', line 28

def request_call(datum)
  return @stack.request_call(datum) if untraced?(datum)

  http_method = HTTP_METHODS_TO_UPPERCASE[datum[:method]]
  cleansed_url = OpenTelemetry::Common::Utilities.cleanse_url(::Excon::Utils.request_uri(datum))
  attributes = {
    OpenTelemetry::SemanticConventions::Trace::HTTP_HOST => datum[:host],
    OpenTelemetry::SemanticConventions::Trace::HTTP_METHOD => http_method,
    OpenTelemetry::SemanticConventions::Trace::HTTP_SCHEME => datum[:scheme],
    OpenTelemetry::SemanticConventions::Trace::HTTP_TARGET => datum[:path],
    OpenTelemetry::SemanticConventions::Trace::HTTP_URL => cleansed_url,
    OpenTelemetry::SemanticConventions::Trace::NET_PEER_NAME => datum[:hostname],
    OpenTelemetry::SemanticConventions::Trace::NET_PEER_PORT => datum[:port],
    'http.request.method' => http_method,
    'url.scheme' => datum[:scheme],
    'url.path' => datum[:path],
    'url.full' => cleansed_url,
    'server.address' => datum[:hostname],
    'server.port' => datum[:port]
  }
  attributes['url.query'] = datum[:query] if datum[:query]
  peer_service = Excon::Instrumentation.instance.config[:peer_service]
  attributes[OpenTelemetry::SemanticConventions::Trace::PEER_SERVICE] = peer_service if peer_service
  attributes.merge!(OpenTelemetry::Common::HTTP::ClientContext.attributes)
  span = tracer.start_span(HTTP_METHODS_TO_SPAN_NAMES[http_method], attributes: attributes, kind: :client)
  ctx = OpenTelemetry::Trace.context_with_span(span)
  datum[:otel_span] = span
  datum[:otel_token] = OpenTelemetry::Context.attach(ctx)
  OpenTelemetry.propagation.inject(datum[:headers])
  @stack.request_call(datum)
end

#response_call(datum) ⇒ Object



60
61
62
63
64
# File 'lib/opentelemetry/instrumentation/excon/middlewares/dup/tracer_middleware.rb', line 60

def response_call(datum)
  @stack.response_call(datum).tap do |d|
    handle_response(d)
  end
end