airbrake/airbrake

View on GitHub
lib/airbrake/rails/action_controller_performance_breakdown_subscriber.rb

Summary

Maintainability
A
35 mins
Test Coverage
# frozen_string_literal: true

require 'airbrake/rails/event'

module Airbrake
  module Rails
    # @since v8.3.0
    class ActionControllerPerformanceBreakdownSubscriber
      def call(*args)
        return unless Airbrake::Config.instance.performance_stats

        routes = Airbrake::Rack::RequestStore[:routes]
        return if !routes || routes.none?

        event = Airbrake::Rails::Event.new(*args)
        stash = build_stash

        routes.each do |route, params|
          groups = event.groups.merge(params[:groups])
          next if groups.none?

          breakdown_info = {
            method: event.method,
            route: route,
            response_type: event.response_type,
            groups: groups,
            timing: event.duration,
            time: event.time,
          }

          Airbrake.notify_performance_breakdown(breakdown_info, stash)
        end
      end

      private

      def build_stash
        stash = {}
        request = Airbrake::Rack::RequestStore[:request]
        return stash unless request

        stash[:request] = request
        if (user = Airbrake::Rack::User.extract(request.env))
          stash.merge!(user.as_json)
        end

        stash
      end
    end
  end
end