module Datadog::Contrib::ActionView::Instrumentation::TemplateRenderer::Rails30

Legacy Rails < 3.1 template rendering

Public Class Methods

prepended(base) click to toggle source

rubocop:disable Metrics/MethodLength

# File lib/ddtrace/contrib/action_view/instrumentation/template_renderer.rb, line 12
def self.prepended(base)
  # rubocop:disable Metrics/BlockLength
  base.class_eval do
    def render_with_datadog(*args, &block)
      # NOTE: This check exists purely for Rails 3.0 compatibility.
      #       The 'if' part can be removed when support for Rails 3.0 is removed.
      if active_datadog_span
        render_without_datadog(*args, &block)
      else
        datadog_tracer.trace(
          Ext::SPAN_RENDER_TEMPLATE,
          span_type: Datadog::Ext::HTTP::TEMPLATE
        ) do |span|
          with_datadog_span(span) { render_without_datadog(*args, &block) }
        end
      end
    end

    def render_template_with_datadog(*args)
      begin
        template = args[0]
        layout_name = args[1]

        # update the tracing context with computed values before the rendering
        template_name = template.try('identifier')
        template_name = Utils.normalize_template_name(template_name)

        if template_name
          active_datadog_span.resource = template_name
          active_datadog_span.set_tag(
            Ext::TAG_TEMPLATE_NAME,
            template_name
          )
        end

        if layout_name
          active_datadog_span.set_tag(
            Ext::TAG_LAYOUT,
            layout_name
          )
        end

        # Measure service stats
        Contrib::Analytics.set_measured(active_datadog_span)
      rescue StandardError => e
        Datadog.logger.debug(e.message)
      end

      # execute the original function anyway
      render_template_without_datadog(*args)
    end

    private

    attr_accessor :active_datadog_span

    def datadog_tracer
      Datadog.configuration[:action_view][:tracer]
    end

    def with_datadog_span(span)
      self.active_datadog_span = span
      yield
    ensure
      self.active_datadog_span = nil
    end

    # method aliasing to patch the class
    alias_method :render_without_datadog, :render
    alias_method :render, :render_with_datadog

    alias_method :render_template_without_datadog, :_render_template
    alias_method :_render_template, :render_template_with_datadog
  end
end

Public Instance Methods

datadog_tracer() click to toggle source
# File lib/ddtrace/contrib/action_view/instrumentation/template_renderer.rb, line 68
def datadog_tracer
  Datadog.configuration[:action_view][:tracer]
end
render_template_with_datadog(*args) click to toggle source
# File lib/ddtrace/contrib/action_view/instrumentation/template_renderer.rb, line 30
def render_template_with_datadog(*args)
  begin
    template = args[0]
    layout_name = args[1]

    # update the tracing context with computed values before the rendering
    template_name = template.try('identifier')
    template_name = Utils.normalize_template_name(template_name)

    if template_name
      active_datadog_span.resource = template_name
      active_datadog_span.set_tag(
        Ext::TAG_TEMPLATE_NAME,
        template_name
      )
    end

    if layout_name
      active_datadog_span.set_tag(
        Ext::TAG_LAYOUT,
        layout_name
      )
    end

    # Measure service stats
    Contrib::Analytics.set_measured(active_datadog_span)
  rescue StandardError => e
    Datadog.logger.debug(e.message)
  end

  # execute the original function anyway
  render_template_without_datadog(*args)
end
render_with_datadog(*args, &block) click to toggle source
# File lib/ddtrace/contrib/action_view/instrumentation/template_renderer.rb, line 15
def render_with_datadog(*args, &block)
  # NOTE: This check exists purely for Rails 3.0 compatibility.
  #       The 'if' part can be removed when support for Rails 3.0 is removed.
  if active_datadog_span
    render_without_datadog(*args, &block)
  else
    datadog_tracer.trace(
      Ext::SPAN_RENDER_TEMPLATE,
      span_type: Datadog::Ext::HTTP::TEMPLATE
    ) do |span|
      with_datadog_span(span) { render_without_datadog(*args, &block) }
    end
  end
end
with_datadog_span(span) { || ... } click to toggle source
# File lib/ddtrace/contrib/action_view/instrumentation/template_renderer.rb, line 72
def with_datadog_span(span)
  self.active_datadog_span = span
  yield
ensure
  self.active_datadog_span = nil
end