Class: PrometheusExporter::Instrumentation::Puma

Inherits:
PeriodicStats show all
Defined in:
lib/prometheus_exporter/instrumentation/puma.rb

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from PeriodicStats

started?, stop, worker_loop

Constructor Details

#initialize(metric_labels = {}) ⇒ Puma

Returns a new instance of Puma.



20
21
22
# File 'lib/prometheus_exporter/instrumentation/puma.rb', line 20

def initialize(metric_labels = {})
  @metric_labels = metric_labels
end

Class Method Details

.start(client: nil, frequency: 30, labels: {}) ⇒ Object



8
9
10
11
12
13
14
15
16
17
18
# File 'lib/prometheus_exporter/instrumentation/puma.rb', line 8

def self.start(client: nil, frequency: 30, labels: {})
  puma_collector = new(labels)
  client ||= PrometheusExporter::Client.default

  worker_loop do
    metric = puma_collector.collect
    client.send_json metric
  end

  super
end

Instance Method Details

#collectObject



24
25
26
27
28
29
30
31
32
33
# File 'lib/prometheus_exporter/instrumentation/puma.rb', line 24

def collect
  metric = {
    pid: pid,
    type: "puma",
    hostname: ::PrometheusExporter.hostname,
    metric_labels: @metric_labels,
  }
  collect_puma_stats(metric)
  metric
end

#collect_puma_stats(metric) ⇒ Object



39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/prometheus_exporter/instrumentation/puma.rb', line 39

def collect_puma_stats(metric)
  stats = JSON.parse(::Puma.stats)

  if stats.key?("workers")
    metric[:phase] = stats["phase"]
    metric[:workers] = stats["workers"]
    metric[:booted_workers] = stats["booted_workers"]
    metric[:old_workers] = stats["old_workers"]

    stats["worker_status"].each do |worker|
      next if worker["last_status"].empty?
      collect_worker_status(metric, worker["last_status"])
    end
  else
    collect_worker_status(metric, stats)
  end
end

#pidObject



35
36
37
# File 'lib/prometheus_exporter/instrumentation/puma.rb', line 35

def pid
  @pid = ::Process.pid
end