module OpenTelemetry::Instrumentation::Ethon::Patches::Easy

Ethon::Easy patch for instrumentation

Constants

ACTION_NAMES_TO_HTTP_METHODS
HTTP_METHODS_TO_SPAN_NAMES

Public Instance Methods

complete() click to toggle source
Calls superclass method
# File lib/opentelemetry/instrumentation/ethon/patches/easy.rb, line 35
def complete
  begin
    response_options = mirror.options
    response_code = (response_options[:response_code] || response_options[:code]).to_i
    if response_code.zero?
      return_code = response_options[:return_code]
      message = return_code ? ::Ethon::Curl.easy_strerror(return_code) : 'unknown reason'
      @otel_span.status = OpenTelemetry::Trace::Status.error("Request has failed: #{message}")
    else
      @otel_span.set_attribute('http.status_code', response_code)
      @otel_span.status = OpenTelemetry::Trace::Status.error unless (100..399).include?(response_code.to_i)
    end
  ensure
    @otel_span.finish
    @otel_span = nil
  end
  super
end
headers=(headers) click to toggle source
Calls superclass method
# File lib/opentelemetry/instrumentation/ethon/patches/easy.rb, line 24
def headers=(headers)
  # Store headers to call this method again when span is ready
  @otel_original_headers = headers
  super
end
http_request(url, action_name, options = {}) click to toggle source
Calls superclass method
# File lib/opentelemetry/instrumentation/ethon/patches/easy.rb, line 19
def http_request(url, action_name, options = {})
  @otel_method = ACTION_NAMES_TO_HTTP_METHODS[action_name]
  super
end
otel_before_request() click to toggle source
# File lib/opentelemetry/instrumentation/ethon/patches/easy.rb, line 62
def otel_before_request
  method = 'N/A' # Could be GET or not HTTP at all
  method = @otel_method if instance_variable_defined?(:@otel_method) && !@otel_method.nil?

  @otel_span = tracer.start_span(
    HTTP_METHODS_TO_SPAN_NAMES[method],
    attributes: span_creation_attributes(method),
    kind: :client
  )

  @otel_original_headers ||= {}
  OpenTelemetry::Trace.with_span(@otel_span) do
    OpenTelemetry.propagation.inject(@otel_original_headers)
  end
  self.headers = @otel_original_headers
end
otel_span_started?() click to toggle source
# File lib/opentelemetry/instrumentation/ethon/patches/easy.rb, line 79
def otel_span_started?
  instance_variable_defined?(:@otel_span) && !@otel_span.nil?
end
perform() click to toggle source
Calls superclass method
# File lib/opentelemetry/instrumentation/ethon/patches/easy.rb, line 30
def perform
  otel_before_request
  super
end
reset() click to toggle source
Calls superclass method
# File lib/opentelemetry/instrumentation/ethon/patches/easy.rb, line 54
def reset
  super
ensure
  @otel_span = nil
  @otel_method = nil
  @otel_original_headers = nil
end

Private Instance Methods

span_creation_attributes(method) click to toggle source
# File lib/opentelemetry/instrumentation/ethon/patches/easy.rb, line 85
def span_creation_attributes(method)
  instrumentation_attrs = {
    'http.method' => method,
    'http.url' => OpenTelemetry::Common::Utilities.cleanse_url(url)
  }
  config = Ethon::Instrumentation.instance.config
  instrumentation_attrs['peer.service'] = config[:peer_service] if config[:peer_service]
  instrumentation_attrs.merge(
    OpenTelemetry::Common::HTTP::ClientContext.attributes
  )
end
tracer() click to toggle source
# File lib/opentelemetry/instrumentation/ethon/patches/easy.rb, line 97
def tracer
  Ethon::Instrumentation.instance.tracer
end