module Datadog::Contrib::Ethon::EasyPatch::InstanceMethods

InstanceMethods - implementing instrumentation

Attributes

datadog_configuration[R]

Public Instance Methods

complete() click to toggle source
Calls superclass method
# File lib/ddtrace/contrib/ethon/easy_patch.rb, line 42
def complete
  return super unless tracer_enabled?
  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'
      set_span_error_message("Request has failed: #{message}")
    else
      @datadog_span.set_tag(Datadog::Ext::HTTP::STATUS_CODE, response_code)
      if Datadog::Ext::HTTP::ERROR_RANGE.cover?(response_code)
        set_span_error_message("Request has failed with HTTP error: #{response_code}")
      end
    end
  ensure
    @datadog_span.finish
    @datadog_span = nil
  end
  super
end
datadog_before_request(parent_span: nil) click to toggle source
# File lib/ddtrace/contrib/ethon/easy_patch.rb, line 73
def datadog_before_request(parent_span: nil)
  load_datadog_configuration_for(url)
  @datadog_span = datadog_configuration[:tracer].trace(
    Ext::SPAN_REQUEST,
    service: uri ? service_name(uri.host, datadog_configuration) : datadog_configuration[:service_name],
    span_type: Datadog::Ext::HTTP::TYPE_OUTBOUND
  )
  @datadog_span.parent = parent_span unless parent_span.nil?

  datadog_tag_request

  if datadog_configuration[:distributed_tracing]
    @datadog_original_headers ||= {}
    Datadog::HTTPPropagator.inject!(@datadog_span.context, @datadog_original_headers)
    self.headers = @datadog_original_headers
  end
end
datadog_span_started?() click to toggle source
# File lib/ddtrace/contrib/ethon/easy_patch.rb, line 91
def datadog_span_started?
  instance_variable_defined?(:@datadog_span) && !@datadog_span.nil?
end
headers=(headers) click to toggle source
Calls superclass method
# File lib/ddtrace/contrib/ethon/easy_patch.rb, line 29
def headers=(headers)
  # Store headers to call this method again when span is ready
  @datadog_original_headers = headers
  super
end
http_request(url, action_name, options = {}) click to toggle source
Calls superclass method
# File lib/ddtrace/contrib/ethon/easy_patch.rb, line 20
def http_request(url, action_name, options = {})
  load_datadog_configuration_for(url)
  return super unless tracer_enabled?

  # It's tricky to get HTTP method from libcurl
  @datadog_method = action_name.to_s.upcase
  super
end
perform() click to toggle source
Calls superclass method
# File lib/ddtrace/contrib/ethon/easy_patch.rb, line 35
def perform
  load_datadog_configuration_for(url)
  return super unless tracer_enabled?
  datadog_before_request
  super
end
reset() click to toggle source
Calls superclass method
# File lib/ddtrace/contrib/ethon/easy_patch.rb, line 64
def reset
  super
ensure
  @datadog_span = nil
  @datadog_method = nil
  @datadog_original_headers = nil
  @datadog_configuration = nil
end

Private Instance Methods

analytics_enabled?() click to toggle source
# File lib/ddtrace/contrib/ethon/easy_patch.rb, line 137
def analytics_enabled?
  Contrib::Analytics.enabled?(datadog_configuration[:analytics_enabled])
end
analytics_sample_rate() click to toggle source
# File lib/ddtrace/contrib/ethon/easy_patch.rb, line 141
def analytics_sample_rate
  datadog_configuration[:analytics_sample_rate]
end
datadog_tag_request() click to toggle source
# File lib/ddtrace/contrib/ethon/easy_patch.rb, line 99
def datadog_tag_request
  span = @datadog_span
  method = 'N/A'
  if instance_variable_defined?(:@datadog_method) && !@datadog_method.nil?
    method = @datadog_method.to_s
  end
  span.resource = method

  # Set analytics sample rate
  Contrib::Analytics.set_sample_rate(span, analytics_sample_rate) if analytics_enabled?

  return unless uri
  span.set_tag(Datadog::Ext::HTTP::URL, uri.path)
  span.set_tag(Datadog::Ext::HTTP::METHOD, method)
  span.set_tag(Datadog::Ext::NET::TARGET_HOST, uri.host)
  span.set_tag(Datadog::Ext::NET::TARGET_PORT, uri.port)
end
load_datadog_configuration_for(host = :default) click to toggle source
# File lib/ddtrace/contrib/ethon/easy_patch.rb, line 129
def load_datadog_configuration_for(host = :default)
  @datadog_configuration = Datadog.configuration[:ethon, host]
end
set_span_error_message(message) click to toggle source
# File lib/ddtrace/contrib/ethon/easy_patch.rb, line 117
def set_span_error_message(message)
  # Sets span error from message, in case there is no exception available
  @datadog_span.status = Datadog::Ext::Errors::STATUS
  @datadog_span.set_tag(Datadog::Ext::Errors::MSG, message)
end
tracer_enabled?() click to toggle source
# File lib/ddtrace/contrib/ethon/easy_patch.rb, line 133
def tracer_enabled?
  datadog_configuration[:tracer].enabled
end
uri() click to toggle source
# File lib/ddtrace/contrib/ethon/easy_patch.rb, line 123
def uri
  URI.parse(url)
# rubocop:disable Lint/HandleExceptions
rescue URI::InvalidURIError
end