From fcd7512d8386277bada839b063b6f7d295eda461 Mon Sep 17 00:00:00 2001 From: jeremydvoss Date: Mon, 3 Oct 2022 11:02:03 -0500 Subject: [PATCH 1/8] Adding try catch to fix ImproperlyConfigured exception while allowing custom django settings --- .../src/opentelemetry/instrumentation/django/__init__.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) 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 680ff4e8f7..fde07df25f 100644 --- a/instrumentation/opentelemetry-instrumentation-django/src/opentelemetry/instrumentation/django/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-django/src/opentelemetry/instrumentation/django/__init__.py @@ -195,6 +195,7 @@ def response_hook(span, request, response): from django import VERSION as django_version from django.conf import settings +from django.core.exceptions import ImproperlyConfigured from opentelemetry.instrumentation.django.environment_variables import ( OTEL_PYTHON_DJANGO_INSTRUMENT, @@ -275,7 +276,12 @@ def _instrument(self, **kwargs): # https://docs.djangoproject.com/en/3.0/ref/middleware/#middleware-ordering _middleware_setting = _get_django_middleware_setting() - settings_middleware = getattr(settings, _middleware_setting, []) + settings_middleware = [] + try: + settings_middleware = getattr(settings, _middleware_setting, []) + except ImproperlyConfigured: + settings.configure() + settings_middleware = getattr(settings, _middleware_setting, []) # Django allows to specify middlewares as a tuple, so we convert this tuple to a # list, otherwise we wouldn't be able to call append/remove @@ -288,7 +294,6 @@ def _instrument(self, **kwargs): settings_middleware.insert(0, self._sql_commenter_middleware) settings_middleware.insert(0, self._opentelemetry_middleware) - setattr(settings, _middleware_setting, settings_middleware) def _uninstrument(self, **kwargs): From c87be0b49e1db1896b652f2dbc4dbf1bf400ed5b Mon Sep 17 00:00:00 2001 From: jeremydvoss Date: Mon, 3 Oct 2022 18:59:53 -0500 Subject: [PATCH 2/8] Added except for when env var is misconfigured --- .../src/opentelemetry/instrumentation/django/__init__.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) 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 fde07df25f..602d4a73bc 100644 --- a/instrumentation/opentelemetry-instrumentation-django/src/opentelemetry/instrumentation/django/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-django/src/opentelemetry/instrumentation/django/__init__.py @@ -189,6 +189,7 @@ def response_hook(span, request, response): """ +from asyncio.log import logger from logging import getLogger from os import environ from typing import Collection @@ -279,7 +280,12 @@ def _instrument(self, **kwargs): settings_middleware = [] try: settings_middleware = getattr(settings, _middleware_setting, []) - except ImproperlyConfigured: + except ImproperlyConfigured as e: + logger.debug("DJANGO_SETTINGS_MODULE environment variable not configured. Defaulting to empty settings: " + e) + settings.configure() + settings_middleware = getattr(settings, _middleware_setting, []) + except ModuleNotFoundError as e: + logger.debug("DJANGO_SETTINGS_MODULE points to a non-existant module. Defaulting to empty settings: " + e) settings.configure() settings_middleware = getattr(settings, _middleware_setting, []) From 2eb55020f120b6c36d2e6071680dd6260e05abe5 Mon Sep 17 00:00:00 2001 From: jeremydvoss Date: Mon, 3 Oct 2022 19:03:13 -0500 Subject: [PATCH 3/8] changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c2ee7393e1..53f45790d9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added +- `opentelemetry-instrumentation-django` Fixed bug where auto-instrumentation fails when django is installed and settings are not configured. + ([#1369](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1369)) - `opentelemetry-instrumentation-system-metrics` add supports to collect system thread count. ([#1339](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1339)) ## [1.13.0-0.34b0](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v1.13.0-0.34b0) - 2022-09-26 From 8649eeacfb17c98cbc358c58ae5e1326ed63026d Mon Sep 17 00:00:00 2001 From: jeremydvoss Date: Mon, 3 Oct 2022 19:05:08 -0500 Subject: [PATCH 4/8] spellcheck --- .../src/opentelemetry/instrumentation/django/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 602d4a73bc..73fffc473c 100644 --- a/instrumentation/opentelemetry-instrumentation-django/src/opentelemetry/instrumentation/django/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-django/src/opentelemetry/instrumentation/django/__init__.py @@ -285,7 +285,7 @@ def _instrument(self, **kwargs): settings.configure() settings_middleware = getattr(settings, _middleware_setting, []) except ModuleNotFoundError as e: - logger.debug("DJANGO_SETTINGS_MODULE points to a non-existant module. Defaulting to empty settings: " + e) + logger.debug("DJANGO_SETTINGS_MODULE points to a non-existent module. Defaulting to empty settings: " + e) settings.configure() settings_middleware = getattr(settings, _middleware_setting, []) From f4050434ea84608a49bb2919a83dbeb7f721bfa8 Mon Sep 17 00:00:00 2001 From: jeremydvoss Date: Mon, 3 Oct 2022 20:12:10 -0500 Subject: [PATCH 5/8] lint --- .../opentelemetry/instrumentation/django/__init__.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) 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 73fffc473c..5a2938292a 100644 --- a/instrumentation/opentelemetry-instrumentation-django/src/opentelemetry/instrumentation/django/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-django/src/opentelemetry/instrumentation/django/__init__.py @@ -281,11 +281,17 @@ def _instrument(self, **kwargs): try: settings_middleware = getattr(settings, _middleware_setting, []) except ImproperlyConfigured as e: - logger.debug("DJANGO_SETTINGS_MODULE environment variable not configured. Defaulting to empty settings: " + e) + logger.debug( + "DJANGO_SETTINGS_MODULE environment variable not configured. Defaulting to empty settings: " + + e + ) settings.configure() settings_middleware = getattr(settings, _middleware_setting, []) except ModuleNotFoundError as e: - logger.debug("DJANGO_SETTINGS_MODULE points to a non-existent module. Defaulting to empty settings: " + e) + logger.debug( + "DJANGO_SETTINGS_MODULE points to a non-existent module. Defaulting to empty settings: " + + e + ) settings.configure() settings_middleware = getattr(settings, _middleware_setting, []) From 8e8d1d3b649d3d2bbaabb12c21e5185712df619a Mon Sep 17 00:00:00 2001 From: jeremydvoss Date: Mon, 3 Oct 2022 20:35:21 -0500 Subject: [PATCH 6/8] lint --- .../instrumentation/django/__init__.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) 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 5a2938292a..68689ea64b 100644 --- a/instrumentation/opentelemetry-instrumentation-django/src/opentelemetry/instrumentation/django/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-django/src/opentelemetry/instrumentation/django/__init__.py @@ -280,17 +280,17 @@ def _instrument(self, **kwargs): settings_middleware = [] try: settings_middleware = getattr(settings, _middleware_setting, []) - except ImproperlyConfigured as e: - logger.debug( - "DJANGO_SETTINGS_MODULE environment variable not configured. Defaulting to empty settings: " - + e + except ImproperlyConfigured as exception: + _logger.debug( + "DJANGO_SETTINGS_MODULE environment variable not configured. Defaulting to empty settings: %s" + % exception ) settings.configure() settings_middleware = getattr(settings, _middleware_setting, []) - except ModuleNotFoundError as e: - logger.debug( - "DJANGO_SETTINGS_MODULE points to a non-existent module. Defaulting to empty settings: " - + e + except ModuleNotFoundError as exception: + _logger.debug( + "DJANGO_SETTINGS_MODULE points to a non-existent module. Defaulting to empty settings: %s" + % exception ) settings.configure() settings_middleware = getattr(settings, _middleware_setting, []) From ec73cad09583f4ced424f6e2a4821619066af9a7 Mon Sep 17 00:00:00 2001 From: jeremydvoss Date: Mon, 3 Oct 2022 20:52:51 -0500 Subject: [PATCH 7/8] lint --- .../src/opentelemetry/instrumentation/django/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 68689ea64b..5a19a56afc 100644 --- a/instrumentation/opentelemetry-instrumentation-django/src/opentelemetry/instrumentation/django/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-django/src/opentelemetry/instrumentation/django/__init__.py @@ -189,7 +189,6 @@ def response_hook(span, request, response): """ -from asyncio.log import logger from logging import getLogger from os import environ from typing import Collection @@ -306,6 +305,7 @@ def _instrument(self, **kwargs): settings_middleware.insert(0, self._sql_commenter_middleware) settings_middleware.insert(0, self._opentelemetry_middleware) + setattr(settings, _middleware_setting, settings_middleware) def _uninstrument(self, **kwargs): From 9266c378cea3d1e982d84c0957db3abd4b8301c1 Mon Sep 17 00:00:00 2001 From: jeremydvoss Date: Tue, 4 Oct 2022 10:49:14 -0500 Subject: [PATCH 8/8] lint --- .../src/opentelemetry/instrumentation/django/__init__.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) 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 5a19a56afc..af0904e7e0 100644 --- a/instrumentation/opentelemetry-instrumentation-django/src/opentelemetry/instrumentation/django/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-django/src/opentelemetry/instrumentation/django/__init__.py @@ -281,15 +281,15 @@ def _instrument(self, **kwargs): settings_middleware = getattr(settings, _middleware_setting, []) except ImproperlyConfigured as exception: _logger.debug( - "DJANGO_SETTINGS_MODULE environment variable not configured. Defaulting to empty settings: %s" - % exception + "DJANGO_SETTINGS_MODULE environment variable not configured. Defaulting to empty settings: %s", + exception, ) settings.configure() settings_middleware = getattr(settings, _middleware_setting, []) except ModuleNotFoundError as exception: _logger.debug( - "DJANGO_SETTINGS_MODULE points to a non-existent module. Defaulting to empty settings: %s" - % exception + "DJANGO_SETTINGS_MODULE points to a non-existent module. Defaulting to empty settings: %s", + exception, ) settings.configure() settings_middleware = getattr(settings, _middleware_setting, [])