Class: Pgbus::Metrics::Backends::Prometheus
- Inherits:
-
Pgbus::Metrics::Backend
- Object
- Pgbus::Metrics::Backend
- Pgbus::Metrics::Backends::Prometheus
- 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
- #gauge(name, value, tags = {}) ⇒ Object
- #histogram(name, value, tags = {}) ⇒ Object
- #increment(name, value = 1, tags = {}) ⇒ Object
-
#initialize ⇒ Prometheus
constructor
A new instance of Prometheus.
-
#render ⇒ Object
Render the full registry as Prometheus text exposition format.
Constructor Details
#initialize ⇒ Prometheus
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, = {}) key = tag_key() @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, = {}) key = tag_key() @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, = {}) key = tag_key() @mutex.synchronize do series = (@counters[name] ||= {}) series[key] = (series[key] || 0) + value end nil end |
#render ⇒ Object
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 |