module Datadog::Contrib::Httprb::Instrumentation::InstanceMethods

Instance methods for configuration rubocop:disable Metrics/ModuleLength

Public Instance Methods

perform(req, options) click to toggle source
Calls superclass method
# File lib/ddtrace/contrib/httprb/instrumentation.rb, line 23
def perform(req, options)
  host = req.uri.host if req.respond_to?(:uri) && req.uri
  request_options = datadog_configuration(host)
  pin = datadog_pin(request_options)

  return super(req, options) unless pin && pin.tracer

  pin.tracer.trace(Ext::SPAN_REQUEST, on_error: method(:annotate_span_with_error!)) do |span|
    begin
      request_options[:service_name] = pin.service_name
      span.service = service_name(host, request_options)
      span.span_type = Datadog::Ext::HTTP::TYPE_OUTBOUND

      if pin.tracer.enabled && !should_skip_distributed_tracing?(pin)
        Datadog::HTTPPropagator.inject!(span.context, req)
      end

      # Add additional request specific tags to the span.
      annotate_span_with_request!(span, req, request_options)
    rescue StandardError => e
      logger.error("error preparing span for http.rb request: #{e}, Soure: #{e.backtrace}")
    ensure
      res = super(req, options)
    end

    # Add additional response specific tags to the span.
    annotate_span_with_response!(span, res)

    res
  end
end

Private Instance Methods

analytics_enabled?(request_options) click to toggle source
# File lib/ddtrace/contrib/httprb/instrumentation.rb, line 136
def analytics_enabled?(request_options)
  Contrib::Analytics.enabled?(request_options[:analytics_enabled])
end
annotate_span_with_error!(span, error) click to toggle source
# File lib/ddtrace/contrib/httprb/instrumentation.rb, line 91
def annotate_span_with_error!(span, error)
  span.set_error(error)
end
annotate_span_with_request!(span, req, req_options) click to toggle source
# File lib/ddtrace/contrib/httprb/instrumentation.rb, line 57
def annotate_span_with_request!(span, req, req_options)
  if req.verb && req.verb.is_a?(String) || req.verb.is_a?(Symbol)
    http_method = req.verb.to_s.upcase
    span.resource = http_method
    span.set_tag(Datadog::Ext::HTTP::METHOD, http_method)
  else
    logger.debug("service #{req_options[:service_name]} span #{Ext::SPAN_REQUEST} missing request verb")
  end

  if req.uri
    uri = req.uri
    span.set_tag(Datadog::Ext::HTTP::URL, uri.path)
    span.set_tag(Datadog::Ext::NET::TARGET_HOST, uri.host)
    span.set_tag(Datadog::Ext::NET::TARGET_PORT, uri.port)
  else
    logger.debug("service #{req_options[:service_name]} span #{Ext::SPAN_REQUEST} missing uri")
  end

  set_analytics_sample_rate(span, req_options)
end
annotate_span_with_response!(span, response) click to toggle source
# File lib/ddtrace/contrib/httprb/instrumentation.rb, line 78
def annotate_span_with_response!(span, response)
  return unless response && response.code

  span.set_tag(Datadog::Ext::HTTP::STATUS_CODE, response.code)

  case response.code.to_i
  when 400...599
    # https://github.com/DataDog/dd-trace-rb/issues/1116
    # parsing the response body message will alter downstream application behavior
    span.set_error(["Error #{response.code}", 'Error'])
  end
end
datadog_configuration(host = :default) click to toggle source
# File lib/ddtrace/contrib/httprb/instrumentation.rb, line 132
def datadog_configuration(host = :default)
  Datadog.configuration[:httprb, host]
end
datadog_pin(config = Datadog.configuration[:httprb]) click to toggle source
# File lib/ddtrace/contrib/httprb/instrumentation.rb, line 95
def datadog_pin(config = Datadog.configuration[:httprb])
  service = config[:service_name]
  tracer = config[:tracer]

  @datadog_pin ||= begin
    Datadog::Pin.new(
      service,
      app: Ext::APP,
      app_type: Datadog::Ext::AppTypes::WEB,
      tracer: -> { config[:tracer] }
    )
  end

  if @datadog_pin.service_name == default_datadog_pin.service_name && @datadog_pin.service_name != service
    @datadog_pin.service = service
  end
  if @datadog_pin.tracer == default_datadog_pin.tracer && @datadog_pin.tracer != tracer
    @datadog_pin.tracer = tracer
  end

  @datadog_pin
end
default_datadog_pin() click to toggle source
# File lib/ddtrace/contrib/httprb/instrumentation.rb, line 118
def default_datadog_pin
  config = Datadog.configuration[:httprb]
  service = config[:service_name]

  @default_datadog_pin ||= begin
    Datadog::Pin.new(
      service,
      app: Ext::APP,
      app_type: Datadog::Ext::AppTypes::WEB,
      tracer: -> { config[:tracer] }
    )
  end
end
logger() click to toggle source
# File lib/ddtrace/contrib/httprb/instrumentation.rb, line 140
def logger
  Datadog.logger
end
set_analytics_sample_rate(span, request_options) click to toggle source
# File lib/ddtrace/contrib/httprb/instrumentation.rb, line 152
def set_analytics_sample_rate(span, request_options)
  return unless analytics_enabled?(request_options)
  Contrib::Analytics.set_sample_rate(span, request_options[:analytics_sample_rate])
end
should_skip_distributed_tracing?(pin) click to toggle source
# File lib/ddtrace/contrib/httprb/instrumentation.rb, line 144
def should_skip_distributed_tracing?(pin)
  if pin.config && pin.config.key?(:distributed_tracing)
    return !pin.config[:distributed_tracing]
  end

  !Datadog.configuration[:httprb][:distributed_tracing]
end