class TestGauge(unittest.TestCase): def setUp(self): self.registry = CollectorRegistry() self.gauge = Gauge('g', 'help', registry=self.registry) def test_gauge(self): self.assertEqual(0, self.registry.get_sample_value('g')) self.gauge.inc() self.assertEqual(1, self.registry.get_sample_value('g')) self.gauge.dec(3) self.assertEqual(-2, self.registry.get_sample_value('g')) self.gauge.set(9) self.assertEqual(9, self.registry.get_sample_value('g')) def test_inprogress_function_decorator(self): self.assertEqual(0, self.registry.get_sample_value('g')) @self.gauge.track_inprogress() def f(): self.assertEqual(1, self.registry.get_sample_value('g')) self.assertEqual(([], None, None, None), inspect.getargspec(f)) f() self.assertEqual(0, self.registry.get_sample_value('g')) def test_inprogress_block_decorator(self): self.assertEqual(0, self.registry.get_sample_value('g')) with self.gauge.track_inprogress(): self.assertEqual(1, self.registry.get_sample_value('g')) self.assertEqual(0, self.registry.get_sample_value('g')) def test_gauge_function(self): x = {} self.gauge.set_function(lambda: len(x)) self.assertEqual(0, self.registry.get_sample_value('g')) self.gauge.inc() self.assertEqual(0, self.registry.get_sample_value('g')) x['a'] = None self.assertEqual(1, self.registry.get_sample_value('g')) def test_time_function_decorator(self): self.assertEqual(0, self.registry.get_sample_value('g')) @self.gauge.time() def f(): time.sleep(.001) self.assertEqual(([], None, None, None), inspect.getargspec(f)) f() self.assertNotEqual(0, self.registry.get_sample_value('g')) def test_time_block_decorator(self): self.assertEqual(0, self.registry.get_sample_value('g')) with self.gauge.time(): time.sleep(.001) self.assertNotEqual(0, self.registry.get_sample_value('g'))
class TestGauge(unittest.TestCase): def setUp(self): self.registry = CollectorRegistry() self.gauge = Gauge('g', 'help', registry=self.registry) def test_gauge(self): self.assertEqual(0, self.registry.get_sample_value('g')) self.gauge.inc() self.assertEqual(1, self.registry.get_sample_value('g')) self.gauge.dec(3) self.assertEqual(-2, self.registry.get_sample_value('g')) self.gauge.set(9) self.assertEqual(9, self.registry.get_sample_value('g')) def test_inprogress_function_decorator(self): self.assertEqual(0, self.registry.get_sample_value('g')) @self.gauge.track_inprogress() def f(): self.assertEqual(1, self.registry.get_sample_value('g')) self.assertEqual(([], None, None, None), inspect.getargspec(f)) f() self.assertEqual(0, self.registry.get_sample_value('g')) def test_inprogress_block_decorator(self): self.assertEqual(0, self.registry.get_sample_value('g')) with self.gauge.track_inprogress(): self.assertEqual(1, self.registry.get_sample_value('g')) self.assertEqual(0, self.registry.get_sample_value('g')) def test_gauge_function(self): x = {} self.gauge.set_function(lambda: len(x)) self.assertEqual(0, self.registry.get_sample_value('g')) self.gauge.inc() self.assertEqual(0, self.registry.get_sample_value('g')) x['a'] = None self.assertEqual(1, self.registry.get_sample_value('g')) def test_time_function_decorator(self): self.assertEqual(0, self.registry.get_sample_value('g')) @self.gauge.time() def f(): time.sleep(.001) self.assertEqual(([], None, None, None), inspect.getargspec(f)) f() self.assertNotEqual(0, self.registry.get_sample_value('g')) def test_function_decorator_multithread(self): self.assertEqual(0, self.registry.get_sample_value('g')) workers = 2 pool = ThreadPoolExecutor(max_workers=workers) @self.gauge.time() def f(duration): time.sleep(duration) expected_duration = 1 pool.submit(f, expected_duration) time.sleep(0.7 * expected_duration) pool.submit(f, expected_duration * 2) time.sleep(expected_duration) rounding_coefficient = 0.9 adjusted_expected_duration = expected_duration * rounding_coefficient self.assertLess(adjusted_expected_duration, self.registry.get_sample_value('g')) pool.shutdown(wait=True) def test_time_block_decorator(self): self.assertEqual(0, self.registry.get_sample_value('g')) with self.gauge.time(): time.sleep(.001) self.assertNotEqual(0, self.registry.get_sample_value('g'))
class TestGauge(unittest.TestCase): def setUp(self): self.registry = CollectorRegistry() self.gauge = Gauge('g', 'help', registry=self.registry) def test_repr(self): self.assertEqual(repr(self.gauge), "prometheus_client.metrics.Gauge(g)") def test_gauge(self): self.assertEqual(0, self.registry.get_sample_value('g')) self.gauge.inc() self.assertEqual(1, self.registry.get_sample_value('g')) self.gauge.dec(3) self.assertEqual(-2, self.registry.get_sample_value('g')) self.gauge.set(9) self.assertEqual(9, self.registry.get_sample_value('g')) def test_inprogress_function_decorator(self): self.assertEqual(0, self.registry.get_sample_value('g')) @self.gauge.track_inprogress() def f(): self.assertEqual(1, self.registry.get_sample_value('g')) self.assertEqual(([], None, None, None), getargspec(f)) f() self.assertEqual(0, self.registry.get_sample_value('g')) def test_inprogress_block_decorator(self): self.assertEqual(0, self.registry.get_sample_value('g')) with self.gauge.track_inprogress(): self.assertEqual(1, self.registry.get_sample_value('g')) self.assertEqual(0, self.registry.get_sample_value('g')) def test_gauge_function(self): x = {} self.gauge.set_function(lambda: len(x)) self.assertEqual(0, self.registry.get_sample_value('g')) self.gauge.inc() self.assertEqual(0, self.registry.get_sample_value('g')) x['a'] = None self.assertEqual(1, self.registry.get_sample_value('g')) def test_time_function_decorator(self): self.assertEqual(0, self.registry.get_sample_value('g')) @self.gauge.time() def f(): time.sleep(.001) self.assertEqual(([], None, None, None), getargspec(f)) f() self.assertNotEqual(0, self.registry.get_sample_value('g')) def test_function_decorator_multithread(self): self.assertEqual(0, self.registry.get_sample_value('g')) workers = 2 pool = ThreadPoolExecutor(max_workers=workers) @self.gauge.time() def f(duration): time.sleep(duration) expected_duration = 1 pool.submit(f, expected_duration) time.sleep(0.7 * expected_duration) pool.submit(f, expected_duration * 2) time.sleep(expected_duration) rounding_coefficient = 0.9 adjusted_expected_duration = expected_duration * rounding_coefficient self.assertLess(adjusted_expected_duration, self.registry.get_sample_value('g')) pool.shutdown(wait=True) def test_time_block_decorator(self): self.assertEqual(0, self.registry.get_sample_value('g')) with self.gauge.time(): time.sleep(.001) self.assertNotEqual(0, self.registry.get_sample_value('g')) def test_track_in_progress_not_observable(self): g = Gauge('test', 'help', labelnames=('label',), registry=self.registry) try: g.track_inprogress() except ValueError as e: self.assertIn('missing label values', str(e)) def test_timer_not_observable(self): g = Gauge('test', 'help', labelnames=('label',), registry=self.registry) try: g.time() except ValueError as e: self.assertIn('missing label values', str(e))
class TestGauge(unittest.TestCase): def setUp(self): self.registry = CollectorRegistry() self.gauge = Gauge('g', 'help', registry=self.registry) self.gauge_with_label = Gauge('g2', 'help', labelnames=("label1",), registry=self.registry) def test_repr(self): self.assertEqual(repr(self.gauge), "prometheus_client.metrics.Gauge(g)") def test_gauge(self): self.assertEqual(0, self.registry.get_sample_value('g')) self.gauge.inc() self.assertEqual(1, self.registry.get_sample_value('g')) self.gauge.dec(3) self.assertEqual(-2, self.registry.get_sample_value('g')) self.gauge.set(9) self.assertEqual(9, self.registry.get_sample_value('g')) def test_inc_not_observable(self): """.inc() must fail if the gauge is not observable.""" assert_not_observable(self.gauge_with_label.inc) def test_dec_not_observable(self): """.dec() must fail if the gauge is not observable.""" assert_not_observable(self.gauge_with_label.dec) def test_set_not_observable(self): """.set() must fail if the gauge is not observable.""" assert_not_observable(self.gauge_with_label.set, 1) def test_inprogress_function_decorator(self): self.assertEqual(0, self.registry.get_sample_value('g')) @self.gauge.track_inprogress() def f(): self.assertEqual(1, self.registry.get_sample_value('g')) self.assertEqual(([], None, None, None), getargspec(f)) f() self.assertEqual(0, self.registry.get_sample_value('g')) def test_inprogress_block_decorator(self): self.assertEqual(0, self.registry.get_sample_value('g')) with self.gauge.track_inprogress(): self.assertEqual(1, self.registry.get_sample_value('g')) self.assertEqual(0, self.registry.get_sample_value('g')) def test_gauge_function(self): x = {} self.gauge.set_function(lambda: len(x)) self.assertEqual(0, self.registry.get_sample_value('g')) self.gauge.inc() self.assertEqual(0, self.registry.get_sample_value('g')) x['a'] = None self.assertEqual(1, self.registry.get_sample_value('g')) def test_set_function_not_observable(self): """.set_function() must fail if the gauge is not observable.""" assert_not_observable(self.gauge_with_label.set_function, lambda: 1) def test_time_function_decorator(self): self.assertEqual(0, self.registry.get_sample_value('g')) @self.gauge.time() def f(): time.sleep(.001) self.assertEqual(([], None, None, None), getargspec(f)) f() self.assertNotEqual(0, self.registry.get_sample_value('g')) def test_function_decorator_multithread(self): self.assertEqual(0, self.registry.get_sample_value('g')) workers = 2 pool = ThreadPoolExecutor(max_workers=workers) @self.gauge.time() def f(duration): time.sleep(duration) expected_duration = 1 pool.submit(f, expected_duration) time.sleep(0.7 * expected_duration) pool.submit(f, expected_duration * 2) time.sleep(expected_duration) rounding_coefficient = 0.9 adjusted_expected_duration = expected_duration * rounding_coefficient self.assertLess(adjusted_expected_duration, self.registry.get_sample_value('g')) pool.shutdown(wait=True) def test_time_block_decorator(self): self.assertEqual(0, self.registry.get_sample_value('g')) with self.gauge.time(): time.sleep(.001) self.assertNotEqual(0, self.registry.get_sample_value('g')) def test_time_block_decorator_with_label(self): value = self.registry.get_sample_value self.assertEqual(None, value('g2', {'label1': 'foo'})) with self.gauge_with_label.time() as metric: metric.labels('foo') self.assertLess(0, value('g2', {'label1': 'foo'})) def test_track_in_progress_not_observable(self): g = Gauge('test', 'help', labelnames=('label',), registry=self.registry) assert_not_observable(g.track_inprogress) def test_timer_not_observable(self): g = Gauge('test', 'help', labelnames=('label',), registry=self.registry) def manager(): with g.time(): pass assert_not_observable(manager)
def test_reset_registry(self): registry = CollectorRegistry() gauge = Gauge('g', 'help', registry=registry) gauge.inc() self.assertEqual(1, registry.get_sample_value('g')) counter = Counter('c_total', 'help', registry=registry) counter.inc() self.assertEqual(1, registry.get_sample_value('c_total')) summary = Summary('s', 'help', registry=registry) summary.observe(10) self.assertEqual(1, registry.get_sample_value('s_count')) self.assertEqual(10, registry.get_sample_value('s_sum')) histogram = Histogram('h', 'help', registry=registry) histogram.observe(2) self.assertEqual(0, registry.get_sample_value('h_bucket', {'le': '1.0'})) self.assertEqual(1, registry.get_sample_value('h_bucket', {'le': '2.5'})) self.assertEqual(1, registry.get_sample_value('h_bucket', {'le': '5.0'})) self.assertEqual(1, registry.get_sample_value('h_bucket', {'le': '+Inf'})) self.assertEqual(1, registry.get_sample_value('h_count')) self.assertEqual(2, registry.get_sample_value('h_sum')) registry.reset() self.assertEqual(0, registry.get_sample_value('g')) self.assertEqual(0, registry.get_sample_value('c_total')) self.assertEqual(0, registry.get_sample_value('s_count')) self.assertEqual(0, registry.get_sample_value('s_sum')) self.assertEqual(0, registry.get_sample_value('h_bucket', {'le': '1.0'})) self.assertEqual(0, registry.get_sample_value('h_bucket', {'le': '2.5'})) self.assertEqual(0, registry.get_sample_value('h_bucket', {'le': '5.0'})) self.assertEqual(0, registry.get_sample_value('h_bucket', {'le': '+Inf'})) self.assertEqual(0, registry.get_sample_value('h_count')) self.assertEqual(0, registry.get_sample_value('h_sum')) # -------------------------- gauge.inc() gauge.inc() gauge.inc() gauge.dec() self.assertEqual(2, registry.get_sample_value('g')) counter.inc() counter.inc() counter.inc() self.assertEqual(3, registry.get_sample_value('c_total')) summary.observe(10) summary.observe(5) self.assertEqual(2, registry.get_sample_value('s_count')) self.assertEqual(15, registry.get_sample_value('s_sum')) histogram.observe(2) histogram.observe(6) histogram.observe(1) self.assertEqual(1, registry.get_sample_value('h_bucket', {'le': '1.0'})) self.assertEqual(2, registry.get_sample_value('h_bucket', {'le': '2.5'})) self.assertEqual(2, registry.get_sample_value('h_bucket', {'le': '5.0'})) self.assertEqual(3, registry.get_sample_value('h_bucket', {'le': '+Inf'})) self.assertEqual(3, registry.get_sample_value('h_count')) self.assertEqual(9, registry.get_sample_value('h_sum')) registry.reset() self.assertEqual(0, registry.get_sample_value('g')) self.assertEqual(0, registry.get_sample_value('c_total')) self.assertEqual(0, registry.get_sample_value('s_count')) self.assertEqual(0, registry.get_sample_value('s_sum')) self.assertEqual(0, registry.get_sample_value('h_bucket', {'le': '1.0'})) self.assertEqual(0, registry.get_sample_value('h_bucket', {'le': '2.5'})) self.assertEqual(0, registry.get_sample_value('h_bucket', {'le': '5.0'})) self.assertEqual(0, registry.get_sample_value('h_bucket', {'le': '+Inf'})) self.assertEqual(0, registry.get_sample_value('h_count')) self.assertEqual(0, registry.get_sample_value('h_sum'))
# Example taken from https://github.com/prometheus/client_python # The library provides a few different ways to collect data and this is one of them. # In this example, we have a running http server where all endpoints will redirect to the same page that lists all the metrics in a certain format. # When configuring prometheus (whether in the service itself or 3rd party providers), it may expect a '/metrics' endpoint but since all endpoints redirect, this makes that trivial. from prometheus_client import start_http_server from prometheus_client.core import Counter, Gauge import time counter = 0 # This will reset to 0 everytime we restart. If you want something like state, you should use a Gauge and store state somewhere like a database. c = Gauge('sample_counter_int', 'Description text') start_http_server(8000) while True: print("Server is running.") c.inc() time.sleep(5)