Class: ElasticAPM::Metrics::Registry Private

Inherits:
Object
  • Object
show all
Includes:
Logging
Defined in:
lib/elastic_apm/metrics.rb

This class is part of a private API. You should avoid using this class if possible, as it may be removed or be changed in the future.

Constant Summary

Constants included from Logging

Logging::LEVELS, Logging::PREFIX

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Logging

#debug, #error, #fatal, #info, #warn

Constructor Details

#initialize(config, &block) ⇒ Registry

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns a new instance of Registry.



39
40
41
42
43
# File 'lib/elastic_apm/metrics.rb', line 39

def initialize(config, &block)
  @config = config
  @callback = block
  @sets = nil
end

Instance Attribute Details

#callbackObject (readonly)

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



45
46
47
# File 'lib/elastic_apm/metrics.rb', line 45

def callback
  @callback
end

#configObject (readonly)

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



45
46
47
# File 'lib/elastic_apm/metrics.rb', line 45

def config
  @config
end

#setsObject (readonly)

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



45
46
47
# File 'lib/elastic_apm/metrics.rb', line 45

def sets
  @sets
end

Instance Method Details

#collectObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



113
114
115
116
117
118
119
# File 'lib/elastic_apm/metrics.rb', line 113

def collect
  sets.each_value.each_with_object([]) do |set, arr|
    samples = set.collect
    next unless samples
    arr.concat(samples)
  end
end

#collect_and_sendObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



104
105
106
107
108
109
110
111
# File 'lib/elastic_apm/metrics.rb', line 104

def collect_and_send
  return unless @config.recording?
  metricsets = collect
  metricsets.compact!
  metricsets.each do |m|
    callback.call(m)
  end
end

#define_setsObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
# File 'lib/elastic_apm/metrics.rb', line 121

def define_sets
  # Only set the @sets once, in case we stop
  # and start again.
  return unless @sets.nil?

  sets = {
    system: CpuMemSet,
    vm: VMSet,
    breakdown: BreakdownSet,
    transaction: TransactionSet
  }
  if defined?(JVMSet)
    debug "Enabling JVM metrics collection"
    sets[:jvm] = JVMSet
  end

  @sets = sets.each_with_object({}) do |(key, kls), _sets_|
    debug "Adding metrics collector '#{kls}'"
    _sets_[key] = kls.new(config)
  end
end

#get(key) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



100
101
102
# File 'lib/elastic_apm/metrics.rb', line 100

def get(key)
  sets.fetch(key)
end

#handle_forking!Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



88
89
90
91
92
93
94
95
96
97
98
# File 'lib/elastic_apm/metrics.rb', line 88

def handle_forking!
  # Note that ideally we would be able to check if the @timer_task died
  # and restart it. You can't simply check @timer_task.running? because
  # it will only return the state of the TimerTask, not whether the
  # internal thread used to manage the execution interval has died.
  # This is a limitation of the Concurrent::TimerTask object.
  # Therefore, our only option when forked is to stop and start.
  # ~estolfo
  stop
  start
end

#running?Boolean

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Returns:

  • (Boolean)


84
85
86
# File 'lib/elastic_apm/metrics.rb', line 84

def running?
  !!@running
end

#startObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/elastic_apm/metrics.rb', line 47

def start
  unless config.collect_metrics?
    debug 'Skipping metrics'
    return
  end

  define_sets

  debug 'Starting metrics'

  @timer_task = Concurrent::TimerTask.execute(
    run_now: true,
    execution_interval: config.metrics_interval
  ) do
    begin
      debug 'Collecting metrics'
      collect_and_send
      true
    rescue StandardError => e
      error 'Error while collecting metrics: %e', e.inspect
      debug { e.backtrace.join("\n") }
      false
    end
  end

  @running = true
end

#stopObject

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.



75
76
77
78
79
80
81
82
# File 'lib/elastic_apm/metrics.rb', line 75

def stop
  return unless running?

  debug 'Stopping metrics'

  @timer_task.shutdown
  @running = false
end