Class: Philiprehberger::Metric::Registry

Inherits:
Object
  • Object
show all
Defined in:
lib/philiprehberger/metric/registry.rb

Overview

Global metric registry that stores and manages all metrics.

Instance Method Summary collapse

Constructor Details

#initializeRegistry

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.

Parameters:

  • name (String)

    the metric name

  • help (String) (defaults to: '')

    the help description

Returns:



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.

Parameters:

  • name (String)

    the metric name

  • help (String) (defaults to: '')

    the help description

Returns:



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.

Parameters:

  • name (String)

    the metric name

Returns:

Raises:

  • (Error)

    if the metric is not registered



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.

Parameters:

  • name (String)

    the metric name

  • help (String) (defaults to: '')

    the help description

  • buckets (Array<Numeric>) (defaults to: Histogram::DEFAULT_BUCKETS)

    bucket boundaries

Returns:



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.

Parameters:

  • name (String)

    the metric name

  • labels (Hash) (defaults to: {})

    optional labels



73
74
75
76
# File 'lib/philiprehberger/metric/registry.rb', line 73

def increment(name, labels: {})
  metric = fetch(name)
  metric.increment(labels: labels)
end

#namesArray<String>

List the names of all registered metrics.

Returns:

  • (Array<String>)


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.

Parameters:

  • name (String)

    the metric name

  • value (Numeric)

    the observed value

  • labels (Hash) (defaults to: {})

    optional labels



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.

Parameters:

  • name (String)

    the metric name

Returns:

  • (Boolean)


181
182
183
# File 'lib/philiprehberger/metric/registry.rb', line 181

def registered?(name)
  @mutex.synchronize { @metrics.key?(name) }
end

#resetvoid

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.

Parameters:

  • name (String)

    the metric name

  • value (Numeric)

    the value to set

  • labels (Hash) (defaults to: {})

    optional labels



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.

Parameters:

  • name (String)

    the metric name

Returns:

  • (Hash)


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.

Parameters:

  • name (String)

    the metric name

  • help (String) (defaults to: '')

    the help description

  • quantiles (Array<Float>) (defaults to: Summary::DEFAULT_QUANTILES)

    quantiles to compute

Returns:



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.

Parameters:

  • name (String)

    the histogram metric name (must already be registered)

  • labels (Hash) (defaults to: {})

    optional labels

Returns:

  • (Object)

    the block’s return value



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.

Returns:

  • (String)


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_prometheusString

Export all metrics in Prometheus text exposition format.

Returns:

  • (String)


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_statsdString

Export all metrics in StatsD line protocol format.

Returns:

  • (String)


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.

Parameters:

  • name (String)

    the metric name

Returns:



189
190
191
# File 'lib/philiprehberger/metric/registry.rb', line 189

def unregister(name)
  @mutex.synchronize { @metrics.delete(name) }
end