aboutsummaryrefslogtreecommitdiffstats
path: root/actionpack/lib/action_controller/metal/instrumentation.rb
diff options
context:
space:
mode:
Diffstat (limited to 'actionpack/lib/action_controller/metal/instrumentation.rb')
-rw-r--r--actionpack/lib/action_controller/metal/instrumentation.rb41
1 files changed, 32 insertions, 9 deletions
diff --git a/actionpack/lib/action_controller/metal/instrumentation.rb b/actionpack/lib/action_controller/metal/instrumentation.rb
index 4549f6c451..7222b7b2fa 100644
--- a/actionpack/lib/action_controller/metal/instrumentation.rb
+++ b/actionpack/lib/action_controller/metal/instrumentation.rb
@@ -2,7 +2,10 @@ require 'abstract_controller/logger'
module ActionController
# Adds instrumentation to several ends in ActionController::Base. It also provides
- # some hooks related with process_action logging and view runtime.
+ # some hooks related with process_action, this allows an ORM like ActiveRecord
+ # and/or DataMapper to plug in ActionController and show related information.
+ #
+ # Check ActiveRecord::Railties::ControllerRuntime for an example.
module Instrumentation
extend ActiveSupport::Concern
@@ -13,9 +16,17 @@ module ActionController
attr_internal :view_runtime
def process_action(action, *args)
- ActiveSupport::Notifications.instrument("action_controller.process_action",
- :controller => self, :action => action) do
- super
+ ActiveSupport::Notifications.instrument("action_controller.process_action") do |payload|
+ result = super
+ payload[:controller] = self.class.name
+ payload[:action] = self.action_name
+ payload[:formats] = request.formats.map(&:to_s)
+ payload[:remote_ip] = request.remote_ip
+ payload[:method] = request.method
+ payload[:status] = response.status
+ payload[:request_uri] = request.request_uri rescue "unknown"
+ append_info_to_payload(payload)
+ result
end
end
@@ -47,11 +58,16 @@ module ActionController
end
def redirect_to(*args)
- super
- ActiveSupport::Notifications.instrument("action_controller.redirect_to",
- :status => self.status, :location => self.location)
+ ActiveSupport::Notifications.instrument("action_controller.redirect_to") do |payload|
+ result = super
+ payload[:status] = self.status
+ payload[:location] = self.location
+ result
+ end
end
+ protected
+
# A hook which allows you to clean up any time taken into account in
# views wrongly, like database querying time.
#
@@ -64,13 +80,20 @@ module ActionController
yield
end
+ # Everytime after an action is processed, this method is invoked
+ # with the payload, so you can add more information.
+ # :api: plugin
+ def append_info_to_payload(payload) #:nodoc:
+ payload[:view_runtime] = view_runtime
+ end
+
module ClassMethods
# A hook which allows other frameworks to log what happened during
# controller process action. This method should return an array
# with the messages to be added.
# :api: plugin
- def log_process_action(controller) #:nodoc:
- messages, view_runtime = [], controller.send(:view_runtime)
+ def log_process_action(payload) #:nodoc:
+ messages, view_runtime = [], payload[:view_runtime]
messages << ("Views: %.1fms" % view_runtime.to_f) if view_runtime
messages
end