def log_controller_action(options)
      return do_nothing_on_null(:log_controller_action) if null?
      Utils.require_key(options, :begin_time)
      Utils.require_key(options, :end_time)

      if options[:controller_name]
        build_full_controller_action_string(options)
        @transaction.message("Controller action: #{@controller_action}")
      end
      if options[:method]
        @transaction.message("Application request method: #{options[:method]}")
      end
      @transaction.log_activity('framework request processing',
        options[:begin_time], options[:end_time], nil, options[:has_error])
    end
def log_controller_action(options)
      return do_nothing_on_null(:log_controller_action) if null?
      Utils.require_key(options, :begin_time)
      Utils.require_key(options, :end_time)

      if options[:controller_name]
        build_full_controller_action_string(options)
        @transaction.message("Controller action: #{@controller_action}")
      end
      if options[:method]
        @transaction.message("Application request method: #{options[:method]}")
      end
      @transaction.log_activity('framework request processing',
        options[:begin_time], options[:end_time], nil, options[:has_error])
    end
Logs that you are calling a web framework controller action. Of course,
 you should only call this if your web framework has the concept of
 controller actions. For example Rails does, but Sinatra and Grape
 don't.

 You can pass additional information about the web framework controller
 action, which will be logged.

 Unlike {#log_controller_action_block}, this form does not expect a block.
 However, you are expected to pass timing information to the options
 hash.

 The `union_station_hooks_rails` gem automatically calls
 {#log_controller_action_block} for you if your application is a Rails
 app.

 @param [Hash] options Information about the controller action.
 @option options [String] :controller_name (optional)
   The controller's name, e.g. `PostsController`.
 @option options [String] :action_name (optional if :controller_name
   isn't set) The controller action's name, e.g. `create`.
 @option options [String] :method (optional)
   The HTTP method that the web framework thinks this request should have,
   e.g. `GET` and `PUT`. The main use case for this option is to support
   Rails's HTTP verb emulation. Rails uses a parameter named
   [`_method`](http://guides.rubyonrails.org/form_helpers.html#how-do-forms-with-patch-put-or-delete-methods-work-questionmark)
   to emulate HTTP verbs besides GET and POST. Other web frameworks may
   have a similar mechanism.
 @option options [TimePoint or Time] :begin_time The time at which the
   controller action begun. See {UnionStationHooks.now} to learn more.
 @option options [TimePoint or Time] :end_time The time at which the
   controller action ended. See {UnionStationHooks.now} to learn more.
 @option options [Boolean] :has_error (optional) Whether an uncaught
   exception occurred during the request. Default: false.

 @example
   # This example shows what to put inside a Rails controller action
   # method. Note that all of this is automatically done for you if you
   # use the union_station_hooks_rails gem.
   options = {
     :controller_name => self.class.name,
     :action_name => action_name,
     :method => request.request_method,
     :begin_time => UnionStationHooks.now
   }
   begin
     do_some_request_processing_here
   rescue Exception
     options[:has_error] = true
     raise
   ensure
     options[:end_time] = UnionStationHooks.now
     reporter.log_controller_action(options)
   end