Skip to content

Commit 20eb5b6

Browse files
committed
migrated code from personal repo:
copied over __init__.py copied over callback handlers copied over span_attributes file
1 parent 76509d7 commit 20eb5b6

File tree

3 files changed

+596
-0
lines changed

3 files changed

+596
-0
lines changed
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
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

Comments
 (0)