Skip to content

Commit b44a041

Browse files
committed
refactored file format of langchain instrumentor, addressed PR comments and deleted unnecessary dependencies from pyproject.toml and added new path to pyproject.toml
1 parent 5ac2d75 commit b44a041

File tree

6 files changed

+45
-39
lines changed

6 files changed

+45
-39
lines changed

aws-opentelemetry-distro/pyproject.toml

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -82,13 +82,6 @@ dependencies = [
8282
"opentelemetry-instrumentation-urllib3 == 0.54b1",
8383
"opentelemetry-instrumentation-wsgi == 0.54b1",
8484
"opentelemetry-instrumentation-cassandra == 0.54b1",
85-
"langchain == 0.3.27",
86-
"langchain-core == 0.3.72",
87-
"langchain-aws == 0.2.15",
88-
"langchain-community == 0.3.27",
89-
"langgraph == 0.6.3",
90-
"pytest-asyncio == 0.21.0",
91-
"pytest-vcr == 1.0.2",
9285
]
9386

9487
[project.optional-dependencies]
@@ -103,7 +96,7 @@ test = []
10396
aws_configurator = "amazon.opentelemetry.distro.aws_opentelemetry_configurator:AwsOpenTelemetryConfigurator"
10497

10598
[project.entry-points.opentelemetry_instrumentor]
106-
langchain = "amazon.opentelemetry.distro.opentelemetry.instrumentation.langchain_v2:LangChainInstrumentor"
99+
langchain_v2 = "amazon.opentelemetry.distro.langchain_v2:LangChainInstrumentor"
107100

108101
[project.entry-points.opentelemetry_distro]
109102
aws_distro = "amazon.opentelemetry.distro.aws_opentelemetry_distro:AwsOpenTelemetryDistro"
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,15 @@
77

88
from wrapt import wrap_function_wrapper
99

