Class: Philiprehberger::Metric::Registry
- Inherits:
-
Object
- Object
- Philiprehberger::Metric::Registry
- Defined in:
- lib/philiprehberger/metric/registry.rb
Overview
Global metric registry that stores and manages all metrics.
Instance Method Summary collapse
-
#counter(name, help: '') ⇒ Counter
Register a counter metric.
-
#gauge(name, help: '') ⇒ Gauge
Register a gauge metric.
-
#get(name) ⇒ Counter, ...
Get a registered metric by name.
-
#histogram(name, help: '', buckets: Histogram::DEFAULT_BUCKETS) ⇒ Histogram
Register a histogram metric.
-
#increment(name, labels: {}) ⇒ void
Increment a counter metric.
-
#initialize ⇒ Registry
constructor
A new instance of Registry.
-
#names ⇒ Array<String>
List the names of all registered metrics.
-
#observe(name, value, labels: {}) ⇒ void
Observe a histogram or summary value.
-
#registered?(name) ⇒ Boolean
Check whether a metric is registered.
-
#reset ⇒ void
Reset all metrics.
-
#set(name, value, labels: {}) ⇒ void
Set a gauge metric value.
-
#snapshot(name) ⇒ Hash
Get a snapshot of a specific metric.
-
#summary(name, help: '', quantiles: Summary::DEFAULT_QUANTILES) ⇒ Summary
Register a summary metric.
-
#time(name, labels: {}) ⇒ Object
Measure block execution time and record as a histogram observation.
-
#to_json(*_args) ⇒ String
Export all metrics as JSON.
-
#to_prometheus ⇒ String
Export all metrics in Prometheus text exposition format.
-
#to_statsd ⇒ String
Export all metrics in StatsD line protocol format.
-
#unregister(name) ⇒ Counter, ...
Unregister a metric by name.
Constructor Details
#initialize ⇒ Registry
Returns a new instance of Registry.
9 10 11 12 |
# File 'lib/philiprehberger/metric/registry.rb', line 9 def initialize @mutex = Mutex.new @metrics = {} end |
Instance Method Details
#counter(name, help: '') ⇒ Counter
Register a counter metric.
19 20 21 22 23 24 25 |
# File 'lib/philiprehberger/metric/registry.rb', line 19 def counter(name, help: '') @mutex.synchronize do raise Error, "Metric '#{name}' already registered" if @metrics.key?(name) @metrics[name] = Counter.new(name, help: help) end end |
#gauge(name, help: '') ⇒ Gauge
Register a gauge metric.
32 33 34 35 36 37 38 |
# File 'lib/philiprehberger/metric/registry.rb', line 32 def gauge(name, help: '') @mutex.synchronize do raise Error, "Metric '#{name}' already registered" if @metrics.key?(name) @metrics[name] = Gauge.new(name, help: help) end end |
#get(name) ⇒ Counter, ...
Get a registered metric by name.
119 120 121 |
# File 'lib/philiprehberger/metric/registry.rb', line 119 def get(name) fetch(name) end |
#histogram(name, help: '', buckets: Histogram::DEFAULT_BUCKETS) ⇒ Histogram
Register a histogram metric.
46 47 48 49 50 51 52 |
# File 'lib/philiprehberger/metric/registry.rb', line 46 def histogram(name, help: '', buckets: Histogram::DEFAULT_BUCKETS) @mutex.synchronize do raise Error, "Metric '#{name}' already registered" if @metrics.key?(name) @metrics[name] = Histogram.new(name, help: help, buckets: buckets) end end |
#increment(name, labels: {}) ⇒ void
This method returns an undefined value.
Increment a counter metric.
73 74 75 76 |
# File 'lib/philiprehberger/metric/registry.rb', line 73 def increment(name, labels: {}) metric = fetch(name) metric.increment(labels: labels) end |
#names ⇒ Array<String>
List the names of all registered metrics.
173 174 175 |
# File 'lib/philiprehberger/metric/registry.rb', line 173 def names @mutex.synchronize { @metrics.keys.dup } end |
#observe(name, value, labels: {}) ⇒ void
This method returns an undefined value.
Observe a histogram or summary value.
95 96 97 98 |
# File 'lib/philiprehberger/metric/registry.rb', line 95 def observe(name, value, labels: {}) metric = fetch(name) metric.observe(value, labels: labels) end |
#registered?(name) ⇒ Boolean
Check whether a metric is registered.
181 182 183 |
# File 'lib/philiprehberger/metric/registry.rb', line 181 def registered?(name) @mutex.synchronize { @metrics.key?(name) } end |
#reset ⇒ void
This method returns an undefined value.
Reset all metrics.
196 197 198 199 200 201 |
# File 'lib/philiprehberger/metric/registry.rb', line 196 def reset @mutex.synchronize do @metrics.each_value(&:reset) @metrics.clear end end |
#set(name, value, labels: {}) ⇒ void
This method returns an undefined value.
Set a gauge metric value.
84 85 86 87 |
# File 'lib/philiprehberger/metric/registry.rb', line 84 def set(name, value, labels: {}) metric = fetch(name) metric.set(value, labels: labels) end |
#snapshot(name) ⇒ Hash
Get a snapshot of a specific metric.
127 128 129 |
# File 'lib/philiprehberger/metric/registry.rb', line 127 def snapshot(name) fetch(name).snapshot end |
#summary(name, help: '', quantiles: Summary::DEFAULT_QUANTILES) ⇒ Summary
Register a summary metric.
60 61 62 63 64 65 66 |
# File 'lib/philiprehberger/metric/registry.rb', line 60 def summary(name, help: '', quantiles: Summary::DEFAULT_QUANTILES) @mutex.synchronize do raise Error, "Metric '#{name}' already registered" if @metrics.key?(name) @metrics[name] = Summary.new(name, help: help, quantiles: quantiles) end end |
#time(name, labels: {}) ⇒ Object
Measure block execution time and record as a histogram observation.
105 106 107 108 109 110 111 112 |
# File 'lib/philiprehberger/metric/registry.rb', line 105 def time(name, labels: {}) metric = fetch(name) start = Process.clock_gettime(Process::CLOCK_MONOTONIC) result = yield duration = Process.clock_gettime(Process::CLOCK_MONOTONIC) - start metric.observe(duration, labels: labels) result end |
#to_json(*_args) ⇒ String
Export all metrics as JSON.
147 148 149 150 151 152 153 154 155 156 157 |
# File 'lib/philiprehberger/metric/registry.rb', line 147 def to_json(*_args) data = {} @mutex.synchronize { @metrics.dup }.each do |name, metric| data[name] = { type: metric.type, help: metric.help, values: metric.snapshot } end JSON.generate(data) end |
#to_prometheus ⇒ String
Export all metrics in Prometheus text exposition format.
134 135 136 137 138 139 140 141 142 |
# File 'lib/philiprehberger/metric/registry.rb', line 134 def to_prometheus lines = [] @mutex.synchronize { @metrics.dup }.each_value do |metric| lines << "# HELP #{metric.name} #{metric.help}" lines << "# TYPE #{metric.name} #{metric.type}" format_prometheus_metric(lines, metric) end "#{lines.join("\n")}\n" end |
#to_statsd ⇒ String
Export all metrics in StatsD line protocol format.
162 163 164 165 166 167 168 |
# File 'lib/philiprehberger/metric/registry.rb', line 162 def to_statsd lines = [] @mutex.synchronize { @metrics.dup }.each_value do |metric| format_statsd_metric(lines, metric) end lines.join("\n") end |
#unregister(name) ⇒ Counter, ...
Unregister a metric by name.
189 190 191 |
# File 'lib/philiprehberger/metric/registry.rb', line 189 def unregister(name) @mutex.synchronize { @metrics.delete(name) } end |