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}"