Class: PrometheusExporter::Instrumentation::ActiveRecord

Inherits:
PeriodicStats
  • Object
show all
Defined in:
lib/prometheus_exporter/instrumentation/active_record.rb

Constant Summary collapse

ALLOWED_CONFIG_LABELS =
%i(database username host port)

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from PeriodicStats

started?, stop, worker_loop

Constructor Details

#initialize(metric_labels, config_labels) ⇒ ActiveRecord

Returns a new instance of ActiveRecord.



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

def initialize(metric_labels, config_labels)
  @metric_labels = metric_labels
  @config_labels = config_labels
end

Class Method Details

.start(client: nil, frequency: 30, custom_labels: {}, config_labels: []) ⇒ Object



8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# File 'lib/prometheus_exporter/instrumentation/active_record.rb', line 8

def self.start(client: nil, frequency: 30, custom_labels: {}, config_labels: [])
  client ||= PrometheusExporter::Client.default

  # Not all rails versions support connection pool stats
  unless ::ActiveRecord::Base.connection_pool.respond_to?(:stat)
    client.logger.error("ActiveRecord connection pool stats not supported in your rails version")
    return
  end

  config_labels.map!(&:to_sym)
  validate_config_labels(config_labels)

  active_record_collector = new(custom_labels, config_labels)

  worker_loop do
    metrics = active_record_collector.collect
    metrics.each { |metric| client.send_json metric }
  end

  super
end

.validate_config_labels(config_labels) ⇒ Object



30
31
32
33
# File 'lib/prometheus_exporter/instrumentation/active_record.rb', line 30

def self.validate_config_labels(config_labels)
  return if config_labels.size == 0
  raise "Invalid Config Labels, available options #{ALLOWED_CONFIG_LABELS}" if (config_labels - ALLOWED_CONFIG_LABELS).size > 0
end

Instance Method Details

#collectObject



40
41
42
43
44
# File 'lib/prometheus_exporter/instrumentation/active_record.rb', line 40

def collect
  metrics = []
  collect_active_record_pool_stats(metrics)
  metrics
end

#collect_active_record_pool_stats(metrics) ⇒ Object



50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/prometheus_exporter/instrumentation/active_record.rb', line 50

def collect_active_record_pool_stats(metrics)
  ObjectSpace.each_object(::ActiveRecord::ConnectionAdapters::ConnectionPool) do |pool|
    next if pool.connections.nil?

    metric = {
      pid: pid,
      type: "active_record",
      hostname: ::PrometheusExporter.hostname,
      metric_labels: labels(pool)
    }
    metric.merge!(pool.stat)
    metrics << metric
  end
end

#pidObject



46
47
48
# File 'lib/prometheus_exporter/instrumentation/active_record.rb', line 46

def pid
  @pid = ::Process.pid
end