class OneApm::Collector::Samplers::VMSampler

Constants

OA_CONSTANT_INVALIDATIONS_METRIC
OA_GC_RUNS_METRIC
OA_HEAP_FREE_METRIC
OA_HEAP_LIVE_METRIC
OA_MAJOR_GC_METRIC
OA_METHOD_INVALIDATIONS_METRIC
OA_MINOR_GC_METRIC
OA_OBJECT_ALLOCATIONS_METRIC
OA_THREAD_COUNT_METRIC

Attributes

transaction_count[R]

Public Class Methods

new() click to toggle source
# File lib/one_apm/collector/samplers/vm_sampler.rb, line 24
def initialize
  @lock = Mutex.new
  @transaction_count = 0
  @last_snapshot = take_snapshot
end

Public Instance Methods

on_transaction_finished(*_) click to toggle source
# File lib/one_apm/collector/samplers/vm_sampler.rb, line 38
def on_transaction_finished(*_)
  @lock.synchronize { @transaction_count += 1 }
end
poll() click to toggle source
# File lib/one_apm/collector/samplers/vm_sampler.rb, line 105
def poll
  snap = take_snapshot
  tcount = reset_transaction_count

  record_gc_runs_metric(snap, tcount)
  record_delta(snap, :total_allocated_object, OA_OBJECT_ALLOCATIONS_METRIC, tcount)
  record_delta(snap, :major_gc_count, OA_MAJOR_GC_METRIC, tcount)
  record_delta(snap, :minor_gc_count, OA_MINOR_GC_METRIC, tcount)
  record_delta(snap, :method_cache_invalidations, OA_METHOD_INVALIDATIONS_METRIC, tcount)
  record_delta(snap, :constant_cache_invalidations, OA_CONSTANT_INVALIDATIONS_METRIC, tcount)
  record_heap_live_metric(snap)
  record_heap_free_metric(snap)
  record_thread_count_metric(snap)

  @last_snapshot = snap
end
record_delta(snapshot, key, metric, txn_count) click to toggle source
# File lib/one_apm/collector/samplers/vm_sampler.rb, line 69
def record_delta(snapshot, key, metric, txn_count)
  value = snapshot.send(key)
  if value
    delta = value - @last_snapshot.send(key)
    OneApm::Manager.agent.stats_engine.tl_record_unscoped_metrics(metric) do |stats|
      stats.call_count      += txn_count
      stats.total_call_time += delta
    end
  end
end
record_gauge_metric(metric_name, value) click to toggle source
# File lib/one_apm/collector/samplers/vm_sampler.rb, line 80
def record_gauge_metric(metric_name, value)
  OneApm::Manager.agent.stats_engine.tl_record_unscoped_metrics(metric_name) do |stats|
    stats.call_count      = value
    stats.sum_of_squares  = 1
  end
end
record_gc_runs_metric(snapshot, txn_count) click to toggle source
# File lib/one_apm/collector/samplers/vm_sampler.rb, line 50
def record_gc_runs_metric(snapshot, txn_count)
  if snapshot.gc_total_time || snapshot.gc_runs
    if snapshot.gc_total_time
      gc_time = snapshot.gc_total_time - @last_snapshot.gc_total_time.to_f
    end
    if snapshot.gc_runs
      gc_runs = snapshot.gc_runs - @last_snapshot.gc_runs
    end
    wall_clock_time = snapshot.taken_at - @last_snapshot.taken_at
    OneApm::Manager.agent.stats_engine.tl_record_unscoped_metrics(OA_GC_RUNS_METRIC) do |stats|
      stats.call_count           += txn_count
      stats.total_call_time      += gc_runs if gc_runs
      stats.total_exclusive_time += gc_time if gc_time
      stats.max_call_time         = (gc_time.nil? ? 0 : 1)
      stats.sum_of_squares       += wall_clock_time
    end
  end
end
record_heap_free_metric(snapshot) click to toggle source
# File lib/one_apm/collector/samplers/vm_sampler.rb, line 93
def record_heap_free_metric(snapshot)
  if snapshot.heap_free
    record_gauge_metric(OA_HEAP_FREE_METRIC, snapshot.heap_free)
  end
end
record_heap_live_metric(snapshot) click to toggle source
# File lib/one_apm/collector/samplers/vm_sampler.rb, line 87
def record_heap_live_metric(snapshot)
  if snapshot.heap_live
    record_gauge_metric(OA_HEAP_LIVE_METRIC, snapshot.heap_live)
  end
end
record_thread_count_metric(snapshot) click to toggle source
# File lib/one_apm/collector/samplers/vm_sampler.rb, line 99
def record_thread_count_metric(snapshot)
  if snapshot.thread_count
    record_gauge_metric(OA_THREAD_COUNT_METRIC, snapshot.thread_count)
  end
end
reset_transaction_count() click to toggle source
# File lib/one_apm/collector/samplers/vm_sampler.rb, line 42
def reset_transaction_count
  @lock.synchronize do
    old_count = @transaction_count
    @transaction_count = 0
    old_count
  end
end
setup_events(event_listener) click to toggle source
# File lib/one_apm/collector/samplers/vm_sampler.rb, line 34
def setup_events(event_listener)
  event_listener.subscribe(:transaction_finished, &method(:on_transaction_finished))
end
take_snapshot() click to toggle source
# File lib/one_apm/collector/samplers/vm_sampler.rb, line 30
def take_snapshot
  OneApm::Support::VM.snapshot
end