Skip to content

Commit a1df586

Browse files
WSGI enrich active_requests counter with Labeler attrs
1 parent b43861a commit a1df586

File tree

2 files changed

+112
-0
lines changed

2 files changed

+112
-0
lines changed

instrumentation/opentelemetry-instrumentation-wsgi/src/opentelemetry/instrumentation/wsgi/__init__.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -738,6 +738,9 @@ def __call__(
738738
req_attrs,
739739
self._sem_conv_opt_in_mode,
740740
)
741+
active_requests_count_attrs = enrich_metric_attributes(
742+
active_requests_count_attrs
743+
)
741744

742745
span, token = _start_internal_or_server_span(
743746
tracer=self.tracer,

instrumentation/opentelemetry-instrumentation-wsgi/tests/test_wsgi_middleware.py

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,14 @@ def error_wsgi_unhandled_override_attrs(environ, start_response):
159159
raise ValueError
160160

161161

162+
def error_wsgi_unhandled_override_attrs_new_semconv(environ, start_response):
163+
labeler = get_labeler()
164+
labeler.add("custom_attr", "test_value")
165+
labeler.add("http.request.method", "POST")
166+
assert isinstance(environ, dict)
167+
raise ValueError
168+
169+
162170
def wsgi_with_custom_response_headers(environ, start_response):
163171
assert isinstance(environ, dict)
164172
start_response(
@@ -471,6 +479,82 @@ def test_wsgi_metrics(self):
471479
self.assertTrue(number_data_point_seen and histogram_data_point_seen)
472480

473481
def test_wsgi_metrics_custom_attributes_skip_override_old_semconv(self):
482+
labeler = get_labeler()
483+
labeler.add("custom_attr", "test_value")
484+
labeler.add("http.method", "POST")
485+
486+
app = otel_wsgi.OpenTelemetryMiddleware(error_wsgi_unhandled)
487+
self.assertRaises(ValueError, app, self.environ, self.start_response)
488+
489+
metrics = self.get_sorted_metrics(SCOPE)
490+
active_requests_point_seen = False
491+
histogram_point_seen = False
492+
493+
for metric in metrics:
494+
if metric.name == "http.server.active_requests":
495+
data_points = list(metric.data.data_points)
496+
self.assertEqual(len(data_points), 1)
497+
point = data_points[0]
498+
self.assertIsInstance(point, NumberDataPoint)
499+
self.assertEqual(point.attributes[HTTP_METHOD], "GET")
500+
self.assertEqual(point.attributes["custom_attr"], "test_value")
501+
active_requests_point_seen = True
502+
continue
503+
504+
if metric.name != "http.server.duration":
505+
continue
506+
507+
data_points = list(metric.data.data_points)
508+
self.assertEqual(len(data_points), 1)
509+
point = data_points[0]
510+
self.assertIsInstance(point, HistogramDataPoint)
511+
self.assertEqual(point.attributes[HTTP_METHOD], "GET")
512+
self.assertNotIn("custom_attr", point.attributes)
513+
histogram_point_seen = True
514+
515+
self.assertTrue(active_requests_point_seen)
516+
self.assertTrue(histogram_point_seen)
517+
518+
def test_wsgi_metrics_custom_attributes_skip_override_new_semconv(self):
519+
labeler = get_labeler()
520+
labeler.add("custom_attr", "test_value")
521+
labeler.add("http.request.method", "POST")
522+
523+
app = otel_wsgi.OpenTelemetryMiddleware(error_wsgi_unhandled)
524+
self.assertRaises(ValueError, app, self.environ, self.start_response)
525+
526+
metrics = self.get_sorted_metrics(SCOPE)
527+
active_requests_point_seen = False
528+
histogram_point_seen = False
529+
530+
for metric in metrics:
531+
if metric.name == "http.server.active_requests":
532+
data_points = list(metric.data.data_points)
533+
self.assertEqual(len(data_points), 1)
534+
point = data_points[0]
535+
self.assertIsInstance(point, NumberDataPoint)
536+
self.assertEqual(point.attributes[HTTP_REQUEST_METHOD], "GET")
537+
self.assertEqual(point.attributes["custom_attr"], "test_value")
538+
active_requests_point_seen = True
539+
continue
540+
541+
if metric.name != "http.server.request.duration":
542+
continue
543+
544+
data_points = list(metric.data.data_points)
545+
self.assertEqual(len(data_points), 1)
546+
point = data_points[0]
547+
self.assertIsInstance(point, HistogramDataPoint)
548+
self.assertEqual(point.attributes[HTTP_REQUEST_METHOD], "GET")
549+
self.assertNotIn("custom_attr", point.attributes)
550+
histogram_point_seen = True
551+
552+
self.assertTrue(active_requests_point_seen)
553+
self.assertTrue(histogram_point_seen)
554+
555+
def test_wsgi_duration_metrics_custom_attributes_skip_override_old_semconv(
556+
self,
557+
):
474558
app = otel_wsgi.OpenTelemetryMiddleware(
475559
error_wsgi_unhandled_override_attrs
476560
)
@@ -493,6 +577,31 @@ def test_wsgi_metrics_custom_attributes_skip_override_old_semconv(self):
493577

494578
self.assertTrue(histogram_point_seen)
495579

580+
def test_wsgi_duration_metrics_custom_attributes_skip_override_new_semconv(
581+
self,
582+
):
583+
app = otel_wsgi.OpenTelemetryMiddleware(
584+
error_wsgi_unhandled_override_attrs_new_semconv
585+
)
586+
self.assertRaises(ValueError, app, self.environ, self.start_response)
587+
588+
metrics = self.get_sorted_metrics(SCOPE)
589+
histogram_point_seen = False
590+
591+
for metric in metrics:
592+
if metric.name != "http.server.request.duration":
593+
continue
594+
595+
data_points = list(metric.data.data_points)
596+
self.assertEqual(len(data_points), 1)
597+
point = data_points[0]
598+
self.assertIsInstance(point, HistogramDataPoint)
599+
self.assertEqual(point.attributes[HTTP_REQUEST_METHOD], "GET")
600+
self.assertEqual(point.attributes["custom_attr"], "test_value")
601+
histogram_point_seen = True
602+
603+
self.assertTrue(histogram_point_seen)
604+
496605
def test_wsgi_metrics_exemplars_expected_old_semconv(self): # type: ignore[func-returns-value]
497606
"""Failing test asserting exemplars should be present for duration histogram (old semconv)."""
498607
app = otel_wsgi.OpenTelemetryMiddleware(simple_wsgi)

0 commit comments

Comments
 (0)