11import os
22import unittest .mock
3+ from tempfile import TemporaryDirectory
4+ from pathlib import Path
35
46from prometheus_client import generate_latest
5-
7+ from prometheus_client import values
8+ from opentracing import global_tracer
69from pyms .constants import CONFIGMAP_FILE_ENVIRONMENT
10+ from pyms .flask .services .metrics import LOGGER_TOTAL_MESSAGES , FLASK_REQUEST_COUNT , FLASK_REQUEST_LATENCY
711from tests .common import MyMicroserviceNoSingleton
812
13+ def reset_metric (metric ):
14+ metric ._metric_init () # pylint: disable=protected-access
15+ metric ._metrics = {} # pylint: disable=protected-access
16+
17+ def reset_metrics ():
18+ reset_metric (LOGGER_TOTAL_MESSAGES )
19+ reset_metric (FLASK_REQUEST_COUNT )
20+ reset_metric (FLASK_REQUEST_LATENCY )
21+ try :
22+ for metric in global_tracer ().metrics_factory ._cache .values (): # pylint: disable=protected-access
23+ reset_metric (metric )
24+ except AttributeError : # Not a Jaeger tracer
25+ pass
926
1027class TestMetricsFlask (unittest .TestCase ):
1128 BASE_DIR = os .path .dirname (os .path .abspath (__file__ ))
@@ -20,15 +37,15 @@ def setUp(self):
2037 def test_metrics_latency (self ):
2138 self .client .get ("/" )
2239 self .client .get ("/metrics" )
23- generated_latency_root = b'http_server_requests_seconds_bucket{le="0.005",method="GET",service="Python Microservice",status="200 ",uri="/"}'
40+ generated_latency_root = b'http_server_requests_seconds_bucket{le="0.005",method="GET",service="Python Microservice with Jaeger ",status="404 ",uri="/"}'
2441 generated_latency_metrics = b'http_server_requests_seconds_bucket{le="0.005",method="GET",service="Python Microservice with Jaeger",status="200",uri="/metrics"}'
2542 assert generated_latency_root in generate_latest ()
2643 assert generated_latency_metrics in generate_latest ()
2744
2845 def test_metrics_count (self ):
2946 self .client .get ("/" )
3047 self .client .get ("/metrics" )
31- generated_count_root = b'http_server_requests_count_total{method="GET",service="Python Microservice",status="200 ",uri="/"}'
48+ generated_count_root = b'http_server_requests_count_total{method="GET",service="Python Microservice with Jaeger ",status="404 ",uri="/"}'
3249 generated_count_metrics = b'http_server_requests_count_total{method="GET",service="Python Microservice with Jaeger",status="200",uri="/metrics"}'
3350 assert generated_count_root in generate_latest ()
3451 assert generated_count_metrics in generate_latest ()
@@ -44,3 +61,73 @@ def test_metrics_jaeger(self):
4461 self .client .get ("/metrics" )
4562 generated_logger = b'jaeger:reporter_spans_total'
4663 assert generated_logger in generate_latest ()
64+
65+ class TestMultiprocessMetricsFlask (unittest .TestCase ):
66+ BASE_DIR = os .path .dirname (os .path .abspath (__file__ ))
67+ current = None
68+
69+ @classmethod
70+ def current_test (cls ):
71+ return "not_in_test" if cls .current is None else cls .current
72+
73+ @classmethod
74+ def setUpClass (cls ):
75+ cls .temp_dir = TemporaryDirectory ()
76+ os .environ ["prometheus_multiproc_dir" ] = cls .temp_dir .name
77+ cls .patch_value_class = unittest .mock .patch .object (values , "ValueClass" , values .MultiProcessValue (cls .current_test ))
78+ cls .patch_value_class .start ()
79+
80+ def setUp (self ):
81+ TestMultiprocessMetricsFlask .current = self ._testMethodName
82+ os .environ [CONFIGMAP_FILE_ENVIRONMENT ] = os .path .join (self .BASE_DIR , "config-tests-metrics.yml" )
83+ ms = MyMicroserviceNoSingleton (path = __file__ )
84+ ms .reload_conf ()
85+ reset_metrics ()
86+ self .app = ms .create_app ()
87+ self .client = self .app .test_client ()
88+ for path in Path (self .temp_dir .name ).iterdir ():
89+ if self ._testMethodName not in path .name :
90+ path .unlink ()
91+
92+ @classmethod
93+ def tearDownClass (cls ):
94+ cls .patch_value_class .stop ()
95+ os .environ .pop ("prometheus_multiproc_dir" )
96+ reset_metrics ()
97+
98+ def test_metrics_stored_in_directory (self ):
99+ assert TestMultiprocessMetricsFlask .current_test () is not None
100+ self .client .get ("/" )
101+ self .client .get ("/metrics" )
102+ metrics = os .listdir (path = self .temp_dir .name )
103+
104+ assert f"counter_{ self ._testMethodName } .db" in metrics
105+ assert f"histogram_{ self ._testMethodName } .db" in metrics
106+
107+ def test_metrics_latency (self ):
108+ self .client .get ("/" )
109+ self .client .get ("/metrics" )
110+ generated_latency_root = b'http_server_requests_seconds_bucket{le="0.005",method="GET",service="Python Microservice with Jaeger",status="404",uri="/"}'
111+ generated_latency_metrics = b'http_server_requests_seconds_bucket{le="0.005",method="GET",service="Python Microservice with Jaeger",status="200",uri="/metrics"}'
112+ assert generated_latency_root in generate_latest (self .app .ms .metrics .registry )
113+ assert generated_latency_metrics in generate_latest (self .app .ms .metrics .registry )
114+
115+ def test_metrics_count (self ):
116+ self .client .get ("/" )
117+ self .client .get ("/metrics" )
118+ generated_count_root = b'http_server_requests_count_total{method="GET",service="Python Microservice with Jaeger",status="404",uri="/"}'
119+ generated_count_metrics = b'http_server_requests_count_total{method="GET",service="Python Microservice with Jaeger",status="200",uri="/metrics"}'
120+ assert generated_count_root in generate_latest (self .app .ms .metrics .registry )
121+ assert generated_count_metrics in generate_latest (self .app .ms .metrics .registry )
122+
123+ def test_metrics_logger (self ):
124+ self .client .get ("/" )
125+ self .client .get ("/metrics" )
126+ generated_logger = b'logger_messages_total{level="DEBUG",service="Python Microservice with Jaeger"}'
127+ assert generated_logger in generate_latest (self .app .ms .metrics .registry )
128+
129+ def test_metrics_jaeger (self ):
130+ self .client .get ("/" )
131+ self .client .get ("/metrics" )
132+ generated_logger = b'jaeger:reporter_spans_total'
133+ assert generated_logger in generate_latest (self .app .ms .metrics .registry )
0 commit comments