ManageIQ/manageiq-api

View on GitHub
app/controllers/api/base_controller/logger.rb

Summary

Maintainability
A
0 mins
Test Coverage
A
94%
module Api
  class BaseController
    module Logger
      def log_request_initiated
        @requested_at = Time.now.utc
        return unless api_log_info?
        api_log_info(" ")
        log_request("API Request", :requested_at => @requested_at.to_s,
                                   :method       => request.request_method,
                                   :url          => request.original_url)
      end

      def log_api_auth
        return unless api_log_info?
        if @miq_token_hash
          log_request("System Auth", {:x_miq_token => request.headers[HttpHeaders::MIQ_TOKEN]}.merge(@miq_token_hash))
        end
        log_request("Authentication", :type        => auth_mechanism.to_s,
                                      :token       => request.headers[HttpHeaders::AUTH_TOKEN],
                                      :x_miq_group => request.headers[HttpHeaders::MIQ_GROUP],
                                      :user        => User.current_user.userid)
        if User.current_user
          group = User.current_user.current_group
          log_request("Authorization", :user   => User.current_user.userid,
                                       :group  => group.description,
                                       :role   => group.miq_user_role_name,
                                       :tenant => group.tenant.name)
        end
      end

      def log_api_request
        @parameter_filter ||= ActiveSupport::ParameterFilter.new(Rails.application.config.filter_parameters)
        return unless api_log_info?
        log_request("Request", @req.to_hash)
        unfiltered_params = request.query_parameters
                                   .merge(params.permit(:action, :controller, :format).to_h)
                                   .merge("body" => @req.json_body)
        log_request("Parameters", @parameter_filter.filter(unfiltered_params))
        log_request_body
      end

      def log_api_response
        @completed_at = Time.now.utc
        return unless api_log_info?
        log_request("Response", :completed_at => @completed_at.to_s,
                                :size         => '%.3f KBytes' % (response.body.size / 1000.0),
                                :time_taken   => '%.3f Seconds' % (@completed_at - @requested_at),
                                :status       => response.status)
      end

      def api_log_debug?
        $api_log.debug?
      end

      def api_log_info?
        $api_log.info?
      end

      def api_get_method_name(call_stack, method)
        match = /`(?<mname>[^']*)'/.match(call_stack)
        (match ? match[:mname] : method).sub(/block .*in /, "")
      end

      def api_log_error(msg)
        method = api_get_method_name(caller.first, __method__)

        $api_log.error("MIQ(#{self.class.name}.#{method}) #{msg}")
      end

      def api_log_debug(msg)
        if api_log_debug?
          method = api_get_method_name(caller.first, __method__)

          $api_log.debug("MIQ(#{self.class.name}.#{method}) #{msg}")
        end
      end

      def api_log_info(msg)
        method = api_get_method_name(caller.first, __method__)

        $api_log.info("MIQ(#{self.class.name}.#{method}) #{msg}")
      end

      def api_log_warn(msg)
        method = api_get_method_name(caller.first, __method__)

        $api_log.warn("MIQ(#{self.class.name}.#{method}) #{msg}")
      end

      private

      def log_request_body
        log_request("Body", JSON.pretty_generate(@req.json_body)) if api_log_debug? && @req.json_body.present?
      end

      def log_request(header, data)
        if data.respond_to?(:merge)
          audit_data = {:request_id => request.request_id}
          audit_data[:session_id] = request.session.id if request.respond_to?(:session) && request.session.loaded?
          data = data.merge(audit_data)
        end

        api_log_info("#{('%s:' % header).ljust(15)} #{data}")
      end
    end
  end
end