Add ability to exclude some routes explicitly with Django Instrumentation (#1618)

This commit is contained in:
Leighton Chen
2023-02-03 15:14:28 -08:00
committed by GitHub
parent 673e4aadb4
commit 3770e574eb
3 changed files with 23 additions and 0 deletions

View File

@ -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

View File

@ -255,9 +255,11 @@ from opentelemetry.instrumentation.instrumentor import BaseInstrumentor
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 @@ class DjangoInstrumentor(BaseInstrumentor):
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 @@ class DjangoInstrumentor(BaseInstrumentor):
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

View File

@ -91,6 +91,7 @@ urlpatterns = [
_django_instrumentor = DjangoInstrumentor()
# pylint: disable=too-many-public-methods
class TestMiddleware(WsgiTestBase):
@classmethod
def setUpClass(cls):
@ -285,6 +286,18 @@ class TestMiddleware(WsgiTestBase):
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/")