Module: NewRelic::Agent::StatsEngine::GCProfiler

Defined in:
lib/new_relic/agent/stats_engine/gc_profiler.rb

Defined Under Namespace

Classes: CoreGCProfiler, GCSnapshot, RailsBenchProfiler

Constant Summary collapse

GC_ROLLUP =
'GC/Transaction/all'.freeze
GC_OTHER =
'GC/Transaction/allOther'.freeze
GC_WEB =
'GC/Transaction/allWeb'.freeze

Class Method Summary collapse

Class Method Details

.gc_metric_nameObject



59
60
61
62
63
64
65
# File 'lib/new_relic/agent/stats_engine/gc_profiler.rb', line 59

def self.gc_metric_name
  if NewRelic::Agent::Transaction.recording_web_transaction?
    GC_WEB
  else
    GC_OTHER
  end
end

.initObject



11
12
13
14
15
16
17
18
19
20
21
22
# File 'lib/new_relic/agent/stats_engine/gc_profiler.rb', line 11

def self.init
  @initialized ||= nil
  return @profiler if @initialized

  @profiler = if RailsBenchProfiler.enabled?
    RailsBenchProfiler.new
  elsif CoreGCProfiler.enabled?
    CoreGCProfiler.new
  end
  @initialized = true
  @profiler
end

.record_delta(start_snapshot, end_snapshot) ⇒ Object



36
37
38
39
40
41
42
43
44
45
# File 'lib/new_relic/agent/stats_engine/gc_profiler.rb', line 36

def self.record_delta(start_snapshot, end_snapshot)
  if @profiler && start_snapshot && end_snapshot
    elapsed_gc_time_s = end_snapshot.gc_time_s - start_snapshot.gc_time_s
    num_calls = end_snapshot.gc_call_count - start_snapshot.gc_call_count
    record_gc_metric(num_calls, elapsed_gc_time_s)

    @profiler.reset
    elapsed_gc_time_s
  end
end

.record_gc_metric(call_count, elapsed) ⇒ Object

THREAD_LOCAL_ACCESS



47
48
49
50
51
52
53
# File 'lib/new_relic/agent/stats_engine/gc_profiler.rb', line 47

def self.record_gc_metric(call_count, elapsed) # THREAD_LOCAL_ACCESS
  NewRelic::Agent.agent.stats_engine.tl_record_scoped_and_unscoped_metrics(gc_metric_name, GC_ROLLUP) do |stats|
    stats.call_count += call_count
    stats.total_call_time += elapsed
    stats.total_exclusive_time += elapsed
  end
end

.resetObject



24
25
26
27
# File 'lib/new_relic/agent/stats_engine/gc_profiler.rb', line 24

def self.reset
  @profiler = nil
  @initialized = nil
end

.take_snapshotObject



29
30
31
32
33
34
# File 'lib/new_relic/agent/stats_engine/gc_profiler.rb', line 29

def self.take_snapshot
  init
  if @profiler
    GCSnapshot.new(@profiler.call_time_s, @profiler.call_count)
  end
end