66
66
from opentelemetry .trace import SpanKind , Tracer , set_span_in_context
67
67
from opentelemetry .trace .span import Span
68
68
from opentelemetry .trace .status import Status , StatusCode
69
+ from opentelemetry .semconv .attributes .error_attributes import ERROR_TYPE
69
70
70
71
71
72
def _extract_class_name_from_serialized (serialized : Optional [dict [str , Any ]]) -> str :
@@ -240,7 +241,11 @@ def _create_span(
240
241
# Set metadata as span attributes if available
241
242
if metadata is not None :
242
243
for key , value in sanitized_metadata .items ():
243
- _set_span_attribute (span , f"{ SpanAttributes .TRACELOOP_ASSOCIATION_PROPERTIES } .{ key } " , value )
244
+ _set_span_attribute (
245
+ span ,
246
+ f"{ SpanAttributes .TRACELOOP_ASSOCIATION_PROPERTIES } .{ key } " ,
247
+ value ,
248
+ )
244
249
245
250
self .spans [run_id ] = SpanHolder (
246
251
span , token , None , [], workflow_name , entity_name , entity_path
@@ -300,7 +305,9 @@ def _create_llm_span(
300
305
metadata = metadata ,
301
306
)
302
307
303
- vendor = detect_vendor_from_class (_extract_class_name_from_serialized (serialized ))
308
+ vendor = detect_vendor_from_class (
309
+ _extract_class_name_from_serialized (serialized )
310
+ )
304
311
305
312
_set_span_attribute (span , SpanAttributes .LLM_SYSTEM , vendor )
306
313
_set_span_attribute (span , SpanAttributes .LLM_REQUEST_TYPE , request_type .value )
@@ -425,7 +432,12 @@ def on_chat_model_start(
425
432
426
433
name = self ._get_name_from_callback (serialized , kwargs = kwargs )
427
434
span = self ._create_llm_span (
428
- run_id , parent_run_id , name , LLMRequestTypeValues .CHAT , metadata = metadata , serialized = serialized
435
+ run_id ,
436
+ parent_run_id ,
437
+ name ,
438
+ LLMRequestTypeValues .CHAT ,
439
+ metadata = metadata ,
440
+ serialized = serialized ,
429
441
)
430
442
set_request_params (span , kwargs , self .spans [run_id ])
431
443
if should_emit_events ():
@@ -451,7 +463,11 @@ def on_llm_start(
451
463
452
464
name = self ._get_name_from_callback (serialized , kwargs = kwargs )
453
465
span = self ._create_llm_span (
454
- run_id , parent_run_id , name , LLMRequestTypeValues .COMPLETION , serialized = serialized
466
+ run_id ,
467
+ parent_run_id ,
468
+ name ,
469
+ LLMRequestTypeValues .COMPLETION ,
470
+ serialized = serialized ,
455
471
)
456
472
set_request_params (span , kwargs , self .spans [run_id ])
457
473
if should_emit_events ():
@@ -479,7 +495,9 @@ def on_llm_end(
479
495
"model_name"
480
496
) or response .llm_output .get ("model_id" )
481
497
if model_name is not None :
482
- _set_span_attribute (span , SpanAttributes .LLM_RESPONSE_MODEL , model_name or "unknown" )
498
+ _set_span_attribute (
499
+ span , SpanAttributes .LLM_RESPONSE_MODEL , model_name or "unknown"
500
+ )
483
501
484
502
if self .spans [run_id ].request_model is None :
485
503
_set_span_attribute (
@@ -539,7 +557,9 @@ def on_llm_end(
539
557
SpanAttributes .LLM_RESPONSE_MODEL : model_name or "unknown" ,
540
558
},
541
559
)
542
- set_chat_response_usage (span , response , self .token_histogram , token_usage is None , model_name )
560
+ set_chat_response_usage (
561
+ span , response , self .token_histogram , token_usage is None , model_name
562
+ )
543
563
if should_emit_events ():
544
564
self ._emit_llm_end_events (response )
545
565
else :
@@ -705,6 +725,8 @@ def on_tool_error(
705
725
** kwargs : Any ,
706
726
) -> None :
707
727
"""Run when tool errors."""
728
+ span = self ._get_span (run_id )
729
+ span .set_attribute (ERROR_TYPE , type (error ).__name__ )
708
730
self ._handle_error (error , run_id , parent_run_id , ** kwargs )
709
731
710
732
@dont_throw
0 commit comments