lib/rorvswild.rb in rorvswild-0.0.4 vs lib/rorvswild.rb in rorvswild-0.0.5

- old
+ new

@@ -25,29 +25,31 @@ @app_id = config[:app_id] setup_callbacks end def setup_callbacks - ApplicationController.rescue_from(StandardError, &method(:after_exception)) ActiveSupport::Notifications.subscribe("sql.active_record", &method(:after_sql_query)) ActiveSupport::Notifications.subscribe("render_template.action_view", &method(:after_view_rendering)) ActiveSupport::Notifications.subscribe("process_action.action_controller", &method(:after_http_request)) ActiveSupport::Notifications.subscribe("start_processing.action_controller", &method(:before_http_request)) + + this = self + ApplicationController.rescue_from(StandardError) { |exception| this.after_exception(exception, self) } end def before_http_request(name, start, finish, id, payload) @request = {controller: payload[:controller], action: payload[:action], path: payload[:path]} @queries = [] - @views = [] + @views = {} @error = nil end def after_http_request(name, start, finish, id, payload) request[:db_runtime] = (payload[:db_runtime] || 0).round request[:view_runtime] = (payload[:view_runtime] || 0).round request[:other_runtime] = compute_duration(start, finish) - request[:db_runtime] - request[:view_runtime] - request[:params] = params_filter.filter(payload[:params]) if error + error[:parameters] = filter_sensitive_data(payload[:params]) if error Thread.new { post_request } rescue => exception log_error(exception) end @@ -63,22 +65,33 @@ rescue => exception log_error(exception) end def after_view_rendering(name, start, finish, id, payload) - views << {file: relative_path(payload[:identifier]), runtime: compute_duration(start, finish)} if views + if views + if view = views[file = relative_path(payload[:identifier])] + view[:runtime] += compute_duration(start, finish) + view[:times] += 1 + else + views[file] = {file: file, runtime: compute_duration(start, finish), times: 1} + end + end end - def after_exception(exception) - file, line = exception.backtrace.first.split(":") - @error = { - exception: exception.class.to_s, - backtrace: exception.backtrace, - message: exception.message, - file: relative_path(file), - line: line.to_i - } + def after_exception(exception, controller) + if !exception.is_a?(ActionController::RoutingError) + file, line = exception.backtrace.first.split(":") + @error = { + line: line.to_i, + file: relative_path(file), + message: exception.message, + backtrace: exception.backtrace, + exception: exception.class.to_s, + session: controller.session.to_hash, + environment_variables: filter_sensitive_data(filter_environment_variables(controller.request.env)) + } + end raise exception end ####################### ### Private methods ### @@ -93,11 +106,11 @@ def views @views end def slowest_views - views.sort { |h1, h2| h2[:runtime] <=> h1[:runtime] }[0, 25] + views.values.sort { |h1, h2| h2[:runtime] <=> h1[:runtime] }[0, 25] end def slowest_queries queries.sort { |h1, h2| h2[:runtime] <=> h1[:runtime] }[0, 25] end @@ -128,11 +141,11 @@ method.sub!("'", "") method.index("_app_views_") == 0 ? nil : method end def compute_duration(start, finish) - ((finish - start) * 1000).round + ((finish - start) * 1000) end def relative_path(path) path.sub(Rails.root.to_s, "") end @@ -146,11 +159,16 @@ post.body = data.to_json http.request(post) end end - def params_filter - @params_filter ||= ActionDispatch::Http::ParameterFilter.new(Rails.application.config.filter_parameters) + def filter_sensitive_data(hash) + @sensitive_filter ||= ActionDispatch::Http::ParameterFilter.new(Rails.application.config.filter_parameters) + @sensitive_filter.filter(hash) + end + + def filter_environment_variables(hash) + hash.clone.keep_if { |key,value| key == key.upcase } end def logger Rails.logger end