module Datadog::Tracing::Contrib::HTTPX::Plugin::RequestTracer

  1. lib/httpx/adapters/datadog.rb

Constants

SPAN_REQUEST = "httpx.request"  

Public Instance methods

configuration(request)
[show source]
    # File lib/httpx/adapters/datadog.rb
140 def configuration(request)
141   Datadog.configuration.tracing[:httpx, request.uri.host]
142 end
create_span(request, configuration, start_time)
[show source]
    # File lib/httpx/adapters/datadog.rb
149 def create_span(request, configuration, start_time)
150   Datadog::Tracing.trace(
151     SPAN_REQUEST,
152     service: service_name(request.uri.host, configuration),
153     type: TYPE_OUTBOUND,
154     start_time: start_time
155   )
156 end
enabled?(request)
[show source]
   # File lib/httpx/adapters/datadog.rb
52 def enabled?(request)
53   configuration(request).enabled
54 end
finish(request, response)
[show source]
   # File lib/httpx/adapters/datadog.rb
64 def finish(request, response)
65   request.datadog_span ||= initialize_span(request, request.init_time) if request.init_time
66 
67   finish_span(response, request.datadog_span)
68 end
finish_span(response, span)
[show source]
   # File lib/httpx/adapters/datadog.rb
70 def finish_span(response, span)
71   if response.is_a?(::HTTPX::ErrorResponse)
72     span.set_error(response.error)
73   else
74     span.set_tag(TAG_STATUS_CODE, response.status.to_s)
75 
76     span.set_error(::HTTPX::HTTPError.new(response)) if response.status.between?(400, 599)
77 
78     span.set_tags(
79       Datadog.configuration.tracing.header_tags.response_tags(response.headers.to_h)
80     ) if Datadog.configuration.tracing.respond_to?(:header_tags)
81   end
82 
83   span.finish
84 end
initialize_span(request, start_time)

return a span initialized with the +@request+ state.

[show source]
    # File lib/httpx/adapters/datadog.rb
 87   def initialize_span(request, start_time)
 88     verb = request.verb
 89     uri = request.uri
 90 
 91     config = configuration(request)
 92 
 93     span = create_span(request, config, start_time)
 94 
 95     span.resource = verb
 96 
 97     # Tag original global service name if not used
 98     span.set_tag(TAG_BASE_SERVICE, Datadog.configuration.service) if span.service != Datadog.configuration.service
 99 
100     span.set_tag(TAG_KIND, TAG_CLIENT)
101 
102     span.set_tag(TAG_COMPONENT, "httpx")
103     span.set_tag(TAG_OPERATION, "request")
104 
105     span.set_tag(TAG_URL, request.path)
106     span.set_tag(TAG_METHOD, verb)
107 
108     span.set_tag(TAG_TARGET_HOST, uri.host)
109     span.set_tag(TAG_TARGET_PORT, uri.port)
110 
111     span.set_tag(TAG_PEER_HOSTNAME, uri.host)
112 
113     # Tag as an external peer service
114     if (peer_service = config[:peer_service])
115       span.set_tag(TAG_PEER_SERVICE, peer_service)
116     end
117 
118     if config[:distributed_tracing]
119       propagate_trace_http(
120         Datadog::Tracing.active_trace,
121         request.headers
122       )
123     end
124 
125     # Set analytics sample rate
126     if Contrib::Analytics.enabled?(config[:analytics_enabled])
127       Contrib::Analytics.set_sample_rate(span, config[:analytics_sample_rate])
128     end
129 
130     span.set_tags(
131       Datadog.configuration.tracing.header_tags.request_tags(request.headers.to_h)
132     ) if Datadog.configuration.tracing.respond_to?(:header_tags)
133 
134     span
135 rescue StandardError => e
136   Datadog.logger.error("error preparing span for http request: #{e}")
137   Datadog.logger.error(e.backtrace)
138   end
propagate_trace_http(trace, headers)
[show source]
    # File lib/httpx/adapters/datadog.rb
145 def propagate_trace_http(trace, headers)
146   Datadog::Tracing::Contrib::HTTP.inject(trace, headers)
147 end
reset(request)
[show source]
   # File lib/httpx/adapters/datadog.rb
60 def reset(request)
61   request.datadog_span = nil
62 end
start(request)
[show source]
   # File lib/httpx/adapters/datadog.rb
56 def start(request)
57   request.datadog_span = initialize_span(request, request.init_time)
58 end