diff --git a/lib/prometheus/middleware/collector.rb b/lib/prometheus/middleware/collector.rb index 48e3ddd1..5dc30463 100644 --- a/lib/prometheus/middleware/collector.rb +++ b/lib/prometheus/middleware/collector.rb @@ -91,6 +91,7 @@ def strip_ids_from_path(path) path .gsub(%r{/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}(/|$)}, '/:uuid\\1') .gsub(%r{/\d+(/|$)}, '/:id\\1') + .gsub(%r{/\w+--[0-9a-f]+(/|$)}, '/:signed_id\\1') end end end diff --git a/spec/prometheus/middleware/collector_spec.rb b/spec/prometheus/middleware/collector_spec.rb index 7809bcf9..bcc2487e 100644 --- a/spec/prometheus/middleware/collector_spec.rb +++ b/spec/prometheus/middleware/collector_spec.rb @@ -95,6 +95,20 @@ expect(registry.get(metric).get(labels: labels)).to include("0.1" => 0, "0.5" => 1) end + it 'normalizes paths containing signed_ids by default' do + expect(Benchmark).to receive(:realtime).and_yield.and_return(0.3) + + get '/foo/eyJfcmFpbHMiOnsibWVzc2FnZSI6--a419915169c2dc3419/bars' + + metric = :http_server_requests_total + labels = { method: 'get', path: '/foo/:signed_id/bars', code: '200' } + expect(registry.get(metric).get(labels: labels)).to eql(1.0) + + metric = :http_server_request_duration_seconds + labels = { method: 'get', path: '/foo/:signed_id/bars' } + expect(registry.get(metric).get(labels: labels)).to include("0.1" => 0, "0.5" => 1) + end + context 'when the app raises an exception' do let(:original_app) do lambda do |env|