diff --git a/lib/prometheus/client.rb b/lib/prometheus/client.rb index fe09d9ba..670c6c18 100644 --- a/lib/prometheus/client.rb +++ b/lib/prometheus/client.rb @@ -8,7 +8,7 @@ module Prometheus module Client # Returns a default registry object def self.registry - @registry ||= Registry.new + Registry.instance end def self.config diff --git a/lib/prometheus/client/registry.rb b/lib/prometheus/client/registry.rb index 9e73e44f..f897ef31 100644 --- a/lib/prometheus/client/registry.rb +++ b/lib/prometheus/client/registry.rb @@ -5,6 +5,7 @@ require 'prometheus/client/gauge' require 'prometheus/client/histogram' require 'concurrent' +require 'singleton' module Prometheus module Client @@ -12,6 +13,8 @@ module Client class Registry class AlreadyRegisteredError < StandardError; end + include Singleton + def initialize @metrics = {} @lock = Concurrent::ReentrantReadWriteLock.new diff --git a/spec/prometheus/client/formats/text_spec.rb b/spec/prometheus/client/formats/text_spec.rb index d200ec1c..7f9a8ade 100644 --- a/spec/prometheus/client/formats/text_spec.rb +++ b/spec/prometheus/client/formats/text_spec.rb @@ -10,7 +10,7 @@ Prometheus::Client.config.data_store = Prometheus::Client::DataStores::Synchronized.new end - let(:registry) { Prometheus::Client::Registry.new } + let(:registry) { Prometheus::Client::Registry.instance } before do foo = registry.counter(:foo, diff --git a/spec/prometheus/client/registry_spec.rb b/spec/prometheus/client/registry_spec.rb index 0f052f11..2988be96 100644 --- a/spec/prometheus/client/registry_spec.rb +++ b/spec/prometheus/client/registry_spec.rb @@ -4,7 +4,7 @@ require 'prometheus/client/registry' describe Prometheus::Client::Registry do - let(:registry) { Prometheus::Client::Registry.new } + let(:registry) { Prometheus::Client::Registry.instance } describe '.new' do it 'returns a new registry instance' do @@ -13,6 +13,8 @@ end describe '#register' do + let(:registry) { Prometheus::Client::Registry.clone.instance } + it 'registers a new metric container and returns it' do metric = double(name: :test) @@ -89,6 +91,8 @@ def registry.exist?(*args) end describe '#exist?' do + let(:registry) { Prometheus::Client::Registry.clone.instance } + it 'returns true if a metric name has been registered' do registry.register(double(name: :test)) @@ -101,6 +105,8 @@ def registry.exist?(*args) end describe '#get' do + let(:registry) { Prometheus::Client::Registry.clone.instance } + it 'returns a previously registered metric container' do registry.register(double(name: :test)) diff --git a/spec/prometheus/middleware/collector_spec.rb b/spec/prometheus/middleware/collector_spec.rb index e2d53164..9651bf72 100644 --- a/spec/prometheus/middleware/collector_spec.rb +++ b/spec/prometheus/middleware/collector_spec.rb @@ -12,7 +12,7 @@ end let(:registry) do - Prometheus::Client::Registry.new + Prometheus::Client::Registry.instance end let(:original_app) do @@ -41,18 +41,22 @@ expect(last_response).to be_ok end - it 'traces request information' do - expect(Benchmark).to receive(:realtime).and_yield.and_return(0.2) + context 'trace' do + let(:registry) { Prometheus::Client::Registry.clone.instance } - get '/foo' + it 'traces request information' do + expect(Benchmark).to receive(:realtime).and_yield.and_return(0.2) - metric = :http_server_requests_total - labels = { method: 'get', path: '/foo', code: '200' } - expect(registry.get(metric).get(labels: labels)).to eql(1.0) + get '/foo' - metric = :http_server_request_duration_seconds - labels = { method: 'get', path: '/foo' } - expect(registry.get(metric).get(labels: labels)).to include("0.1" => 0, "0.25" => 1) + metric = :http_server_requests_total + labels = { method: 'get', path: '/foo', code: '200' } + expect(registry.get(metric).get(labels: labels)).to eql(1.0) + + metric = :http_server_request_duration_seconds + labels = { method: 'get', path: '/foo' } + expect(registry.get(metric).get(labels: labels)).to include("0.1" => 0, "0.25" => 1) + end end it 'normalizes paths containing numeric IDs by default' do @@ -113,6 +117,7 @@ metrics_prefix: 'lolrus', ) end + let(:registry) { Prometheus::Client::Registry.clone.instance } it 'provides alternate metric names' do expect( diff --git a/spec/prometheus/middleware/exporter_spec.rb b/spec/prometheus/middleware/exporter_spec.rb index 8916513b..019257e7 100644 --- a/spec/prometheus/middleware/exporter_spec.rb +++ b/spec/prometheus/middleware/exporter_spec.rb @@ -7,7 +7,7 @@ include Rack::Test::Methods let(:registry) do - Prometheus::Client::Registry.new + Prometheus::Client::Registry.instance end let(:app) do