1+ from typing import Collection
2+ from opentelemetry .instrumentation .instrumentor import BaseInstrumentor
3+ from wrapt import wrap_function_wrapper
4+
5+ from opentelemetry .trace import get_tracer
6+ from opentelemetry .instrumentation .utils import unwrap
7+
8+ # from opentelemetry.instrumentation.langchain_v2.version import __version__
9+ from opentelemetry .instrumentation .langchain .version import __version__
10+ from opentelemetry .instrumentation .langchain_v2 .callback_handler import OpenTelemetryCallbackHandler
11+ from opentelemetry .instrumentation .langchain_v2 .async_callback_handler import OpenTelemetryAsyncCallbackHandler
12+
13+
14+ __all__ = ["OpenTelemetryCallbackHandler" ]
15+
16+ _instruments = ("langchain >= 0.1.0" ,)
17+
18+ class LangChainInstrumentor (BaseInstrumentor ):
19+
20+ def instrumentation_dependencies (cls ) -> Collection [str ]:
21+ return _instruments
22+
23+ def _instrument (self , ** kwargs ):
24+ tracer_provider = kwargs .get ("tracer_provider" )
25+ tracer = get_tracer (__name__ , __version__ , tracer_provider )
26+
27+ otelCallbackHandler = OpenTelemetryCallbackHandler (tracer )
28+
29+ wrap_function_wrapper (
30+ module = "langchain_core.callbacks" ,
31+ name = "BaseCallbackManager.__init__" ,
32+ wrapper = _BaseCallbackManagerInitWrapper (otelCallbackHandler ),
33+ )
34+
35+ def _uninstrument (self , ** kwargs ):
36+ unwrap ("langchain_core.callbacks" , "BaseCallbackManager.__init__" )
37+ if hasattr (self , "_wrapped" ):
38+ for module , name in self ._wrapped :
39+ unwrap (module , name )
40+ self .handler = None
41+
42+ class _BaseCallbackManagerInitWrapper :
43+ def __init__ (self , callback_handler : "OpenTelemetryCallbackHandler" ):
44+ self .callback_handler = callback_handler
45+ self ._wrapped = []
46+
47+ def __call__ (
48+ self ,
49+ wrapped ,
50+ instance ,
51+ args ,
52+ kwargs ,
53+ ) -> None :
54+ wrapped (* args , ** kwargs )
55+ for handler in instance .inheritable_handlers :
56+ if isinstance (handler , OpenTelemetryCallbackHandler ):
57+ return None
58+ else :
59+ instance .add_handler (self .callback_handler , True )
0 commit comments