@@ -32,6 +32,7 @@ def setUp(self):
3232 "OTEL_PYTHON_DISABLED_INSTRUMENTATIONS" ,
3333 "OTEL_PYTHON_LOGGING_AUTO_INSTRUMENTATION_ENABLED" ,
3434 "OTEL_AWS_APPLICATION_SIGNALS_ENABLED" ,
35+ "DJANGO_SETTINGS_MODULE" ,
3536 ]
3637
3738 # First, save all current values
@@ -100,14 +101,21 @@ def test_configure_without_patches(self, mock_super_configure, mock_apply_patche
100101
101102 @patch ("amazon.opentelemetry.distro.aws_opentelemetry_distro.get_aws_region" )
102103 @patch ("amazon.opentelemetry.distro.aws_opentelemetry_distro.is_agent_observability_enabled" )
104+ @patch ("amazon.opentelemetry.distro.aws_opentelemetry_distro.is_installed" )
103105 @patch ("amazon.opentelemetry.distro.aws_opentelemetry_distro.apply_instrumentation_patches" )
104106 @patch ("amazon.opentelemetry.distro.aws_opentelemetry_distro.OpenTelemetryDistro._configure" )
105107 def test_configure_with_agent_observability_enabled (
106- self , mock_super_configure , mock_apply_patches , mock_is_agent_observability , mock_get_aws_region
108+ self ,
109+ mock_super_configure ,
110+ mock_apply_patches ,
111+ mock_is_installed ,
112+ mock_is_agent_observability ,
113+ mock_get_aws_region ,
107114 ):
108115 """Test that _configure sets agent observability defaults when enabled"""
109116 mock_is_agent_observability .return_value = True
110117 mock_get_aws_region .return_value = "us-west-2"
118+ mock_is_installed .return_value = False # Mock Django as not installed to avoid interference
111119
112120 distro = AwsOpenTelemetryDistro ()
113121 distro ._configure ()
@@ -277,3 +285,116 @@ def test_otel_propagators_added_when_not_user_defined(self, mock_super_configure
277285 for prop in individual_propagators :
278286 actual_propagators .append (type (prop ).__name__ )
279287 self .assertEqual (expected_propagators , actual_propagators )
288+
289+ # Django Instrumentation Tests
290+ @patch ("amazon.opentelemetry.distro.aws_opentelemetry_distro.is_installed" )
291+ @patch ("amazon.opentelemetry.distro.aws_opentelemetry_distro.apply_instrumentation_patches" )
292+ @patch ("amazon.opentelemetry.distro.aws_opentelemetry_distro.OpenTelemetryDistro._configure" )
293+ def test_django_instrumentation_enabled_with_settings_module (
294+ self , mock_super_configure , mock_apply_patches , mock_is_installed
295+ ):
296+ """Test that Django instrumentation is enabled when DJANGO_SETTINGS_MODULE is set"""
297+ mock_is_installed .return_value = True
298+ os .environ ["DJANGO_SETTINGS_MODULE" ] = "myproject.settings"
299+
300+ distro = AwsOpenTelemetryDistro ()
301+ distro ._configure ()
302+
303+ # Verify that django is NOT in disabled instrumentations
304+ disabled_instrumentations = os .environ .get ("OTEL_PYTHON_DISABLED_INSTRUMENTATIONS" , "" )
305+ self .assertNotIn ("django" , disabled_instrumentations )
306+
307+ mock_is_installed .assert_called_once_with ("django" )
308+
309+ @patch ("amazon.opentelemetry.distro.aws_opentelemetry_distro.is_installed" )
310+ @patch ("amazon.opentelemetry.distro.aws_opentelemetry_distro.apply_instrumentation_patches" )
311+ @patch ("amazon.opentelemetry.distro.aws_opentelemetry_distro.OpenTelemetryDistro._configure" )
312+ def test_django_instrumentation_disabled_without_settings_module (
313+ self , mock_super_configure , mock_apply_patches , mock_is_installed
314+ ):
315+ """Test that Django instrumentation is disabled when DJANGO_SETTINGS_MODULE is not set"""
316+ mock_is_installed .return_value = True
317+
318+ distro = AwsOpenTelemetryDistro ()
319+ distro ._configure ()
320+
321+ # Verify that django is in disabled instrumentations
322+ disabled_instrumentations = os .environ .get ("OTEL_PYTHON_DISABLED_INSTRUMENTATIONS" , "" )
323+ self .assertIn ("django" , disabled_instrumentations )
324+
325+ mock_is_installed .assert_called_once_with ("django" )
326+
327+ @patch ("amazon.opentelemetry.distro.aws_opentelemetry_distro.is_installed" )
328+ @patch ("amazon.opentelemetry.distro.aws_opentelemetry_distro.apply_instrumentation_patches" )
329+ @patch ("amazon.opentelemetry.distro.aws_opentelemetry_distro.OpenTelemetryDistro._configure" )
330+ def test_django_instrumentation_disabled_with_existing_disabled_instrumentations (
331+ self , mock_super_configure , mock_apply_patches , mock_is_installed
332+ ):
333+ """Test that Django is appended to existing disabled instrumentations"""
334+ mock_is_installed .return_value = True
335+ os .environ ["OTEL_PYTHON_DISABLED_INSTRUMENTATIONS" ] = "flask,fastapi"
336+
337+ distro = AwsOpenTelemetryDistro ()
338+ distro ._configure ()
339+
340+ # Verify that django is appended to existing disabled instrumentations
341+ disabled_instrumentations = os .environ .get ("OTEL_PYTHON_DISABLED_INSTRUMENTATIONS" , "" )
342+ self .assertEqual ("flask,fastapi,django" , disabled_instrumentations )
343+
344+ mock_is_installed .assert_called_once_with ("django" )
345+
346+ @patch ("amazon.opentelemetry.distro.aws_opentelemetry_distro.is_installed" )
347+ @patch ("amazon.opentelemetry.distro.aws_opentelemetry_distro.apply_instrumentation_patches" )
348+ @patch ("amazon.opentelemetry.distro.aws_opentelemetry_distro.OpenTelemetryDistro._configure" )
349+ def test_django_not_installed_no_effect (self , mock_super_configure , mock_apply_patches , mock_is_installed ):
350+ """Test that when Django is not installed, no changes are made to disabled instrumentations"""
351+ mock_is_installed .return_value = False
352+
353+ distro = AwsOpenTelemetryDistro ()
354+ distro ._configure ()
355+
356+ # Verify that OTEL_PYTHON_DISABLED_INSTRUMENTATIONS is not affected
357+ disabled_instrumentations = os .environ .get ("OTEL_PYTHON_DISABLED_INSTRUMENTATIONS" , "" )
358+ self .assertEqual ("" , disabled_instrumentations )
359+
360+ mock_is_installed .assert_called_once_with ("django" )
361+
362+ @patch ("amazon.opentelemetry.distro.aws_opentelemetry_distro.is_installed" )
363+ @patch ("amazon.opentelemetry.distro.aws_opentelemetry_distro.apply_instrumentation_patches" )
364+ @patch ("amazon.opentelemetry.distro.aws_opentelemetry_distro.OpenTelemetryDistro._configure" )
365+ def test_django_instrumentation_enabled_with_settings_module_and_existing_disabled (
366+ self , mock_super_configure , mock_apply_patches , mock_is_installed
367+ ):
368+ """Test that Django instrumentation is enabled even with existing disabled instrumentations"""
369+ mock_is_installed .return_value = True
370+ os .environ ["DJANGO_SETTINGS_MODULE" ] = "myproject.settings"
371+ os .environ ["OTEL_PYTHON_DISABLED_INSTRUMENTATIONS" ] = "flask,fastapi"
372+
373+ distro = AwsOpenTelemetryDistro ()
374+ distro ._configure ()
375+
376+ # Verify that django is NOT added to disabled instrumentations
377+ disabled_instrumentations = os .environ .get ("OTEL_PYTHON_DISABLED_INSTRUMENTATIONS" , "" )
378+ self .assertEqual ("flask,fastapi" , disabled_instrumentations )
379+ self .assertNotIn ("django" , disabled_instrumentations )
380+
381+ mock_is_installed .assert_called_once_with ("django" )
382+
383+ @patch ("amazon.opentelemetry.distro.aws_opentelemetry_distro.is_installed" )
384+ @patch ("amazon.opentelemetry.distro.aws_opentelemetry_distro.apply_instrumentation_patches" )
385+ @patch ("amazon.opentelemetry.distro.aws_opentelemetry_distro.OpenTelemetryDistro._configure" )
386+ def test_django_instrumentation_disabled_empty_settings_module (
387+ self , mock_super_configure , mock_apply_patches , mock_is_installed
388+ ):
389+ """Test that Django instrumentation is disabled when DJANGO_SETTINGS_MODULE is empty"""
390+ mock_is_installed .return_value = True
391+ os .environ ["DJANGO_SETTINGS_MODULE" ] = ""
392+
393+ distro = AwsOpenTelemetryDistro ()
394+ distro ._configure ()
395+
396+ # Verify that django is in disabled instrumentations
397+ disabled_instrumentations = os .environ .get ("OTEL_PYTHON_DISABLED_INSTRUMENTATIONS" , "" )
398+ self .assertIn ("django" , disabled_instrumentations )
399+
400+ mock_is_installed .assert_called_once_with ("django" )
0 commit comments