Skip to content

Commit 1f549b0

Browse files
committed
migrated from local to this repository
1 parent 339e83c commit 1f549b0

File tree

11 files changed

+1319
-0
lines changed

11 files changed

+1319
-0
lines changed
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
[build-system]
2+
requires = ["hatchling"]
3+
build-backend = "hatchling.build"
4+
5+
[project]
6+
name = "opentelemetry-instrumentation-langchain-v2"
7+
dynamic = ["version"]
8+
description = "OpenTelemetry Official Langchain instrumentation"
9+
license = "Apache-2.0"
10+
requires-python = ">=3.9"
11+
authors = [
12+
{ name = "OpenTelemetry Authors", email = "[email protected]" },
13+
]
14+
classifiers = [
15+
"Development Status :: 4 - Beta",
16+
"Intended Audience :: Developers",
17+
"License :: OSI Approved :: Apache Software License",
18+
"Programming Language :: Python",
19+
"Programming Language :: Python :: 3",
20+
"Programming Language :: Python :: 3.9",
21+
"Programming Language :: Python :: 3.10",
22+
"Programming Language :: Python :: 3.11",
23+
"Programming Language :: Python :: 3.12",
24+
"Programming Language :: Python :: 3.13",
25+
]
26+
dependencies = [
27+
"opentelemetry-api ~= 1.30",
28+
"opentelemetry-sdk ~= 1.30",
29+
"opentelemetry-instrumentation ~= 0.51b0",
30+
"opentelemetry-semantic-conventions ~= 0.51b0"
31+
]
32+
[project.optional-dependencies]
33+
instruments = [
34+
"langchain >= 0.3.21",
35+
]
36+
37+
[tool.hatch.build.targets.wheel]
38+
packages = ["/src/amazon/opentelemetry"]
39+
40+
[tool.hatch.version]
41+
path = "version.py"
42+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
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_v2.callback_handler import OpenTelemetryCallbackHandler
10+
11+
__all__ = ["OpenTelemetryCallbackHandler"]
12+
13+
_instruments = ("langchain >= 0.1.0",)
14+
15+
class LangChainInstrumentor(BaseInstrumentor):
16+
17+
def instrumentation_dependencies(cls) -> Collection[str]:
18+
return _instruments
19+
20+
def _instrument(self, **kwargs):
21+
tracer_provider = kwargs.get("tracer_provider")
22+
tracer = get_tracer(__name__, __version__, tracer_provider)
23+
24+
otelCallbackHandler = OpenTelemetryCallbackHandler(tracer)
25+
26+
wrap_function_wrapper(
27+
module="langchain_core.callbacks",
28+
name="BaseCallbackManager.__init__",
29+
wrapper=_BaseCallbackManagerInitWrapper(otelCallbackHandler),
30+
)
31+
32+
def _uninstrument(self, **kwargs):
33+
unwrap("langchain_core.callbacks", "BaseCallbackManager.__init__")
34+
if hasattr(self, "_wrapped"):
35+
for module, name in self._wrapped:
36+
unwrap(module, name)
37+
38+
39+
class _BaseCallbackManagerInitWrapper:
40+
def __init__(self, callback_handler: "OpenTelemetryCallbackHandler"):
41+
self.callback_handler = callback_handler
42+
self._wrapped = []
43+
44+
def __call__(
45+
self,
46+
wrapped,
47+
instance,
48+
args,
49+
kwargs,
50+
) -> None:
51+
wrapped(*args, **kwargs)
52+
for handler in instance.inheritable_handlers:
53+
if isinstance(handler, OpenTelemetryCallbackHandler):
54+
return None
55+
else:
56+
instance.add_handler(self.callback_handler, True)

0 commit comments

Comments
 (0)