24
24
OTEL_PYTHON_DISABLED_INSTRUMENTATIONS ,
25
25
)
26
26
27
+
27
28
logger = getLogger (__file__ )
28
29
29
30
@@ -40,20 +41,38 @@ def _load_distros():
40
41
41
42
42
43
def _load_instrumentors ():
44
+ instrumentation_loader = _default_instrumentation_loader
45
+ for loader in iter_entry_points ("opentelemetry_instrumentation_loader" ):
46
+ logger .debug ("loading instrumentations with %s" , loader .name )
47
+ instrumentation_loader = loader .load ()
48
+ break
49
+
43
50
package_to_exclude = environ .get (OTEL_PYTHON_DISABLED_INSTRUMENTATIONS , [])
44
51
if isinstance (package_to_exclude , str ):
45
52
package_to_exclude = package_to_exclude .split ("," )
46
53
# to handle users entering "requests , flask" or "requests, flask" with spaces
47
54
package_to_exclude = [x .strip () for x in package_to_exclude ]
48
55
56
+ entry_points = []
49
57
for entry_point in iter_entry_points ("opentelemetry_instrumentor" ):
58
+ if entry_point .name in package_to_exclude :
59
+ logger .debug (
60
+ "Instrumentation skipped for library %s" , entry_point .name
61
+ )
62
+ continue
63
+ entry_points .append (entry_point )
64
+
65
+ instrumentation_loader (entry_points )
66
+
67
+
68
+ def _default_instrumentation_loader (entry_points ):
69
+ for entry_point in entry_points :
50
70
try :
51
- if entry_point .name in package_to_exclude :
52
- logger .debug (
53
- "Instrumentation skipped for library %s" , entry_point .name
54
- )
55
- continue
56
- entry_point .load ()().instrument () # type: ignore
71
+ # custom loaders can inspect entry_point and
72
+ # skip loading, load a replacement/fork,
73
+ # pass additional parameters to constructor
74
+ # or instrument(), etc
75
+ entry_point .load ()().instrument ()
57
76
logger .debug ("Instrumented %s" , entry_point .name )
58
77
except Exception as exc : # pylint: disable=broad-except
59
78
logger .exception ("Instrumenting of %s failed" , entry_point .name )
0 commit comments