1717from flask import Flask , request
1818
1919from 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+ )
2125from opentelemetry .instrumentation .propagators import (
2226 TraceResponsePropagator ,
2327 get_global_response_propagator ,
2428 set_global_response_propagator ,
2529)
30+ from opentelemetry .sdk .metrics .export import (
31+ HistogramDataPoint ,
32+ NumberDataPoint ,
33+ )
2634from opentelemetry .instrumentation .wsgi import OpenTelemetryMiddleware
2735from opentelemetry .sdk .resources import Resource
2836from opentelemetry .semconv .trace import SpanAttributes
@@ -48,6 +56,15 @@ def expected_attributes(override_attributes):
4856 default_attributes [key ] = val
4957 return default_attributes
5058
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+
5168
5269class TestProgrammatic (InstrumentationTest , WsgiTestBase ):
5370 def setUp (self ):
@@ -250,6 +267,34 @@ def test_exclude_lists_from_explicit(self):
250267 span_list = self .memory_exporter .get_finished_spans ()
251268 self .assertEqual (len (span_list ), 1 )
252269
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+
253298
254299class TestProgrammaticHooks (InstrumentationTest , WsgiTestBase ):
255300 def setUp (self ):
0 commit comments