class Sentry::Rails::LogSubscribers::ActionControllerSubscriber
end
config.rails.structured_logging.subscribers = { action_controller: Sentry::Rails::LogSubscribers::ActionControllerSubscriber }
config.rails.structured_logging = true
config.enable_logs = true
Sentry.init do |config|
# Enable structured logging for ActionController
@example Usage
request parameters, and performance metrics.
with relevant request information including controller, action, HTTP status,
This subscriber captures process_action.action_controller events and formats them
and logs them using Sentry’s structured logging system.
LogSubscriber for ActionController events that captures HTTP request processing
def extract_status(payload)
def extract_status(payload) if payload[:status] payload[:status] elsif payload[:exception] case payload[:exception].first when "ActionController::RoutingError" 404 when "ActionController::BadRequest" 400 else 500 end end end
def level_for_request(payload)
def level_for_request(payload) status = payload[:status] # In Rails < 6.0 status is not set when an action raised an exception if status.nil? && payload[:exception] case payload[:exception].first when "ActionController::RoutingError" :warn when "ActionController::BadRequest" :warn else :error end elsif status.nil? :info elsif status >= 200 && status < 400 :info elsif status >= 400 && status < 500 :warn elsif status >= 500 :error else :info end end
def process_action(event)
-
event(ActiveSupport::Notifications::Event) -- The controller action event
def process_action(event) return unless Sentry.initialized? payload = event.payload controller = payload[:controller] action = payload[:action] status = extract_status(payload) attributes = { controller: controller, action: action, duration_ms: duration_ms(event), method: payload[:method], path: payload[:path], format: payload[:format] } attributes[:status] = status if status if payload[:view_runtime] attributes[:view_runtime_ms] = payload[:view_runtime].round(2) end if payload[:db_runtime] attributes[:db_runtime_ms] = payload[:db_runtime].round(2) end if Sentry.configuration.send_default_pii && payload[:params] filtered_params = filter_sensitive_params(payload[:params]) attributes[:params] = filtered_params unless filtered_params.empty? end level = level_for_request(payload) message = "#{controller}##{action}" log_structured_event( message: message, level: level, attributes: attributes ) end