17
17
from flask import Flask , request
18
18
19
19
from opentelemetry import trace
20
- from opentelemetry .instrumentation .flask import FlaskInstrumentor
20
+ from opentelemetry .instrumentation .flask import (
21
+ FlaskInstrumentor ,
22
+ _duration_attrs ,
23
+ _active_requests_count_attrs ,
24
+ )
21
25
from opentelemetry .instrumentation .propagators import (
22
26
TraceResponsePropagator ,
23
27
get_global_response_propagator ,
24
28
set_global_response_propagator ,
25
29
)
30
+ from opentelemetry .sdk .metrics .export import (
31
+ HistogramDataPoint ,
32
+ NumberDataPoint ,
33
+ )
26
34
from opentelemetry .instrumentation .wsgi import OpenTelemetryMiddleware
27
35
from opentelemetry .sdk .resources import Resource
28
36
from opentelemetry .semconv .trace import SpanAttributes
@@ -48,6 +56,15 @@ def expected_attributes(override_attributes):
48
56
default_attributes [key ] = val
49
57
return default_attributes
50
58
59
+ _expected_metric_names = [
60
+ "http.server.active_requests" ,
61
+ "http.server.duration" ,
62
+ ]
63
+ _recommended_attrs = {
64
+ "http.server.active_requests" : _active_requests_count_attrs ,
65
+ "http.server.duration" : _duration_attrs ,
66
+ }
67
+
51
68
52
69
class TestProgrammatic (InstrumentationTest , WsgiTestBase ):
53
70
def setUp (self ):
@@ -250,6 +267,34 @@ def test_exclude_lists_from_explicit(self):
250
267
span_list = self .memory_exporter .get_finished_spans ()
251
268
self .assertEqual (len (span_list ), 1 )
252
269
270
+ def test_wsgi_metrics (self ):
271
+ self .client .get ('/hello/123' )
272
+ self .client .get ('/hello/321' )
273
+ self .client .get ('/hello/756' )
274
+ metrics_list = self .memory_metrics_reader .get_metrics_data ()
275
+ number_data_point_seen = False
276
+ histogram_data_point_seen = False
277
+ self .assertTrue (len (metrics_list .resource_metrics ) != 0 )
278
+ for resource_metric in metrics_list .resource_metrics :
279
+ self .assertTrue (len (resource_metric .scope_metrics ) != 0 )
280
+ for scope_metric in resource_metric .scope_metrics :
281
+ self .assertTrue (len (scope_metric .metrics ) != 0 )
282
+ for metric in scope_metric .metrics :
283
+ self .assertIn (metric .name , _expected_metric_names )
284
+ data_points = list (metric .data .data_points )
285
+ self .assertEqual (len (data_points ), 1 )
286
+ for point in data_points :
287
+ if isinstance (point , HistogramDataPoint ):
288
+ self .assertEqual (point .count , 3 )
289
+ histogram_data_point_seen = True
290
+ if isinstance (point , NumberDataPoint ):
291
+ number_data_point_seen = True
292
+ for attr in point .attributes :
293
+ self .assertIn (
294
+ attr , _recommended_attrs [metric .name ]
295
+ )
296
+ self .assertTrue (number_data_point_seen and histogram_data_point_seen )
297
+
253
298
254
299
class TestProgrammaticHooks (InstrumentationTest , WsgiTestBase ):
255
300
def setUp (self ):
0 commit comments