diff --git a/prometheus_client/exposition.py b/prometheus_client/exposition.py index 634066f7..191e7454 100644 --- a/prometheus_client/exposition.py +++ b/prometheus_client/exposition.py @@ -362,7 +362,10 @@ def _use_gateway(method, gateway, job, registry, grouping_key, timeout, handler) def _escape_grouping_key(k, v): - if '/' in v: + if v == "" : + # Per https://github.com/prometheus/pushgateway/pull/346. + return k + "@base64", "=" + elif '/' in v: # Added in Pushgateway 0.9.0. return k + "@base64", base64.urlsafe_b64encode(v.encode("utf-8")).decode("utf-8") else: diff --git a/tests/test_exposition.py b/tests/test_exposition.py index 21b3f59f..25360b30 100644 --- a/tests/test_exposition.py +++ b/tests/test_exposition.py @@ -260,6 +260,13 @@ def test_push_with_groupingkey(self): self.assertEqual(self.requests[0][0].headers.get('content-type'), CONTENT_TYPE_LATEST) self.assertEqual(self.requests[0][1], b'# HELP g help\n# TYPE g gauge\ng 0.0\n') + def test_push_with_groupingkey_empty_label(self): + push_to_gateway(self.address, "my_job", self.registry, {'a': ''}) + self.assertEqual(self.requests[0][0].command, 'PUT') + self.assertEqual(self.requests[0][0].path, '/metrics/job/my_job/a@base64/=') + self.assertEqual(self.requests[0][0].headers.get('content-type'), CONTENT_TYPE_LATEST) + self.assertEqual(self.requests[0][1], b'# HELP g help\n# TYPE g gauge\ng 0.0\n') + def test_push_with_complex_groupingkey(self): push_to_gateway(self.address, "my_job", self.registry, {'a': 9, 'b': 'a/ z'}) self.assertEqual(self.requests[0][0].command, 'PUT')