lib/prometheus/client/push.rb in prometheus-client-4.2.0 vs lib/prometheus/client/push.rb in prometheus-client-4.2.1

- old
+ new

@@ -21,11 +21,11 @@ class HttpRedirectError < HttpError; end class HttpClientError < HttpError; end class HttpServerError < HttpError; end DEFAULT_GATEWAY = 'http://localhost:9091'.freeze - PATH = '/metrics/job/%s'.freeze + PATH = '/metrics'.freeze SUPPORTED_SCHEMES = %w(http https).freeze attr_reader :job, :gateway, :path def initialize(job:, gateway: DEFAULT_GATEWAY, grouping_key: {}, **kwargs) @@ -85,10 +85,17 @@ rescue URI::InvalidURIError => e raise ArgumentError, "#{url} is not a valid URL: #{e}" end def build_path(job, grouping_key) - path = format(PATH, ERB::Util::url_encode(job)) + # Job can't be empty, but it can contain `/`, so we need to base64 + # encode it in that case + if job.include?('/') + encoded_job = Base64.urlsafe_encode64(job) + path = "#{PATH}/job@base64/#{encoded_job}" + else + path = "#{PATH}/job/#{ERB::Util::url_encode(job)}" + end grouping_key.each do |label, value| if value.include?('/') encoded_value = Base64.urlsafe_encode64(value) path += "/#{label}@base64/#{encoded_value}"