Sha256: e1f06dd6d8d66d88bb66f5a7261c0fa09385e5aaaccc46fdd79d17c504ad2d16

Contents?: true

Size: 1.97 KB

Versions: 39

Compression:

Stored size: 1.97 KB

Contents

# encoding: utf-8

require 'one_apm/transaction/transaction_state'

module OneApm
  module Agent
    module BusyCalculator

      extend self

      attr_reader :harvest_start, :accumulator

      def dispatcher_start(time)
        state = TransactionState.tl_get
        state.busy_entries ||= 0
        callers = state.busy_entries += 1
        return if callers > 1
        @lock.synchronize do
          @entrypoint_stack.push time
        end
      end

      def dispatcher_finish(end_time = nil)
        state = TransactionState.tl_get
        return unless state.busy_entries

        end_time ||= time_now
        callers = state.busy_entries -= 1

        return if callers > 0

        @lock.synchronize do
          if @entrypoint_stack.empty?
            OneApm::Manager.logger.warn("Stack underflow tracking dispatcher entry and exit!\n  #{caller.join("  \n")}")
          else
            @accumulator += (end_time - @entrypoint_stack.pop).to_f
          end
        end
      end

      def busy_count
        @entrypoint_stack.size
      end

      def reset
        @entrypoint_stack = []
        TransactionState.tl_get.busy_entries = 0
        @lock ||= Mutex.new
        @accumulator = 0
        @harvest_start = time_now
      end

      def harvest_busy
        busy = 0
        t0 = time_now
        @lock.synchronize do
          busy = accumulator
          @accumulator = 0

          @entrypoint_stack.size.times do |frame|
            busy += (t0 - @entrypoint_stack[frame]).to_f
            @entrypoint_stack[frame] = t0
          end

        end

        busy = 0.0 if busy < 0.0

        time_window = (t0 - harvest_start).to_f
        time_window = 1.0 if time_window == 0.0

        busy = busy / time_window

        if OneApm::Manager.config[:report_instance_busy]
          OneApm::Manager.record_metric('Instance/Busy', busy)
        end
        @harvest_start = t0
      end

      private

      def time_now
        Time.now
      end

      self.reset
    end
  end
end

Version data entries

39 entries across 39 versions & 1 rubygems

Version Path
oneapm_rpm-1.4.2 lib/one_apm/agent/busy_calculator.rb
oneapm_rpm-1.4.1 lib/one_apm/agent/busy_calculator.rb
oneapm_rpm-1.4.0 lib/one_apm/agent/busy_calculator.rb
oneapm_rpm-1.3.7 lib/one_apm/agent/busy_calculator.rb
oneapm_rpm-1.3.7.rc1 lib/one_apm/agent/busy_calculator.rb
oneapm_rpm-1.3.6 lib/one_apm/agent/busy_calculator.rb
oneapm_rpm-1.3.6.rc1 lib/one_apm/agent/busy_calculator.rb
oneapm_rpm-1.3.5 lib/one_apm/agent/busy_calculator.rb
oneapm_rpm-1.3.5.rc1 lib/one_apm/agent/busy_calculator.rb
oneapm_rpm-1.3.4 lib/one_apm/agent/busy_calculator.rb
oneapm_rpm-1.3.4.rc1 lib/one_apm/agent/busy_calculator.rb
oneapm_rpm-1.3.3 lib/one_apm/agent/busy_calculator.rb
oneapm_rpm-1.3.3.rc1 lib/one_apm/agent/busy_calculator.rb
oneapm_rpm-1.3.2 lib/one_apm/agent/busy_calculator.rb
oneapm_rpm-1.3.2.rc1 lib/one_apm/agent/busy_calculator.rb
oneapm_rpm-1.3.1 lib/one_apm/agent/busy_calculator.rb
oneapm_rpm-1.3.1.rc1 lib/one_apm/agent/busy_calculator.rb
oneapm_rpm-1.3.0 lib/one_apm/agent/busy_calculator.rb
oneapm_rpm-1.3.0.rc1 lib/one_apm/agent/busy_calculator.rb
oneapm_rpm-1.2.9 lib/one_apm/agent/busy_calculator.rb