diff --git a/CHANGELOG.md b/CHANGELOG.md index 3fd85a7f6b..ee5ece78bf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `opentelemetry-instrumentation-aws-lambda` Flush `MeterProvider` at end of function invocation. ([#1613](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1613)) - Fix aiohttp bug with unset `trace_configs` ([#1592](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1592)) +- `opentelemetry-instrumentation-django` Allow explicit `excluded_urls` configuration through `instrument()` + ([#1618](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1618)) ### Fixed diff --git a/instrumentation/opentelemetry-instrumentation-django/src/opentelemetry/instrumentation/django/__init__.py b/instrumentation/opentelemetry-instrumentation-django/src/opentelemetry/instrumentation/django/__init__.py index f683421475..d545a1950b 100644 --- a/instrumentation/opentelemetry-instrumentation-django/src/opentelemetry/instrumentation/django/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-django/src/opentelemetry/instrumentation/django/__init__.py @@ -255,9 +255,11 @@ def response_hook(span, request, response): from opentelemetry.metrics import get_meter from opentelemetry.semconv.metrics import MetricInstruments from opentelemetry.trace import get_tracer +from opentelemetry.util.http import get_excluded_urls, parse_excluded_urls DJANGO_2_0 = django_version >= (2, 0) +_excluded_urls_from_env = get_excluded_urls("DJANGO") _logger = getLogger(__name__) @@ -293,6 +295,7 @@ def _instrument(self, **kwargs): tracer_provider = kwargs.get("tracer_provider") meter_provider = kwargs.get("meter_provider") + _excluded_urls = kwargs.get("excluded_urls") tracer = get_tracer( __name__, __version__, @@ -301,6 +304,11 @@ def _instrument(self, **kwargs): meter = get_meter(__name__, __version__, meter_provider=meter_provider) _DjangoMiddleware._tracer = tracer _DjangoMiddleware._meter = meter + _DjangoMiddleware._excluded_urls = ( + _excluded_urls_from_env + if _excluded_urls is None + else parse_excluded_urls(_excluded_urls) + ) _DjangoMiddleware._otel_request_hook = kwargs.pop("request_hook", None) _DjangoMiddleware._otel_response_hook = kwargs.pop( "response_hook", None diff --git a/instrumentation/opentelemetry-instrumentation-django/tests/test_middleware.py b/instrumentation/opentelemetry-instrumentation-django/tests/test_middleware.py index b4bb33e144..e235c8840e 100644 --- a/instrumentation/opentelemetry-instrumentation-django/tests/test_middleware.py +++ b/instrumentation/opentelemetry-instrumentation-django/tests/test_middleware.py @@ -91,6 +91,7 @@ _django_instrumentor = DjangoInstrumentor() +# pylint: disable=too-many-public-methods class TestMiddleware(WsgiTestBase): @classmethod def setUpClass(cls): @@ -285,6 +286,18 @@ def test_exclude_lists(self): span_list = self.memory_exporter.get_finished_spans() self.assertEqual(len(span_list), 1) + def test_exclude_lists_through_instrument(self): + _django_instrumentor.uninstrument() + _django_instrumentor.instrument(excluded_urls="excluded_explicit") + client = Client() + client.get("/excluded_explicit") + span_list = self.memory_exporter.get_finished_spans() + self.assertEqual(len(span_list), 0) + + client.get("/excluded_arg/123") + span_list = self.memory_exporter.get_finished_spans() + self.assertEqual(len(span_list), 1) + def test_span_name(self): # test no query_string Client().get("/span_name/1234/")