class NewRelic::Agent::Instrumentation::ActionViewSubscriber

Constants

RENDER_COLLECTION_EVENT_NAME
RENDER_LAYOUT_EVENT_NAME
RENDER_PARTIAL_EVENT_NAME
RENDER_TEMPLATE_EVENT_NAME

Public Instance Methods

finish_segment(id, payload) click to toggle source
# File lib/new_relic/agent/instrumentation/action_view_subscriber.rb, line 25
def finish_segment(id, payload)
  if segment = pop_segment(id)
    if exception = exception_object(payload)
      segment.notice_error(exception)
    end
    segment.finish
  end
end
format_metric_name(event_name, payload, parent) click to toggle source
# File lib/new_relic/agent/instrumentation/action_view_subscriber.rb, line 34
def format_metric_name(event_name, payload, parent)
  return parent.name if parent \
     && (payload[:virtual_path] \
      || (parent.identifier =~ /template$/))

  if payload.key?(:virtual_path)
    identifier = payload[:virtual_path]
  else
    identifier = payload[:identifier]
  end

  "View/#{metric_path(event_name, identifier)}/#{metric_action(event_name)}"
end
metric_action(name) click to toggle source
# File lib/new_relic/agent/instrumentation/action_view_subscriber.rb, line 63
def metric_action(name)
  case name
  when /#{RENDER_TEMPLATE_EVENT_NAME}$/o then 'Rendering'
  when RENDER_PARTIAL_EVENT_NAME then 'Partial'
  when RENDER_COLLECTION_EVENT_NAME then 'Partial'
  when RENDER_LAYOUT_EVENT_NAME then 'Layout'
  else NewRelic::UNKNOWN
  end
end
metric_path(name, identifier) click to toggle source
# File lib/new_relic/agent/instrumentation/action_view_subscriber.rb, line 73
def metric_path(name, identifier)
  # Rails 5 sets identifier to nil for empty collections,
  # so do not mistake rendering a collection for rendering a file.
  if identifier.nil? && name != RENDER_COLLECTION_EVENT_NAME
    'file'
  elsif /template$/.match?(identifier)
    identifier
  elsif identifier && (parts = identifier.split('/')).size > 1
    parts[-2..-1].join('/')
  else
    ::NewRelic::Agent::UNKNOWN_METRIC
  end
end
recordable?(event_name, metric_name) click to toggle source

Nearly every “render_blah.action_view” event has a child in the form of “!render_blah.action_view”. The children are the ones we want to record. There are a couple special cases of events without children.

# File lib/new_relic/agent/instrumentation/action_view_subscriber.rb, line 52
def recordable?(event_name, metric_name)
  event_name[0] == '!' \
      || metric_name == 'View/text template/Rendering' \
      || metric_name == "View/#{::NewRelic::Agent::UNKNOWN_METRIC}/Partial"
end
start_segment(name, id, payload) click to toggle source
# File lib/new_relic/agent/instrumentation/action_view_subscriber.rb, line 13
def start_segment(name, id, payload)
  parent = segment_stack[id].last
  metric_name = format_metric_name(name, payload, parent)

  event = ActionViewEvent.new(metric_name, payload[:identifier])

  if recordable?(name, metric_name)
    event.finishable = Tracer.start_segment(name: metric_name)
  end
  push_segment(id, event)
end