Class: Pgbus::Metrics::Backends::Prometheus

Inherits:
Pgbus::Metrics::Backend show all
Defined in:
lib/pgbus/metrics/backends/prometheus.rb

Overview

Dependency-free, in-process Prometheus registry.

Counters and gauges are stored per (name, sorted-tags) series. Histograms are stored as a sum+count summary — cheap, dependency-free, and enough for rate/avg dashboards without pre-declaring buckets. State is Mutex-guarded (no unsynchronized shared state), since instrumentation fires from many worker threads while the exporter renders from a Rack thread.

Render output is Prometheus text exposition format (v0.0.4), served by Pgbus::Metrics::PrometheusExporter.

Defined Under Namespace

Classes: Series

Instance Method Summary collapse

Constructor Details

#initializePrometheus

Returns a new instance of Prometheus.



19
20
21
22
23
24
25
26
27
28
29
# File 'lib/pgbus/metrics/backends/prometheus.rb', line 19

def initialize
  super
  @mutex = Mutex.new
  # name => Series
  @counters = {}
  @gauges = {}
  # name => { tags_key => { sum:, count:, tags: } }
  @histograms = {}
  # tags_key (sorted array) => original tags hash, for rendering labels
  @tag_labels = {}
end

Instance Method Details

#gauge(name, value, tags = {}) ⇒ Object



40
41
42
43
44
45
46
47
# File 'lib/pgbus/metrics/backends/prometheus.rb', line 40

def gauge(name, value, tags = {})
  key = tag_key(tags)
  @mutex.synchronize do
    series = (@gauges[name] ||= {})
    series[key] = value
  end
  nil
end

#histogram(name, value, tags = {}) ⇒ Object



49
50
51
52
53
54
55
56
57
58
# File 'lib/pgbus/metrics/backends/prometheus.rb', line 49

def histogram(name, value, tags = {})
  key = tag_key(tags)
  @mutex.synchronize do
    series = (@histograms[name] ||= {})
    bucket = (series[key] ||= { sum: 0, count: 0 })
    bucket[:sum] += value
    bucket[:count] += 1
  end
  nil
end

#increment(name, value = 1, tags = {}) ⇒ Object



31
32
33
34
35
36
37
38
# File 'lib/pgbus/metrics/backends/prometheus.rb', line 31

def increment(name, value = 1, tags = {})
  key = tag_key(tags)
  @mutex.synchronize do
    series = (@counters[name] ||= {})
    series[key] = (series[key] || 0) + value
  end
  nil
end

#renderObject

Render the full registry as Prometheus text exposition format.



61
62
63
64
65
66
67
68
69
# File 'lib/pgbus/metrics/backends/prometheus.rb', line 61

def render
  @mutex.synchronize do
    lines = []
    @counters.each { |name, series| render_simple(lines, name, "counter", series) }
    @gauges.each   { |name, series| render_simple(lines, name, "gauge", series) }
    @histograms.each { |name, series| render_summary(lines, name, series) }
    "#{lines.join("\n")}\n"
  end
end