module SemanticLogger::Loggable::ClassMethods

Public Instance Methods

logger_measure_method(method_name, min_duration: 0.0, metric: " click to toggle source

Measure and log the performance of an instance method.

Parameters:

method_name: [Symbol]
  The name of the method that should be measured.

options: [Hash]
  Any valid options that can be passed to measure.

Approximate overhead when logging a method call with a metric:

0.044 ms  per method call.
0.009 ms  per method call. If `min_duration` is not met
0.0005 ms per method call. If `level` is not met
# File lib/semantic_logger/loggable.rb, line 79
      def logger_measure_method(method_name,
                                min_duration: 0.0,
                                metric: "#{name}/#{method_name}",
                                log_exception: :partial,
                                on_exception_level: nil,
                                message: "##{method_name}",
                                level: :info)

        # unless visibility = Utils.method_visibility(self, method_name)
        #   logger.warn("Unable to measure method: #{name}##{method_name} since it does not exist")
        #   return false
        # end

        index = Levels.index(level)

        logger_measure_module.module_eval(<<~MEASURE_METHOD, __FILE__, __LINE__ + 1)
          def #{method_name}(*args, &block)
            if logger.send(:level_index) <= #{index}
              logger.send(
                :measure_method,
                index:              #{index},
                level:              #{level.inspect},
                message:            #{message.inspect},
                min_duration:       #{min_duration},
                metric:             #{metric.inspect},
                log_exception:      #{log_exception.inspect},
                on_exception_level: #{on_exception_level.inspect}
              ) do
                super(*args, &block)
              end
            else
              super(*args, &block)
            end
          end
        MEASURE_METHOD
        # {"#{visibility} :#{method_name}" unless visibility == :public}
        true
      end

Private Instance Methods

logger_measure_module() click to toggle source

Dynamic Module to intercept method calls for measuring purposes.

# File lib/semantic_logger/loggable.rb, line 121
def logger_measure_module
  if const_defined?(:SemanticLoggerMeasure, _search_ancestors = false)
    const_get(:SemanticLoggerMeasure)
  else
    mod = const_set(:SemanticLoggerMeasure, Module.new)
    prepend mod
    mod
  end
end