| 
1 | 1 | from __future__ import unicode_literals  | 
2 | 2 | import os  | 
 | 3 | +import threading  | 
3 | 4 | import unittest  | 
4 | 5 | 
 
  | 
5 | 6 | 
 
  | 
6 | 7 | from prometheus_client import Gauge, Counter, Summary, Histogram, Metric  | 
7 | 8 | from prometheus_client import CollectorRegistry, generate_latest, ProcessCollector  | 
8 |  | -from prometheus_client import build_pushgateway_url  | 
 | 9 | +from prometheus_client import push_to_gateway, pushadd_to_gateway, delete_from_gateway  | 
 | 10 | +from prometheus_client import CONTENT_TYPE_LATEST  | 
 | 11 | + | 
 | 12 | +try:  | 
 | 13 | +    from BaseHTTPServer import BaseHTTPRequestHandler  | 
 | 14 | +    from BaseHTTPServer import HTTPServer  | 
 | 15 | +except ImportError:  | 
 | 16 | +    # Python 3  | 
 | 17 | +    from http.server import BaseHTTPRequestHandler  | 
 | 18 | +    from http.server import HTTPServer  | 
 | 19 | + | 
9 | 20 | 
 
  | 
10 | 21 | 
 
  | 
11 | 22 | class TestCounter(unittest.TestCase):  | 
@@ -373,24 +384,77 @@ def test_working_fake_pid(self):  | 
373 | 384 |         self.assertEqual(None, self.registry.get_sample_value('process_fake_namespace'))  | 
374 | 385 | 
 
  | 
375 | 386 | 
 
  | 
