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