Class: Hallmonitor::Railtie

Inherits:
Rails::Railtie
  • Object
show all
Defined in:
lib/hallmonitor/railtie.rb

Overview

Auto-instruments Rails ActionController actions to collect metrics about their behavior

Class Method Summary collapse

Class Method Details

.enable_action_controller_metricsObject



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/hallmonitor/railtie.rb', line 11

def self.enable_action_controller_metrics
  # See https://guides.rubyonrails.org/active_support_instrumentation.html#process-action-action-controller
  # for information on this notification
  ActiveSupport::Notifications.subscribe(/process_action.action_controller/) do |*args|
    begin
      event_args = parse_process_action_payload(args)

      tags = {
        controller: event_args[:controller],
        action: event_args[:action],
        status_code: event_args[:status]
      }

      Hallmonitor::TimedEvent.new(
        'controller.action.measure',
        duration: {
          total: event_args[:total_duration],
          database: event_args[:db_time],
          view: event_args[:view_time]
        },
        tags: tags
      ).emit

      Hallmonitor::Event.new('controller.action.count', tags: tags).emit
    rescue => ex
      Rails.logger.error("Caught error in Telemeter: #{ex.message}", ex)
    end
  end
end

.parse_process_action_payload(args) ⇒ Object

example args [“process_action.action_controller”, 2013-11-22 11:17:04 -0600, 2013-11-22 11:17:04 -0600, “6a1302819619cb089922”,

:action=>"index",
:params=>{"action"=>"index", "controller"=>"branches",
:format=>:html,
:method=>"GET",
:path=>"/branches",
:status=>200,
:view_runtime=>0.06999999999999999}]


54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/hallmonitor/railtie.rb', line 54

def self.parse_process_action_payload(args)
  parsed_arguments = {}
  rails_payload = args[4]

  parsed_arguments[:total_duration] = 1000.0 * (args[2] - args[1])
  parsed_arguments[:view_time] = (rails_payload[:view_runtime] || 0).to_f
  parsed_arguments[:db_time] = (rails_payload[:db_runtime] || 0).to_f
  parsed_arguments[:status] = rails_payload[:status]
  parsed_arguments[:controller] = rails_payload[:controller]
  parsed_arguments[:action] = rails_payload[:action]
  parsed_arguments[:format] = rails_payload[:format] || 'all'
  parsed_arguments[:format] = 'all' if parsed_arguments[:format] == '*/*'

  parsed_arguments
end