376 |  | -class TestBuildPushgatewayUrl(unittest.TestCase):  | 
377 |  | -    def test_job_instance(self):  | 
378 |  | -        expected = 'http://localhost:9091/metrics/jobs/foojob/instances/fooinstance'  | 
379 |  | - | 
380 |  | -        url = build_pushgateway_url('foojob', 'fooinstance')  | 
381 |  | -        self.assertEqual(url, expected)  | 
382 |  | - | 
383 |  | -    def test_host_port(self):  | 
384 |  | -        expected = 'http://foohost:9092/metrics/jobs/foojob'  | 
385 |  | - | 
386 |  | -        url = build_pushgateway_url('foojob', host='foohost', port=9092)  | 
387 |  | -        self.assertEqual(url, expected)  | 
388 |  | - | 
389 |  | -    def test_url_escaping(self):  | 
390 |  | -        expected = 'http://localhost:9091/metrics/jobs/foo%20job'  | 
391 |  | - | 
392 |  | -        url = build_pushgateway_url('foo job')  | 
393 |  | -        self.assertEqual(url, expected)  | 
 | 387 | +class TestPushGateway(unittest.TestCase):  | 
 | 388 | +    def setUp(self):  | 
 | 389 | +        self.registry = CollectorRegistry()  | 
 | 390 | +        self.counter = Gauge('g', 'help', registry=self.registry)  | 
 | 391 | +        self.requests = requests = []  | 
 | 392 | +        class TestHandler(BaseHTTPRequestHandler):  | 
 | 393 | +            def do_PUT(self):  | 
 | 394 | +                self.send_response(201)  | 
 | 395 | +                length = int(self.headers['content-length'])  | 
 | 396 | +                requests.append((self, self.rfile.read(length)))  | 
 | 397 | + | 
 | 398 | +            do_POST = do_PUT  | 
 | 399 | +            do_DELETE = do_PUT  | 
 | 400 | + | 
 | 401 | +        httpd = HTTPServer(('', 0), TestHandler)  | 
 | 402 | +        self.address = ':'.join([str(x) for x in httpd.server_address])  | 
 | 403 | +        class TestServer(threading.Thread):  | 
 | 404 | +            def run(self):  | 
 | 405 | +                httpd.handle_request()  | 
 | 406 | +        self.server = TestServer()  | 
 | 407 | +        self.server.daemon = True  | 
 | 408 | +        self.server.start()  | 
 | 409 | + | 
 | 410 | +    def test_push(self):  | 
 | 411 | +        push_to_gateway(self.address, "my_job", self.registry)  | 
 | 412 | +        self.assertEqual(self.requests[0][0].command, 'PUT')  | 
 | 413 | +        self.assertEqual(self.requests[0][0].path, '/job/my_job')  | 
 | 414 | +        self.assertEqual(self.requests[0][0].headers.get('content-type'), CONTENT_TYPE_LATEST)  | 
 | 415 | +        self.assertEqual(self.requests[0][1], b'# HELP g help\n# TYPE g gauge\ng 0.0\n')  | 
 | 416 | + | 
 | 417 | +    def test_push_with_groupingkey(self):  | 
 | 418 | +        push_to_gateway(self.address, "my_job", self.registry, {'a': 9})  | 
 | 419 | +        self.assertEqual(self.requests[0][0].command, 'PUT')  | 
 | 420 | +        self.assertEqual(self.requests[0][0].path, '/job/my_job/a/9')  | 
 | 421 | +        self.assertEqual(self.requests[0][0].headers.get('content-type'), CONTENT_TYPE_LATEST)  | 
 | 422 | +        self.assertEqual(self.requests[0][1], b'# HELP g help\n# TYPE g gauge\ng 0.0\n')  | 
 | 423 | + | 
 | 424 | +    def test_push_with_complex_groupingkey(self):  | 
 | 425 | +        push_to_gateway(self.address, "my_job", self.registry, {'a': 9, 'b': 'a/ z'})  | 
 | 426 | +        self.assertEqual(self.requests[0][0].command, 'PUT')  | 
 | 427 | +        self.assertEqual(self.requests[0][0].path, '/job/my_job/a/9/b/a%2F+z')  | 
 | 428 | +        self.assertEqual(self.requests[0][0].headers.get('content-type'), CONTENT_TYPE_LATEST)  | 
 | 429 | +        self.assertEqual(self.requests[0][1], b'# HELP g help\n# TYPE g gauge\ng 0.0\n')  | 
 | 430 | + | 
 | 431 | +    def test_pushadd(self):  | 
 | 432 | +        pushadd_to_gateway(self.address, "my_job", self.registry)  | 
 | 433 | +        self.assertEqual(self.requests[0][0].command, 'POST')  | 
 | 434 | +        self.assertEqual(self.requests[0][0].path, '/job/my_job')  | 
 | 435 | +        self.assertEqual(self.requests[0][0].headers.get('content-type'), CONTENT_TYPE_LATEST)  | 
 | 436 | +        self.assertEqual(self.requests[0][1], b'# HELP g help\n# TYPE g gauge\ng 0.0\n')  | 
 | 437 | + | 
 | 438 | +    def test_pushadd_with_groupingkey(self):  | 
 | 439 | +        pushadd_to_gateway(self.address, "my_job", self.registry, {'a': 9})  | 
 | 440 | +        self.assertEqual(self.requests[0][0].command, 'POST')  | 
 | 441 | +        self.assertEqual(self.requests[0][0].path, '/job/my_job/a/9')  | 
 | 442 | +        self.assertEqual(self.requests[0][0].headers.get('content-type'), CONTENT_TYPE_LATEST)  | 
 | 443 | +        self.assertEqual(self.requests[0][1], b'# HELP g help\n# TYPE g gauge\ng 0.0\n')  | 
 | 444 | + | 
 | 445 | +    def test_delete(self):  | 
 | 446 | +        delete_from_gateway(self.address, "my_job")  | 
 | 447 | +        self.assertEqual(self.requests[0][0].command, 'DELETE')  | 
 | 448 | +        self.assertEqual(self.requests[0][0].path, '/job/my_job')  | 
 | 449 | +        self.assertEqual(self.requests[0][0].headers.get('content-type'), CONTENT_TYPE_LATEST)  | 
 | 450 | +        self.assertEqual(self.requests[0][1], b'')  | 
 | 451 | + | 
 | 452 | +    def test_pushadd_with_groupingkey(self):  | 
 | 453 | +        delete_from_gateway(self.address, "my_job", {'a': 9})  | 
 | 454 | +        self.assertEqual(self.requests[0][0].command, 'DELETE')  | 
 | 455 | +        self.assertEqual(self.requests[0][0].path, '/job/my_job/a/9')  | 
 | 456 | +        self.assertEqual(self.requests[0][0].headers.get('content-type'), CONTENT_TYPE_LATEST)  | 
 | 457 | +        self.assertEqual(self.requests[0][1], b'')  | 
394 | 458 | 
 
  | 
395 | 459 | 
 
  | 
396 | 460 | if __name__ == '__main__':  | 
 | 
0 commit comments