Sha256: 649976fcd95a91d1aa99e815a2f22157fb20cb06ddbf1b828639a6901ecbace3

Contents?: true

Size: 1.26 KB

Versions: 3

Compression:

Stored size: 1.26 KB

Contents

# frozen_string_literal: true

require_relative './instrumentors/all'

module InstrumentAllTheThings
  class MethodInstrumentor
    WAPPERS = {
      trace: Instrumentors::TRACE_WRAPPER,
      error_logging: Instrumentors::ERROR_LOGGING_WRAPPER,
      gc_stats: Instrumentors::GC_STATS_WRAPPER,
      execution_counts_and_timing: Instrumentors::EXECUTION_COUNT_AND_TIMING_WRAPPER,
    }.freeze

    DEFAULT_OPTIONS = {
      trace: true,
      gc_stats: true,
      error_logging: true,
    }.freeze

    attr_accessor :options, :instrumentor

    def initialize(options)
      self.options = DEFAULT_OPTIONS.merge(options)

      build_instrumentor

      freeze
    end

    def build_instrumentor
      procs = WAPPERS.collect do |type, builder|
        next unless options[type]

        builder.call(options[type], options[:context])
      end.compact

      self.instrumentor = combine_procs(procs)
    end

    def invoke(klass:, &blk)
      instrumentor.call(klass, blk)
    end

    private

    def combine_procs(procs)
      # I know it's crazy, but this wraps procs which take "Next Block"
      # and "Final Block"
      procs.inject(->(_, f) { f.call }) do |next_blk, current_blk|
        proc { |k, final| current_blk.call(k, next_blk, final) }
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
instrument_all_the_things-1.0.1 lib/instrument_all_the_things/method_instrumentor.rb
instrument_all_the_things-0.9.1.alpha lib/instrument_all_the_things/method_instrumentor.rb
instrument_all_the_things-0.9.0.alpha lib/instrument_all_the_things/method_instrumentor.rb