1
1
import os
2
2
import unittest .mock
3
+ from tempfile import TemporaryDirectory
4
+ from pathlib import Path
3
5
4
6
from prometheus_client import generate_latest
5
-
7
+ from prometheus_client import values
8
+ from opentracing import global_tracer
6
9
from pyms .constants import CONFIGMAP_FILE_ENVIRONMENT
10
+ from pyms .flask .services .metrics import LOGGER_TOTAL_MESSAGES , FLASK_REQUEST_COUNT , FLASK_REQUEST_LATENCY
7
11
from tests .common import MyMicroserviceNoSingleton
8
12
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
9
26
10
27
class TestMetricsFlask (unittest .TestCase ):
11
28
BASE_DIR = os .path .dirname (os .path .abspath (__file__ ))
@@ -20,15 +37,15 @@ def setUp(self):
20
37
def test_metrics_latency (self ):
21
38
self .client .get ("/" )
22
39
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="/"}'
24
41
generated_latency_metrics = b'http_server_requests_seconds_bucket{le="0.005",method="GET",service="Python Microservice with Jaeger",status="200",uri="/metrics"}'
25
42
assert generated_latency_root in generate_latest ()
26
43
assert generated_latency_metrics in generate_latest ()
27
44
28
45
def test_metrics_count (self ):
29
46
self .client .get ("/" )
30
47
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="/"}'
32
49
generated_count_metrics = b'http_server_requests_count_total{method="GET",service="Python Microservice with Jaeger",status="200",uri="/metrics"}'
33
50
assert generated_count_root in generate_latest ()
34
51
assert generated_count_metrics in generate_latest ()
@@ -44,3 +61,73 @@ def test_metrics_jaeger(self):
44
61
self .client .get ("/metrics" )
45
62
generated_logger = b'jaeger:reporter_spans_total'
46
63
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