module Datadog::Tracing::Contrib::Roda::Instrumentation

def _roda_handle_main_route

def _roda_handle_main_route
  instrument(Ext::SPAN_REQUEST) { super }
end

def call

def call
  instrument(Ext::SPAN_REQUEST) { super }
end

def configuration

def configuration
  Datadog.configuration.tracing[:roda]
end

def instrument(span_name, &block)

def instrument(span_name, &block)
  Tracing.trace(span_name) do |span|
    begin
      request_method = request.request_method.to_s.upcase
      span.service = configuration[:service_name] if configuration[:service_name]
      span.span_type = Tracing::Metadata::Ext::HTTP::TYPE_INBOUND
      # Using the http method as a resource, since the URL/path can trigger
      # a possibly infinite number of resources.
      span.resource = request_method
      span.set_tag(Tracing::Metadata::Ext::HTTP::TAG_URL, request.path)
      span.set_tag(Tracing::Metadata::Ext::HTTP::TAG_METHOD, request_method)
      # Add analytics tag to the span
      if Contrib::Analytics.enabled?(configuration[:analytics_enabled])
        Contrib::Analytics.set_sample_rate(span, configuration[:analytics_sample_rate])
      end
      # Measure service stats
      Contrib::Analytics.set_measured(span)
    ensure
      begin
        response = yield
      rescue StandardError
        # The status code is unknown to Roda and decided by the upstream web runner.
        # In this case, spans default to status code 500 rather than a blank status code.
        default_error_status = '500'
        span.resource = "#{request_method} #{default_error_status}"
        span.set_tag(Tracing::Metadata::Ext::HTTP::TAG_STATUS_CODE, default_error_status)
        raise
      end
    end
    status_code = response[0]
    # Adds status code to the resource name once the resource comes back
    span.resource = "#{request_method} #{status_code}"
    span.set_tag(Tracing::Metadata::Ext::HTTP::TAG_STATUS_CODE, status_code)
    span.status = 1 if status_code.to_s.start_with?('5')
    response
  end
end