Class: OneApm::Collector::Samplers::VMSampler

Inherits:
OneApm::Collector::Sampler show all
Defined in:
lib/one_apm/collector/samplers/vm_sampler.rb

Constant Summary collapse

OA_GC_RUNS_METRIC =
'RubyVM/GC/runs'.freeze
OA_HEAP_LIVE_METRIC =
'RubyVM/GC/heap_live'.freeze
OA_HEAP_FREE_METRIC =
'RubyVM/GC/heap_free'.freeze
OA_THREAD_COUNT_METRIC =
'RubyVM/Threads/all'.freeze
OA_OBJECT_ALLOCATIONS_METRIC =
'RubyVM/GC/total_allocated_object'.freeze
OA_MAJOR_GC_METRIC =
'RubyVM/GC/major_gc_count'.freeze
OA_MINOR_GC_METRIC =
'RubyVM/GC/minor_gc_count'.freeze
OA_METHOD_INVALIDATIONS_METRIC =
'RubyVM/CacheInvalidations/method'.freeze
OA_CONSTANT_INVALIDATIONS_METRIC =
'RubyVM/CacheInvalidations/constant'.freeze

Instance Attribute Summary collapse

Attributes inherited from OneApm::Collector::Sampler

#id

Instance Method Summary collapse

Methods inherited from OneApm::Collector::Sampler

enabled?, inherited, name, named, sampler_classes, supported_on_this_platform?

Constructor Details

#initializeVMSampler

Returns a new instance of VMSampler.



24
25
26
27
28
# File 'lib/one_apm/collector/samplers/vm_sampler.rb', line 24

def initialize
  @lock = Mutex.new
  @transaction_count = 0
  @last_snapshot = take_snapshot
end

Instance Attribute Details

#transaction_countObject (readonly)

Returns the value of attribute transaction_count.



20
21
22
# File 'lib/one_apm/collector/samplers/vm_sampler.rb', line 20

def transaction_count
  @transaction_count
end

Instance Method Details

#on_transaction_finished(*_) ⇒ Object



38
39
40
# File 'lib/one_apm/collector/samplers/vm_sampler.rb', line 38

def on_transaction_finished(*_)
  @lock.synchronize { @transaction_count += 1 }
end

#pollObject



105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
# 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) ⇒ Object



69
70
71
72
73
74
75
76
77
78
# 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) ⇒ Object



80
81
82
83
84
85
# 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) ⇒ Object



50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# 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) ⇒ Object



93
94
95
96
97
# 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) ⇒ Object



87
88
89
90
91
# 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) ⇒ Object



99
100
101
102
103
# 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_countObject



42
43
44
45
46
47
48
# 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) ⇒ Object



34
35
36
# 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_snapshotObject



30
31
32
# File 'lib/one_apm/collector/samplers/vm_sampler.rb', line 30

def take_snapshot
  OneApm::Support::VM.snapshot
end