10-
from amazon.opentelemetry.distro.opentelemetry.instrumentation.langchain_v2.callback_handler import (
10+
from amazon.opentelemetry.distro.langchain_v2.callback_handler import (
1111
OpenTelemetryCallbackHandler,
1212
)
13-
from amazon.opentelemetry.distro.opentelemetry.instrumentation.langchain_v2.version import __version__
13+
from amazon.opentelemetry.distro.langchain_v2.version import __version__
1414
from opentelemetry.instrumentation.instrumentor import BaseInstrumentor
1515
from opentelemetry.instrumentation.utils import unwrap
1616
from opentelemetry.trace import get_tracer
1717

18-
__all__ = ["OpenTelemetryCallbackHandler"]
18+
__all__ = ["OpenTelemetryCallbackHandler", "LangChainInstrumentor", "_BaseCallbackManagerInitWrapper", "_instruments"]
1919

2020
_instruments = ("langchain >= 0.1.0",)
2121

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
from langchain_core.messages import BaseMessage
1414
from langchain_core.outputs import LLMResult
1515

16-
from amazon.opentelemetry.distro.opentelemetry.instrumentation.langchain_v2.span_attributes import (
16+
from amazon.opentelemetry.distro.langchain_v2.span_attributes import (
1717
GenAIOperationValues,
1818
SpanAttributes,
1919
)

aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/test-opentelemetry-instrumentation-langchain-v2/test_callback_handler.py

Lines changed: 40 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -11,24 +11,41 @@
1111
from langchain_core.messages import AIMessage, HumanMessage
1212
from langchain_core.outputs import Generation, LLMResult
1313

14-
from amazon.opentelemetry.distro.opentelemetry.instrumentation.langchain_v2 import (
14+
from amazon.opentelemetry.distro.langchain_v2 import (
1515
LangChainInstrumentor,
1616
_BaseCallbackManagerInitWrapper,
1717
_instruments,
1818
)
19-
from amazon.opentelemetry.distro.opentelemetry.instrumentation.langchain_v2.callback_handler import (
19+
from amazon.opentelemetry.distro.langchain_v2.callback_handler import (
2020
OpenTelemetryCallbackHandler,
2121
SpanHolder,
2222
_sanitize_metadata_value,
2323
_set_request_params,
2424
_set_span_attribute,
2525
)
26-
from amazon.opentelemetry.distro.opentelemetry.instrumentation.langchain_v2.span_attributes import (
26+
from amazon.opentelemetry.distro.langchain_v2.span_attributes import (
2727
GenAIOperationValues,
2828
SpanAttributes,
2929
)
3030
from opentelemetry.trace import SpanKind, StatusCode
3131

32+
# from opentelemetry.distro import (
33+
# OpenTelemetryCallbackHandler,
34+
# SpanHolder,
35+
# _sanitize_metadata_value,
36+
# _set_request_params,
37+
# _set_span_attribute,
38+
# )
39+
# from opentelemetry.distro import (
40+
# GenAIOperationValues,
41+
# SpanAttributes,
42+
# )
43+
# from opentelemetry.distro import (
44+
# LangChainInstrumentor,
45+
# _BaseCallbackManagerInitWrapper,
46+
# _instruments,
47+
# )
48+
3249

3350
class TestOpenTelemetryHelperFunctions(unittest.TestCase):
3451
"""Test the helper functions in the callback handler module."""
@@ -63,9 +80,7 @@ def __str__(self):
6380

6481
self.assertEqual(_sanitize_metadata_value(TestClass()), "test_class")
6582

66-
@patch(
67-
"amazon.opentelemetry.distro.opentelemetry.instrumentation.langchain_v2.callback_handler._set_span_attribute"
68-
)
83+
@patch("amazon.opentelemetry.distro.langchain_v2.callback_handler._set_span_attribute")
6984
def test_set_request_params(self, mock_set_span_attribute):
7085
mock_span = Mock()
7186
mock_span_holder = Mock(spec=SpanHolder)
@@ -107,7 +122,7 @@ def test_init(self):
107122
self.assertEqual(handler.tracer, self.mock_tracer)
108123
self.assertEqual(handler.span_mapping, {})
109124

110-
@patch("amazon.opentelemetry.distro.opentelemetry.instrumentation.langchain_v2.callback_handler.context_api")
125+
@patch("amazon.opentelemetry.distro.langchain_v2.callback_handler.context_api")
111126
def test_create_span(self, mock_context_api):
112127
"""Test the _create_span method."""
113128
mock_context_api.get_value.return_value = {}
@@ -131,7 +146,7 @@ def test_create_span(self, mock_context_api):
131146
parent_span = Mock()
132147
self.handler.span_mapping[self.parent_run_id] = SpanHolder(parent_span, [], time.time(), "model-id")
133148

134-
@patch("amazon.opentelemetry.distro.opentelemetry.instrumentation.langchain_v2.callback_handler.context_api")
149+
@patch("amazon.opentelemetry.distro.langchain_v2.callback_handler.context_api")
135150
def test_on_llm_start_and_end(self, mock_context_api):
136151
mock_context_api.get_value.return_value = False
137152
serialized = {"name": "test_llm"}
@@ -182,7 +197,7 @@ def mock_create_span(run_id, parent_run_id, name, kind, metadata):
182197

183198
with patch(
184199
# pylint: disable=no-self-use
185-
"amazon.opentelemetry.distro.opentelemetry.instrumentation.langchain_v2.callback_handler._set_span_attribute" # noqa: E501
200+
"amazon.opentelemetry.distro.langchain_v2.callback_handler._set_span_attribute" # noqa: E501
186201
) as mock_set_attribute:
187202
with patch.object(self.handler, "_end_span"):
188203
self.handler.on_llm_end(response=response, run_id=self.run_id, parent_run_id=self.parent_run_id)
@@ -199,7 +214,7 @@ def mock_create_span(run_id, parent_run_id, name, kind, metadata):
199214

200215
self.handler._create_span = original_create_span
201216

202-
@patch("amazon.opentelemetry.distro.opentelemetry.instrumentation.langchain_v2.callback_handler.context_api")
217+
@patch("amazon.opentelemetry.distro.langchain_v2.callback_handler.context_api")
203218
def test_on_llm_error(self, mock_context_api):
204219
"""Test the on_llm_error method."""
205220
mock_context_api.get_value.return_value = False
@@ -215,7 +230,7 @@ def test_on_llm_error(self, mock_context_api):
215230
self.mock_span.record_exception.assert_called_once_with(error)
216231
self.mock_span.end.assert_called_once()
217232

218-
@patch("amazon.opentelemetry.distro.opentelemetry.instrumentation.langchain_v2.callback_handler.context_api")
233+
@patch("amazon.opentelemetry.distro.langchain_v2.callback_handler.context_api")
219234
def test_on_chain_start_end(self, mock_context_api):
220235
"""Test the on_chain_start and on_chain_end methods."""
221236
mock_context_api.get_value.return_value = False
@@ -243,7 +258,7 @@ def test_on_chain_start_end(self, mock_context_api):
243258
self.mock_span.set_attribute.assert_called_with("gen_ai.completion", str(outputs))
244259
mock_end_span.assert_called_once_with(self.mock_span, self.run_id)
245260

246-
@patch("amazon.opentelemetry.distro.opentelemetry.instrumentation.langchain_v2.callback_handler.context_api")
261+
@patch("amazon.opentelemetry.distro.langchain_v2.callback_handler.context_api")
247262
def test_on_tool_start_end(self, mock_context_api):
248263
"""Test the on_tool_start and on_tool_end methods."""
249264
mock_context_api.get_value.return_value = False
@@ -276,7 +291,7 @@ def test_on_tool_start_end(self, mock_context_api):
276291

277292
self.mock_span.set_attribute.assert_any_call("gen_ai.tool.output", output)
278293

279-
@patch("amazon.opentelemetry.distro.opentelemetry.instrumentation.langchain_v2.callback_handler.context_api")
294+
@patch("amazon.opentelemetry.distro.langchain_v2.callback_handler.context_api")
280295
def test_on_agent_action_and_finish(self, mock_context_api):
281296
"""Test the on_agent_action and on_agent_finish methods."""
282297
mock_context_api.get_value.return_value = False
@@ -307,7 +322,7 @@ def test_on_agent_action_and_finish(self, mock_context_api):
307322
# Verify the output attribute was set
308323
self.mock_span.set_attribute.assert_any_call("gen_ai.agent.tool.output", "The answer is 4")
309324

310-
@patch("amazon.opentelemetry.distro.opentelemetry.instrumentation.langchain_v2.callback_handler.context_api")
325+
@patch("amazon.opentelemetry.distro.langchain_v2.callback_handler.context_api")
311326
def test_on_agent_error(self, mock_context_api):
312327
"""Test the on_agent_error method."""
313328
mock_context_api.get_value.return_value = False
@@ -336,8 +351,8 @@ def test_instrumentation_dependencies(self):
336351
self.assertEqual(result, _instruments)
337352
self.assertEqual(result, ("langchain >= 0.1.0",))
338353

339-
@patch("amazon.opentelemetry.distro.opentelemetry.instrumentation.langchain_v2.get_tracer")
340-
@patch("amazon.opentelemetry.distro.opentelemetry.instrumentation.langchain_v2.wrap_function_wrapper")
354+
@patch("amazon.opentelemetry.distro.langchain_v2.get_tracer")
355+
@patch("amazon.opentelemetry.distro.langchain_v2.wrap_function_wrapper")
341356
def test_instrument(self, mock_wrap, mock_get_tracer):
342357
"""Test the _instrument method."""
343358
mock_tracer = Mock()
@@ -358,7 +373,7 @@ def test_instrument(self, mock_wrap, mock_get_tracer):
358373
self.assertIsInstance(wrapper, _BaseCallbackManagerInitWrapper)
359374
self.assertIsInstance(wrapper.callback_handler, OpenTelemetryCallbackHandler)
360375

361-
@patch("amazon.opentelemetry.distro.opentelemetry.instrumentation.langchain_v2.unwrap")
376+
@patch("amazon.opentelemetry.distro.langchain_v2.unwrap")
362377
def test_uninstrument(self, mock_unwrap):
363378
"""Test the _uninstrument method."""
364379
self.instrumentor._wrapped = [("module1", "function1"), ("module2", "function2")]
@@ -463,7 +478,7 @@ def setUp(self):
463478
self.run_id = uuid.uuid4()
464479
self.parent_run_id = uuid.uuid4()
465480

466-
@patch("amazon.opentelemetry.distro.opentelemetry.instrumentation.langchain_v2.callback_handler.context_api")
481+
@patch("amazon.opentelemetry.distro.langchain_v2.callback_handler.context_api")
467482
def test_on_chat_model_start(self, mock_context_api):
468483
"""Test the on_chat_model_start method."""
469484
mock_context_api.get_value.return_value = False
@@ -509,7 +524,7 @@ def mocked_create_span(run_id, parent_run_id, name, kind, metadata):
509524
SpanAttributes.GEN_AI_OPERATION_NAME, GenAIOperationValues.CHAT
510525
)
511526

512-
@patch("amazon.opentelemetry.distro.opentelemetry.instrumentation.langchain_v2.callback_handler.context_api")
527+
@patch("amazon.opentelemetry.distro.langchain_v2.callback_handler.context_api")
513528
def test_on_chain_error(self, mock_context_api):
514529
"""Test the on_chain_error method."""
515530
mock_context_api.get_value.return_value = False
@@ -528,7 +543,7 @@ def test_on_chain_error(self, mock_context_api):
528543
# Verify _handle_error was called with the right parameters
529544
mock_handle_error.assert_called_once_with(test_error, self.run_id, self.parent_run_id)
530545

531-
@patch("amazon.opentelemetry.distro.opentelemetry.instrumentation.langchain_v2.callback_handler.context_api")
546+
@patch("amazon.opentelemetry.distro.langchain_v2.callback_handler.context_api")
532547
def test_on_tool_error(self, mock_context_api):
533548
"""Test the on_tool_error method."""
534549
mock_context_api.get_value.return_value = False
@@ -547,7 +562,7 @@ def test_on_tool_error(self, mock_context_api):
547562
# Verify _handle_error was called with the right parameters
548563
mock_handle_error.assert_called_once_with(test_error, self.run_id, self.parent_run_id)
549564

550-
@patch("amazon.opentelemetry.distro.opentelemetry.instrumentation.langchain_v2.callback_handler.context_api")
565+
@patch("amazon.opentelemetry.distro.langchain_v2.callback_handler.context_api")
551566
def test_get_name_from_callback(self, mock_context_api):
552567
"""Test the _get_name_from_callback method."""
553568
mock_context_api.get_value.return_value = False
@@ -588,9 +603,7 @@ def test_handle_error(self):
588603
test_error = ValueError("Test error")
589604

590605
# Mock the context_api.get_value to return False (don't suppress)
591-
with patch(
592-
"amazon.opentelemetry.distro.opentelemetry.instrumentation.langchain_v2.callback_handler.context_api"
593-
) as mock_context_api:
606+
with patch("amazon.opentelemetry.distro.langchain_v2.callback_handler.context_api") as mock_context_api:
594607
mock_context_api.get_value.return_value = False
595608

596609
# Patch the _end_span method
@@ -603,7 +616,7 @@ def test_handle_error(self):
603616
self.mock_span.record_exception.assert_called_once_with(test_error)
604617
mock_end_span.assert_called_once_with(self.mock_span, self.run_id)
605618

606-
@patch("amazon.opentelemetry.distro.opentelemetry.instrumentation.langchain_v2.callback_handler.context_api")
619+
@patch("amazon.opentelemetry.distro.langchain_v2.callback_handler.context_api")
607620
def test_on_llm_start_with_suppressed_instrumentation(self, mock_context_api):
608621
"""Test that methods don't proceed when instrumentation is suppressed."""
609622
# Set suppression key to True
@@ -615,7 +628,7 @@ def test_on_llm_start_with_suppressed_instrumentation(self, mock_context_api):
615628
# Verify _create_span was not called
616629
mock_create_span.assert_not_called()
617630

618-
@patch("amazon.opentelemetry.distro.opentelemetry.instrumentation.langchain_v2.callback_handler.context_api")
631+
@patch("amazon.opentelemetry.distro.langchain_v2.callback_handler.context_api")
619632
def test_on_llm_end_without_span(self, mock_context_api):
620633
"""Test on_llm_end when the run_id doesn't have a span."""
621634
mock_context_api.get_value.return_value = False
@@ -628,7 +641,7 @@ def test_on_llm_end_without_span(self, mock_context_api):
628641
response=response, run_id=uuid.uuid4() # Using a different run_id that's not in span_mapping
629642
)
630643

631-
@patch("amazon.opentelemetry.distro.opentelemetry.instrumentation.langchain_v2.callback_handler.context_api")
644+
@patch("amazon.opentelemetry.distro.langchain_v2.callback_handler.context_api")
632645
def test_on_llm_end_with_different_token_usage_keys(self, mock_context_api):
633646
"""Test on_llm_end with different token usage dictionary structures."""
634647
mock_context_api.get_value.return_value = False

0 commit comments

Comments
 (0)