class Mmtrix::Agent::Samplers::VMSampler

Constants

CONSTANT_INVALIDATIONS_METRIC
GC_RUNS_METRIC
HEAP_FREE_METRIC
HEAP_LIVE_METRIC
MAJOR_GC_METRIC
METHOD_INVALIDATIONS_METRIC
MINOR_GC_METRIC
OBJECT_ALLOCATIONS_METRIC
THREAD_COUNT_METRIC

Attributes

transaction_count[R]

Public Class Methods

new() click to toggle source
# File lib/mmtrix/agent/samplers/vm_sampler.rb, line 26
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/mmtrix/agent/samplers/vm_sampler.rb, line 40
def on_transaction_finished(*_)
  @lock.synchronize { @transaction_count += 1 }
end
poll() click to toggle source
# File lib/mmtrix/agent/samplers/vm_sampler.rb, line 107
def poll
  snap = take_snapshot
  tcount = reset_transaction_count

  record_gc_runs_metric(snap, tcount)
  record_delta(snap, :total_allocated_object, OBJECT_ALLOCATIONS_METRIC, tcount)
  record_delta(snap, :major_gc_count, MAJOR_GC_METRIC, tcount)
  record_delta(snap, :minor_gc_count, MINOR_GC_METRIC, tcount)
  record_delta(snap, :method_cache_invalidations, METHOD_INVALIDATIONS_METRIC, tcount)
  record_delta(snap, :constant_cache_invalidations, 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/mmtrix/agent/samplers/vm_sampler.rb, line 71
def record_delta(snapshot, key, metric, txn_count) #THREAD_LOCAL_ACCESS
  value = snapshot.send(key)
  if value
    delta = value - @last_snapshot.send(key)
    Mmtrix::Agent.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/mmtrix/agent/samplers/vm_sampler.rb, line 82
def record_gauge_metric(metric_name, value) #THREAD_LOCAL_ACCESS
  Mmtrix::Agent.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/mmtrix/agent/samplers/vm_sampler.rb, line 52
def record_gc_runs_metric(snapshot, txn_count) #THREAD_LOCAL_ACCESS
  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
    Mmtrix::Agent.agent.stats_engine.tl_record_unscoped_metrics(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/mmtrix/agent/samplers/vm_sampler.rb, line 95
def record_heap_free_metric(snapshot)
  if snapshot.heap_free
    record_gauge_metric(HEAP_FREE_METRIC, snapshot.heap_free)
  end
end
record_heap_live_metric(snapshot) click to toggle source
# File lib/mmtrix/agent/samplers/vm_sampler.rb, line 89
def record_heap_live_metric(snapshot)
  if snapshot.heap_live
    record_gauge_metric(HEAP_LIVE_METRIC, snapshot.heap_live)
  end
end
record_thread_count_metric(snapshot) click to toggle source
# File lib/mmtrix/agent/samplers/vm_sampler.rb, line 101
def record_thread_count_metric(snapshot)
  if snapshot.thread_count
    record_gauge_metric(THREAD_COUNT_METRIC, snapshot.thread_count)
  end
end
reset_transaction_count() click to toggle source
# File lib/mmtrix/agent/samplers/vm_sampler.rb, line 44
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/mmtrix/agent/samplers/vm_sampler.rb, line 36
def setup_events(event_listener)
  event_listener.subscribe(:transaction_finished, &method(:on_transaction_finished))
end
take_snapshot() click to toggle source
# File lib/mmtrix/agent/samplers/vm_sampler.rb, line 32
def take_snapshot
  Mmtrix::Agent::VM.snapshot
end