11
11
from langchain_core .messages import AIMessage , HumanMessage
12
12
from langchain_core .outputs import Generation , LLMResult
13
13
14
- from amazon .opentelemetry .distro .opentelemetry . instrumentation . langchain_v2 import (
14
+ from amazon .opentelemetry .distro .langchain_v2 import (
15
15
LangChainInstrumentor ,
16
16
_BaseCallbackManagerInitWrapper ,
17
17
_instruments ,
18
18
)
19
- from amazon .opentelemetry .distro .opentelemetry . instrumentation . langchain_v2 .callback_handler import (
19
+ from amazon .opentelemetry .distro .langchain_v2 .callback_handler import (
20
20
OpenTelemetryCallbackHandler ,
21
21
SpanHolder ,
22
22
_sanitize_metadata_value ,
23
23
_set_request_params ,
24
24
_set_span_attribute ,
25
25
)
26
- from amazon .opentelemetry .distro .opentelemetry . instrumentation . langchain_v2 .span_attributes import (
26
+ from amazon .opentelemetry .distro .langchain_v2 .span_attributes import (
27
27
GenAIOperationValues ,
28
28
SpanAttributes ,
29
29
)
30
30
from opentelemetry .trace import SpanKind , StatusCode
31
31
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
+
32
49
33
50
class TestOpenTelemetryHelperFunctions (unittest .TestCase ):
34
51
"""Test the helper functions in the callback handler module."""
@@ -63,9 +80,7 @@ def __str__(self):
63
80
64
81
self .assertEqual (_sanitize_metadata_value (TestClass ()), "test_class" )
65
82
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" )
69
84
def test_set_request_params (self , mock_set_span_attribute ):
70
85
mock_span = Mock ()
71
86
mock_span_holder = Mock (spec = SpanHolder )
@@ -107,7 +122,7 @@ def test_init(self):
107
122
self .assertEqual (handler .tracer , self .mock_tracer )
108
123
self .assertEqual (handler .span_mapping , {})
109
124
110
- @patch ("amazon.opentelemetry.distro.opentelemetry.instrumentation. langchain_v2.callback_handler.context_api" )
125
+ @patch ("amazon.opentelemetry.distro.langchain_v2.callback_handler.context_api" )
111
126
def test_create_span (self , mock_context_api ):
112
127
"""Test the _create_span method."""
113
128
mock_context_api .get_value .return_value = {}
@@ -131,7 +146,7 @@ def test_create_span(self, mock_context_api):
131
146
parent_span = Mock ()
132
147
self .handler .span_mapping [self .parent_run_id ] = SpanHolder (parent_span , [], time .time (), "model-id" )
133
148
134
- @patch ("amazon.opentelemetry.distro.opentelemetry.instrumentation. langchain_v2.callback_handler.context_api" )
149
+ @patch ("amazon.opentelemetry.distro.langchain_v2.callback_handler.context_api" )
135
150
def test_on_llm_start_and_end (self , mock_context_api ):
136
151
mock_context_api .get_value .return_value = False
137
152
serialized = {"name" : "test_llm" }
@@ -182,7 +197,7 @@ def mock_create_span(run_id, parent_run_id, name, kind, metadata):
182
197
183
198
with patch (
184
199
# 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
186
201
) as mock_set_attribute :
187
202
with patch .object (self .handler , "_end_span" ):
188
203
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):
199
214
200
215
self .handler ._create_span = original_create_span
201
216
202
- @patch ("amazon.opentelemetry.distro.opentelemetry.instrumentation. langchain_v2.callback_handler.context_api" )
217
+ @patch ("amazon.opentelemetry.distro.langchain_v2.callback_handler.context_api" )
203
218
def test_on_llm_error (self , mock_context_api ):
204
219
"""Test the on_llm_error method."""
205
220
mock_context_api .get_value .return_value = False
@@ -215,7 +230,7 @@ def test_on_llm_error(self, mock_context_api):
215
230
self .mock_span .record_exception .assert_called_once_with (error )
216
231
self .mock_span .end .assert_called_once ()
217
232
218
- @patch ("amazon.opentelemetry.distro.opentelemetry.instrumentation. langchain_v2.callback_handler.context_api" )
233
+ @patch ("amazon.opentelemetry.distro.langchain_v2.callback_handler.context_api" )
219
234
def test_on_chain_start_end (self , mock_context_api ):
220
235
"""Test the on_chain_start and on_chain_end methods."""
221
236
mock_context_api .get_value .return_value = False
@@ -243,7 +258,7 @@ def test_on_chain_start_end(self, mock_context_api):
243
258
self .mock_span .set_attribute .assert_called_with ("gen_ai.completion" , str (outputs ))
244
259
mock_end_span .assert_called_once_with (self .mock_span , self .run_id )
245
260
246
- @patch ("amazon.opentelemetry.distro.opentelemetry.instrumentation. langchain_v2.callback_handler.context_api" )
261
+ @patch ("amazon.opentelemetry.distro.langchain_v2.callback_handler.context_api" )
247
262
def test_on_tool_start_end (self , mock_context_api ):
248
263
"""Test the on_tool_start and on_tool_end methods."""
249
264
mock_context_api .get_value .return_value = False
@@ -276,7 +291,7 @@ def test_on_tool_start_end(self, mock_context_api):
276
291
277
292
self .mock_span .set_attribute .assert_any_call ("gen_ai.tool.output" , output )
278
293
279
- @patch ("amazon.opentelemetry.distro.opentelemetry.instrumentation. langchain_v2.callback_handler.context_api" )
294
+ @patch ("amazon.opentelemetry.distro.langchain_v2.callback_handler.context_api" )
280
295
def test_on_agent_action_and_finish (self , mock_context_api ):
281
296
"""Test the on_agent_action and on_agent_finish methods."""
282
297
mock_context_api .get_value .return_value = False
@@ -307,7 +322,7 @@ def test_on_agent_action_and_finish(self, mock_context_api):
307
322
# Verify the output attribute was set
308
323
self .mock_span .set_attribute .assert_any_call ("gen_ai.agent.tool.output" , "The answer is 4" )
309
324
310
- @patch ("amazon.opentelemetry.distro.opentelemetry.instrumentation. langchain_v2.callback_handler.context_api" )
325
+ @patch ("amazon.opentelemetry.distro.langchain_v2.callback_handler.context_api" )
311
326
def test_on_agent_error (self , mock_context_api ):
312
327
"""Test the on_agent_error method."""
313
328
mock_context_api .get_value .return_value = False
@@ -336,8 +351,8 @@ def test_instrumentation_dependencies(self):
336
351
self .assertEqual (result , _instruments )
337
352
self .assertEqual (result , ("langchain >= 0.1.0" ,))
338
353
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" )
341
356
def test_instrument (self , mock_wrap , mock_get_tracer ):
342
357
"""Test the _instrument method."""
343
358
mock_tracer = Mock ()
@@ -358,7 +373,7 @@ def test_instrument(self, mock_wrap, mock_get_tracer):
358
373
self .assertIsInstance (wrapper , _BaseCallbackManagerInitWrapper )
359
374
self .assertIsInstance (wrapper .callback_handler , OpenTelemetryCallbackHandler )
360
375
361
- @patch ("amazon.opentelemetry.distro.opentelemetry.instrumentation. langchain_v2.unwrap" )
376
+ @patch ("amazon.opentelemetry.distro.langchain_v2.unwrap" )
362
377
def test_uninstrument (self , mock_unwrap ):
363
378
"""Test the _uninstrument method."""
364
379
self .instrumentor ._wrapped = [("module1" , "function1" ), ("module2" , "function2" )]
@@ -463,7 +478,7 @@ def setUp(self):
463
478
self .run_id = uuid .uuid4 ()
464
479
self .parent_run_id = uuid .uuid4 ()
465
480
466
- @patch ("amazon.opentelemetry.distro.opentelemetry.instrumentation. langchain_v2.callback_handler.context_api" )
481
+ @patch ("amazon.opentelemetry.distro.langchain_v2.callback_handler.context_api" )
467
482
def test_on_chat_model_start (self , mock_context_api ):
468
483
"""Test the on_chat_model_start method."""
469
484
mock_context_api .get_value .return_value = False
@@ -509,7 +524,7 @@ def mocked_create_span(run_id, parent_run_id, name, kind, metadata):
509
524
SpanAttributes .GEN_AI_OPERATION_NAME , GenAIOperationValues .CHAT
510
525
)
511
526
512
- @patch ("amazon.opentelemetry.distro.opentelemetry.instrumentation. langchain_v2.callback_handler.context_api" )
527
+ @patch ("amazon.opentelemetry.distro.langchain_v2.callback_handler.context_api" )
513
528
def test_on_chain_error (self , mock_context_api ):
514
529
"""Test the on_chain_error method."""
515
530
mock_context_api .get_value .return_value = False
@@ -528,7 +543,7 @@ def test_on_chain_error(self, mock_context_api):
528
543
# Verify _handle_error was called with the right parameters
529
544
mock_handle_error .assert_called_once_with (test_error , self .run_id , self .parent_run_id )
530
545
531
- @patch ("amazon.opentelemetry.distro.opentelemetry.instrumentation. langchain_v2.callback_handler.context_api" )
546
+ @patch ("amazon.opentelemetry.distro.langchain_v2.callback_handler.context_api" )
532
547
def test_on_tool_error (self , mock_context_api ):
533
548
"""Test the on_tool_error method."""
534
549
mock_context_api .get_value .return_value = False
@@ -547,7 +562,7 @@ def test_on_tool_error(self, mock_context_api):
547
562
# Verify _handle_error was called with the right parameters
548
563
mock_handle_error .assert_called_once_with (test_error , self .run_id , self .parent_run_id )
549
564
550
- @patch ("amazon.opentelemetry.distro.opentelemetry.instrumentation. langchain_v2.callback_handler.context_api" )
565
+ @patch ("amazon.opentelemetry.distro.langchain_v2.callback_handler.context_api" )
551
566
def test_get_name_from_callback (self , mock_context_api ):
552
567
"""Test the _get_name_from_callback method."""
553
568
mock_context_api .get_value .return_value = False
@@ -588,9 +603,7 @@ def test_handle_error(self):
588
603
test_error = ValueError ("Test error" )
589
604
590
605
# 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 :
594
607
mock_context_api .get_value .return_value = False
595
608
596
609
# Patch the _end_span method
@@ -603,7 +616,7 @@ def test_handle_error(self):
603
616
self .mock_span .record_exception .assert_called_once_with (test_error )
604
617
mock_end_span .assert_called_once_with (self .mock_span , self .run_id )
605
618
606
- @patch ("amazon.opentelemetry.distro.opentelemetry.instrumentation. langchain_v2.callback_handler.context_api" )
619
+ @patch ("amazon.opentelemetry.distro.langchain_v2.callback_handler.context_api" )
607
620
def test_on_llm_start_with_suppressed_instrumentation (self , mock_context_api ):
608
621
"""Test that methods don't proceed when instrumentation is suppressed."""
609
622
# Set suppression key to True
@@ -615,7 +628,7 @@ def test_on_llm_start_with_suppressed_instrumentation(self, mock_context_api):
615
628
# Verify _create_span was not called
616
629
mock_create_span .assert_not_called ()
617
630
618
- @patch ("amazon.opentelemetry.distro.opentelemetry.instrumentation. langchain_v2.callback_handler.context_api" )
631
+ @patch ("amazon.opentelemetry.distro.langchain_v2.callback_handler.context_api" )
619
632
def test_on_llm_end_without_span (self , mock_context_api ):
620
633
"""Test on_llm_end when the run_id doesn't have a span."""
621
634
mock_context_api .get_value .return_value = False
@@ -628,7 +641,7 @@ def test_on_llm_end_without_span(self, mock_context_api):
628
641
response = response , run_id = uuid .uuid4 () # Using a different run_id that's not in span_mapping
629
642
)
630
643
631
- @patch ("amazon.opentelemetry.distro.opentelemetry.instrumentation. langchain_v2.callback_handler.context_api" )
644
+ @patch ("amazon.opentelemetry.distro.langchain_v2.callback_handler.context_api" )
632
645
def test_on_llm_end_with_different_token_usage_keys (self , mock_context_api ):
633
646
"""Test on_llm_end with different token usage dictionary structures."""
634
647
mock_context_api .get_value .return_value = False
0 commit comments