Skip to content

Commit d4cc327

Browse files
authored
fix(langchain): Fix missing langchain dependency for LangGraph tracing (#2988)
1 parent 9ab1751 commit d4cc327

File tree

3 files changed

+99
-88
lines changed
  • packages

3 files changed

+99
-88
lines changed

packages/opentelemetry-instrumentation-langchain/opentelemetry/instrumentation/langchain/__init__.py

Lines changed: 93 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
from opentelemetry.instrumentation.utils import unwrap
1212

1313
from opentelemetry.instrumentation.langchain.version import __version__
14+
from opentelemetry.instrumentation.langchain.utils import is_package_available
15+
1416

1517
from opentelemetry.trace.propagation.tracecontext import (
1618
TraceContextTextMapPropagator,
@@ -26,7 +28,7 @@
2628

2729
logger = logging.getLogger(__name__)
2830

29-
_instruments = ("langchain >= 0.0.346", "langchain-core > 0.1.0")
31+
_instruments = ("langchain-core > 0.1.0", )
3032

3133

3234
class LangchainInstrumentor(BaseInstrumentor):
@@ -77,96 +79,100 @@ def _instrument(self, **kwargs):
7779
def _wrap_openai_functions_for_tracing(self, traceloopCallbackHandler):
7880
openai_tracing_wrapper = _OpenAITracingWrapper(traceloopCallbackHandler)
7981

80-
# Wrap langchain_community.llms.openai.BaseOpenAI
81-
wrap_function_wrapper(
82-
module="langchain_community.llms.openai",
83-
name="BaseOpenAI._generate",
84-
wrapper=openai_tracing_wrapper,
85-
)
86-
87-
wrap_function_wrapper(
88-
module="langchain_community.llms.openai",
89-
name="BaseOpenAI._agenerate",
90-
wrapper=openai_tracing_wrapper,
91-
)
92-
93-
wrap_function_wrapper(
94-
module="langchain_community.llms.openai",
95-
name="BaseOpenAI._stream",
96-
wrapper=openai_tracing_wrapper,
97-
)
98-
99-
wrap_function_wrapper(
100-
module="langchain_community.llms.openai",
101-
name="BaseOpenAI._astream",
102-
wrapper=openai_tracing_wrapper,
103-
)
104-
105-
# Wrap langchain_openai.llms.base.BaseOpenAI
106-
wrap_function_wrapper(
107-
module="langchain_openai.llms.base",
108-
name="BaseOpenAI._generate",
109-
wrapper=openai_tracing_wrapper,
110-
)
111-
112-
wrap_function_wrapper(
113-
module="langchain_openai.llms.base",
114-
name="BaseOpenAI._agenerate",
115-
wrapper=openai_tracing_wrapper,
116-
)
117-
118-
wrap_function_wrapper(
119-
module="langchain_openai.llms.base",
120-
name="BaseOpenAI._stream",
121-
wrapper=openai_tracing_wrapper,
122-
)
123-
124-
wrap_function_wrapper(
125-
module="langchain_openai.llms.base",
126-
name="BaseOpenAI._astream",
127-
wrapper=openai_tracing_wrapper,
128-
)
129-
130-
# langchain_openai.chat_models.base.BaseOpenAI
131-
wrap_function_wrapper(
132-
module="langchain_openai.chat_models.base",
133-
name="BaseChatOpenAI._generate",
134-
wrapper=openai_tracing_wrapper,
135-
)
136-
137-
wrap_function_wrapper(
138-
module="langchain_openai.chat_models.base",
139-
name="BaseChatOpenAI._agenerate",
140-
wrapper=openai_tracing_wrapper,
141-
)
142-
143-
# Doesn't work :(
144-
# wrap_function_wrapper(
145-
# module="langchain_openai.chat_models.base",
146-
# name="BaseChatOpenAI._stream",
147-
# wrapper=openai_tracing_wrapper,
148-
# )
149-
# wrap_function_wrapper(
150-
# module="langchain_openai.chat_models.base",
151-
# name="BaseChatOpenAI._astream",
152-
# wrapper=openai_tracing_wrapper,
153-
# )
82+
if is_package_available("langchain_community"):
83+
# Wrap langchain_community.llms.openai.BaseOpenAI
84+
wrap_function_wrapper(
85+
module="langchain_community.llms.openai",
86+
name="BaseOpenAI._generate",
87+
wrapper=openai_tracing_wrapper,
88+
)
89+
90+
wrap_function_wrapper(
91+
module="langchain_community.llms.openai",
92+
name="BaseOpenAI._agenerate",
93+
wrapper=openai_tracing_wrapper,
94+
)
95+
96+
wrap_function_wrapper(
97+
module="langchain_community.llms.openai",
98+
name="BaseOpenAI._stream",
99+
wrapper=openai_tracing_wrapper,
100+
)
101+
102+
wrap_function_wrapper(
103+
module="langchain_community.llms.openai",
104+
name="BaseOpenAI._astream",
105+
wrapper=openai_tracing_wrapper,
106+
)
107+
108+
if is_package_available("langchain_openai"):
109+
# Wrap langchain_openai.llms.base.BaseOpenAI
110+
wrap_function_wrapper(
111+
module="langchain_openai.llms.base",
112+
name="BaseOpenAI._generate",
113+
wrapper=openai_tracing_wrapper,
114+
)
115+
116+
wrap_function_wrapper(
117+
module="langchain_openai.llms.base",
118+
name="BaseOpenAI._agenerate",
119+
wrapper=openai_tracing_wrapper,
120+
)
121+
122+
wrap_function_wrapper(
123+
module="langchain_openai.llms.base",
124+
name="BaseOpenAI._stream",
125+
wrapper=openai_tracing_wrapper,
126+
)
127+
128+
wrap_function_wrapper(
129+
module="langchain_openai.llms.base",
130+
name="BaseOpenAI._astream",
131+
wrapper=openai_tracing_wrapper,
132+
)
133+
134+
# langchain_openai.chat_models.base.BaseOpenAI
135+
wrap_function_wrapper(
136+
module="langchain_openai.chat_models.base",
137+
name="BaseChatOpenAI._generate",
138+
wrapper=openai_tracing_wrapper,
139+
)
140+
141+
wrap_function_wrapper(
142+
module="langchain_openai.chat_models.base",
143+
name="BaseChatOpenAI._agenerate",
144+
wrapper=openai_tracing_wrapper,
145+
)
146+
147+
# Doesn't work :(
148+
# wrap_function_wrapper(
149+
# module="langchain_openai.chat_models.base",
150+
# name="BaseChatOpenAI._stream",
151+
# wrapper=openai_tracing_wrapper,
152+
# )
153+
# wrap_function_wrapper(
154+
# module="langchain_openai.chat_models.base",
155+
# name="BaseChatOpenAI._astream",
156+
# wrapper=openai_tracing_wrapper,
157+
# )
154158

155159
def _uninstrument(self, **kwargs):
156160
unwrap("langchain_core.callbacks", "BaseCallbackManager.__init__")
157161
if not self.disable_trace_context_propagation:
158-
unwrap("langchain_community.llms.openai", "BaseOpenAI._generate")
159-
unwrap("langchain_community.llms.openai", "BaseOpenAI._agenerate")
160-
unwrap("langchain_community.llms.openai", "BaseOpenAI._stream")
161-
unwrap("langchain_community.llms.openai", "BaseOpenAI._astream")
162-
unwrap("langchain_openai.llms.base", "BaseOpenAI._generate")
163-
unwrap("langchain_openai.llms.base", "BaseOpenAI._agenerate")
164-
unwrap("langchain_openai.llms.base", "BaseOpenAI._stream")
165-
unwrap("langchain_openai.llms.base", "BaseOpenAI._astream")
166-
unwrap("langchain_openai.chat_models.base", "BaseOpenAI._generate")
167-
unwrap("langchain_openai.chat_models.base", "BaseOpenAI._agenerate")
168-
# unwrap("langchain_openai.chat_models.base", "BaseOpenAI._stream")
169-
# unwrap("langchain_openai.chat_models.base", "BaseOpenAI._astream")
162+
if is_package_available("langchain_community"):
163+
unwrap("langchain_community.llms.openai", "BaseOpenAI._generate")
164+
unwrap("langchain_community.llms.openai", "BaseOpenAI._agenerate")
165+
unwrap("langchain_community.llms.openai", "BaseOpenAI._stream")
166+
unwrap("langchain_community.llms.openai", "BaseOpenAI._astream")
167+
if is_package_available("langchain_openai"):
168+
unwrap("langchain_openai.llms.base", "BaseOpenAI._generate")
169+
unwrap("langchain_openai.llms.base", "BaseOpenAI._agenerate")
170+
unwrap("langchain_openai.llms.base", "BaseOpenAI._stream")
171+
unwrap("langchain_openai.llms.base", "BaseOpenAI._astream")
172+
unwrap("langchain_openai.chat_models.base", "BaseOpenAI._generate")
173+
unwrap("langchain_openai.chat_models.base", "BaseOpenAI._agenerate")
174+
# unwrap("langchain_openai.chat_models.base", "BaseOpenAI._stream")
175+
# unwrap("langchain_openai.chat_models.base", "BaseOpenAI._astream")
170176

171177

172178
class _BaseCallbackManagerInitWrapper:

packages/opentelemetry-instrumentation-langchain/opentelemetry/instrumentation/langchain/utils.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import dataclasses
22
import datetime
3+
import importlib.util
34
import json
45
import logging
56
import os
@@ -66,3 +67,7 @@ def wrapper(*args, **kwargs):
6667
Config.exception_logger(e)
6768

6869
return wrapper
70+
71+
72+
def is_package_available(package_name):
73+
return importlib.util.find_spec(package_name) is not None

packages/traceloop-sdk/traceloop/sdk/tracing/tracing.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -647,7 +647,7 @@ def init_haystack_instrumentor():
647647

648648
def init_langchain_instrumentor():
649649
try:
650-
if is_package_installed("langchain"):
650+
if is_package_installed("langchain") or is_package_installed("langgraph"):
651651
Telemetry().capture("instrumentation:langchain:init")
652652
from opentelemetry.instrumentation.langchain import LangchainInstrumentor
653653

0 commit comments

Comments
 (0)