Module: Rails::Instrumentation::ActionControllerSubscriber

Includes:
Subscriber
Defined in:
lib/rails/instrumentation/subscribers/action_controller_subscriber.rb

Constant Summary collapse

EVENT_NAMESPACE =
'action_controller'.freeze
EVENTS =
%w[
  write_fragment
  read_fragment
  expire_fragment
  exist_fragment?
  write_page
  expire_page
  start_processing
  process_action
  send_file
  send_data
  redirect_to
  halted_callback
  unpermitted_parameters
].freeze

Class Method Summary collapse

Methods included from Subscriber

included

Class Method Details

.exist_fragment?(event) ⇒ Boolean

Returns:

  • (Boolean)


49
50
51
52
53
54
55
# File 'lib/rails/instrumentation/subscribers/action_controller_subscriber.rb', line 49

def exist_fragment?(event)
  tags = {
    'key.exist' => event.payload[:key]
  }

  Utils.trace_notification(event: event, tags: tags)
end

.expire_fragment(event) ⇒ Object



41
42
43
44
45
46
47
# File 'lib/rails/instrumentation/subscribers/action_controller_subscriber.rb', line 41

def expire_fragment(event)
  tags = {
    'key.expire' => event.payload[:key]
  }

  Utils.trace_notification(event: event, tags: tags)
end

.expire_page(event) ⇒ Object



65
66
67
68
69
70
71
# File 'lib/rails/instrumentation/subscribers/action_controller_subscriber.rb', line 65

def expire_page(event)
  tags = {
    'path.expire' => event.payload[:path]
  }

  Utils.trace_notification(event: event, tags: tags)
end

.halted_callback(event) ⇒ Object



140
141
142
143
144
145
146
# File 'lib/rails/instrumentation/subscribers/action_controller_subscriber.rb', line 140

def halted_callback(event)
  tags = {
    'filter' => event.payload[:filter]
  }

  Utils.trace_notification(event: event, tags: tags)
end

.process_action(event) ⇒ Object



86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
# File 'lib/rails/instrumentation/subscribers/action_controller_subscriber.rb', line 86

def process_action(event)
  span_name = "#{event.payload[:action]}.#{event.payload[:controller]}"

  tags = {
    'controller' => event.payload[:controller],
    'controller.action' => event.payload[:action],
    'request.params' => event.payload[:params],
    'request.format' => event.payload[:format],
    'http.method' => event.payload[:method],
    'http.url' => event.payload[:path],
    'http.status_code' => event.payload[:status],
    'view.runtime.ms' => event.payload[:view_runtime],
    'db.runtime.ms' => event.payload[:db_runtime]
  }

  # Only append these tags onto the active span created by the patched 'process_action'
  # Otherwise, create a new span for this notification as usual
  active_span = ::Rails::Instrumentation.tracer.active_span
  if active_span && active_span.operation_name == span_name
    tags.each do |key, value|
      ::Rails::Instrumentation.tracer.active_span.set_tag(key, value)
    end
  else
    Utils.trace_notification(event: event, tags: tags)
  end
end

.read_fragment(event) ⇒ Object



33
34
35
36
37
38
39
# File 'lib/rails/instrumentation/subscribers/action_controller_subscriber.rb', line 33

def read_fragment(event)
  tags = {
    'key.read' => event.payload[:key]
  }

  Utils.trace_notification(event: event, tags: tags)
end

.redirect_to(event) ⇒ Object



131
132
133
134
135
136
137
138
# File 'lib/rails/instrumentation/subscribers/action_controller_subscriber.rb', line 131

def redirect_to(event)
  tags = {
    'http.status_code' => event.payload[:status],
    'redirect.url' => event.payload[:location]
  }

  Utils.trace_notification(event: event, tags: tags)
end

.send_data(event) ⇒ Object



124
125
126
127
128
129
# File 'lib/rails/instrumentation/subscribers/action_controller_subscriber.rb', line 124

def send_data(event)
  # no defined keys, but user keys may be passed in. Might want to add
  # them at some point

  Utils.trace_notification(event: event, tags: tags)
end

.send_file(event) ⇒ Object



113
114
115
116
117
118
119
120
121
122
# File 'lib/rails/instrumentation/subscribers/action_controller_subscriber.rb', line 113

def send_file(event)
  tags = {
    'path.send' => event.payload[:path]
  }

  # there may be additional keys in the payload. It might be worth
  # trying to tag them too

  Utils.trace_notification(event: event, tags: tags)
end

.start_processing(event) ⇒ Object



73
74
75
76
77
78
79
80
81
82
83
84
# File 'lib/rails/instrumentation/subscribers/action_controller_subscriber.rb', line 73

def start_processing(event)
  tags = {
    'controller' => event.payload[:controller],
    'controller.action' => event.payload[:action],
    'request.params' => event.payload[:params],
    'request.format' => event.payload[:format],
    'http.method' => event.payload[:method],
    'http.url' => event.payload[:path]
  }

  Utils.trace_notification(event: event, tags: tags)
end

.unpermitted_parameters(event) ⇒ Object



148
149
150
151
152
153
154
# File 'lib/rails/instrumentation/subscribers/action_controller_subscriber.rb', line 148

def unpermitted_parameters(event)
  tags = {
    'unpermitted_keys' => event.payload[:keys]
  }

  Utils.trace_notification(event: event, tags: tags)
end

.write_fragment(event) ⇒ Object



25
26
27
28
29
30
31
# File 'lib/rails/instrumentation/subscribers/action_controller_subscriber.rb', line 25

def write_fragment(event)
  tags = {
    'key.write' => event.payload[:key]
  }

  Utils.trace_notification(event: event, tags: tags)
end

.write_page(event) ⇒ Object



57
58
59
60
61
62
63
# File 'lib/rails/instrumentation/subscribers/action_controller_subscriber.rb', line 57

def write_page(event)
  tags = {
    'path.write' => event.payload[:path]
  }

  Utils.trace_notification(event: event, tags: tags)
end