@@ -326,11 +326,12 @@ def test_load_instrumentors_dep_conflict(self, iter_mock, mock_logger):  # pylin
326326            ]
327327        )
328328
329+     @patch ("opentelemetry.instrumentation.auto_instrumentation._load._logger" ) 
329330    @patch ( 
330331        "opentelemetry.instrumentation.auto_instrumentation._load.entry_points"  
331332    ) 
332333    def  test_load_instrumentors_import_error_does_not_stop_everything (
333-         self , iter_mock 
334+         self , iter_mock ,  mock_logger 
334335    ):
335336        ep_mock1  =  Mock (name = "instr1" )
336337        ep_mock2  =  Mock (name = "instr2" )
@@ -354,6 +355,12 @@ def test_load_instrumentors_import_error_does_not_stop_everything(
354355            ]
355356        )
356357        self .assertEqual (distro_mock .load_instrumentor .call_count , 2 )
358+         mock_logger .exception .assert_any_call (
359+             "Importing of %s failed, skipping it" ,
360+             ep_mock1 .name ,
361+         )
362+ 
363+         mock_logger .debug .assert_any_call ("Instrumented %s" , ep_mock2 .name )
357364
358365    @patch ( 
359366        "opentelemetry.instrumentation.auto_instrumentation._load.entry_points"  
@@ -382,6 +389,46 @@ def test_load_instrumentors_raises_exception(self, iter_mock):
382389        )
383390        self .assertEqual (distro_mock .load_instrumentor .call_count , 1 )
384391
392+     @patch ("opentelemetry.instrumentation.auto_instrumentation._load._logger" ) 
393+     @patch ( 
394+         "opentelemetry.instrumentation.auto_instrumentation._load.entry_points"  
395+     ) 
396+     def  test_load_instrumentors_module_not_found_error (
397+         self , iter_mock , mock_logger 
398+     ):
399+         ep_mock1  =  Mock ()
400+         ep_mock1 .name  =  "instr1" 
401+ 
402+         ep_mock2  =  Mock ()
403+         ep_mock2 .name  =  "instr2" 
404+ 
405+         distro_mock  =  Mock ()
406+ 
407+         distro_mock .load_instrumentor .side_effect  =  [
408+             ModuleNotFoundError ("No module named 'fake_module'" ),
409+             None ,
410+         ]
411+ 
412+         iter_mock .side_effect  =  [(), (ep_mock1 , ep_mock2 ), ()]
413+ 
414+         _load ._load_instrumentors (distro_mock )
415+ 
416+         distro_mock .load_instrumentor .assert_has_calls (
417+             [
418+                 call (ep_mock1 , raise_exception_on_conflict = True ),
419+                 call (ep_mock2 , raise_exception_on_conflict = True ),
420+             ]
421+         )
422+         self .assertEqual (distro_mock .load_instrumentor .call_count , 2 )
423+ 
424+         mock_logger .debug .assert_any_call (
425+             "Skipping instrumentation %s: %s" ,
426+             "instr1" ,
427+             "No module named 'fake_module'" ,
428+         )
429+ 
430+         mock_logger .debug .assert_any_call ("Instrumented %s" , ep_mock2 .name )
431+ 
385432    def  test_load_instrumentors_no_entry_point_mocks (self ):
386433        distro_mock  =  Mock ()
387434        _load ._load_instrumentors (distro_mock )
0 commit comments