Skip to content

Commit 3770e57

Browse files
authored
Add ability to exclude some routes explicitly with Django Instrumentation (#1618)
1 parent 673e4aa commit 3770e57

File tree

3 files changed

+23
-0
lines changed

3 files changed

+23
-0
lines changed

CHANGELOG.md

+2
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1818
- `opentelemetry-instrumentation-aws-lambda` Flush `MeterProvider` at end of function invocation.
1919
([#1613](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1613))
2020
- Fix aiohttp bug with unset `trace_configs` ([#1592](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1592))
21+
- `opentelemetry-instrumentation-django` Allow explicit `excluded_urls` configuration through `instrument()`
22+
([#1618](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1618))
2123

2224
### Fixed
2325

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

+8
Original file line numberDiff line numberDiff line change
@@ -255,9 +255,11 @@ def response_hook(span, request, response):
255255
from opentelemetry.metrics import get_meter
256256
from opentelemetry.semconv.metrics import MetricInstruments
257257
from opentelemetry.trace import get_tracer
258+
from opentelemetry.util.http import get_excluded_urls, parse_excluded_urls
258259

259260
DJANGO_2_0 = django_version >= (2, 0)
260261

262+
_excluded_urls_from_env = get_excluded_urls("DJANGO")
261263
_logger = getLogger(__name__)
262264

263265

@@ -293,6 +295,7 @@ def _instrument(self, **kwargs):
293295

294296
tracer_provider = kwargs.get("tracer_provider")
295297
meter_provider = kwargs.get("meter_provider")
298+
_excluded_urls = kwargs.get("excluded_urls")
296299
tracer = get_tracer(
297300
__name__,
298301
__version__,
@@ -301,6 +304,11 @@ def _instrument(self, **kwargs):
301304
meter = get_meter(__name__, __version__, meter_provider=meter_provider)
302305
_DjangoMiddleware._tracer = tracer
303306
_DjangoMiddleware._meter = meter
307+
_DjangoMiddleware._excluded_urls = (
308+
_excluded_urls_from_env
309+
if _excluded_urls is None
310+
else parse_excluded_urls(_excluded_urls)
311+
)
304312
_DjangoMiddleware._otel_request_hook = kwargs.pop("request_hook", None)
305313
_DjangoMiddleware._otel_response_hook = kwargs.pop(
306314
"response_hook", None

instrumentation/opentelemetry-instrumentation-django/tests/test_middleware.py

+13
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@
9191
_django_instrumentor = DjangoInstrumentor()
9292

9393

94+
# pylint: disable=too-many-public-methods
9495
class TestMiddleware(WsgiTestBase):
9596
@classmethod
9697
def setUpClass(cls):
@@ -285,6 +286,18 @@ def test_exclude_lists(self):
285286
span_list = self.memory_exporter.get_finished_spans()
286287
self.assertEqual(len(span_list), 1)
287288

289+
def test_exclude_lists_through_instrument(self):
290+
_django_instrumentor.uninstrument()
291+
_django_instrumentor.instrument(excluded_urls="excluded_explicit")
292+
client = Client()
293+
client.get("/excluded_explicit")
294+
span_list = self.memory_exporter.get_finished_spans()
295+
self.assertEqual(len(span_list), 0)
296+
297+
client.get("/excluded_arg/123")
298+
span_list = self.memory_exporter.get_finished_spans()
299+
self.assertEqual(len(span_list), 1)
300+
288301
def test_span_name(self):
289302
# test no query_string
290303
Client().get("/span_name/1234/")

0 commit comments

Comments
 (0)