File tree 3 files changed +33
-0
lines changed
opentelemetry-api/src/opentelemetry/trace
src/opentelemetry/sdk/trace
3 files changed +33
-0
lines changed Original file line number Diff line number Diff line change @@ -88,6 +88,10 @@ def set_status(self, status: Status) -> None:
88
88
Span status, which is OK.
89
89
"""
90
90
91
+ @abc .abstractmethod
92
+ def record_error (self , err : Exception ) -> None :
93
+ """Records an error as a span event."""
94
+
91
95
def __enter__ (self ) -> "Span" :
92
96
"""Invoked when `Span` is used as a context manager.
93
97
@@ -253,6 +257,9 @@ def update_name(self, name: str) -> None:
253
257
def set_status (self , status : Status ) -> None :
254
258
pass
255
259
260
+ def record_error (self , err : Exception ) -> None :
261
+ pass
262
+
256
263
257
264
INVALID_SPAN_ID = 0x0000000000000000
258
265
INVALID_TRACE_ID = 0x00000000000000000000000000000000
Original file line number Diff line number Diff line change 20
20
import logging
21
21
import random
22
22
import threading
23
+ import traceback
23
24
from collections import OrderedDict
24
25
from contextlib import contextmanager
25
26
from types import TracebackType
@@ -681,6 +682,17 @@ def __exit__(
681
682
682
683
super ().__exit__ (exc_type , exc_val , exc_tb )
683
684
685
+ def record_error (self , err : Exception ) -> None :
686
+ """Records an error as a span event."""
687
+ self .add_event (
688
+ name = "error" ,
689
+ attributes = {
690
+ "error.type" : err .__class__ .__name__ ,
691
+ "error.message" : str (err ),
692
+ "error.stack" : traceback .format_exc (),
693
+ },
694
+ )
695
+
684
696
685
697
def generate_span_id () -> int :
686
698
"""Get a new random span ID.
Original file line number Diff line number Diff line change @@ -801,6 +801,20 @@ def error_status_test(context):
801
801
.start_as_current_span ("root" )
802
802
)
803
803
804
+ def test_record_error (self ):
805
+ span = trace .Span ("name" , mock .Mock (spec = trace_api .SpanContext ))
806
+ try :
807
+ raise ValueError ("invalid" )
808
+ except ValueError as err :
809
+ span .record_error (err )
810
+ error_event = span .events [0 ]
811
+ self .assertEqual ("error" , error_event .name )
812
+ self .assertEqual ("invalid" , error_event .attributes ["error.message" ])
813
+ self .assertEqual ("ValueError" , error_event .attributes ["error.type" ])
814
+ self .assertIn (
815
+ "ValueError: invalid" , error_event .attributes ["error.stack" ]
816
+ )
817
+
804
818
805
819
def span_event_start_fmt (span_processor_name , span_name ):
806
820
return span_processor_name + ":" + span_name + ":start"
You can’t perform that action at this time.
0 commit comments