2
2
import sys
3
3
import logging
4
4
from opentelemetry .sdk .resources import Resource
5
- from opentelemetry .sdk .trace import TracerProvider
5
+ from opentelemetry .sdk .trace import TracerProvider , SpanProcessor , ReadableSpan
6
6
from opentelemetry .sdk .trace .export import (
7
7
BatchSpanProcessor ,
8
8
SimpleSpanProcessor ,
16
16
17
17
_logger = logging .getLogger (__name__ )
18
18
19
+ class ExceptionFilteringSpanProcessor (SpanProcessor ):
20
+ def on_start (self , span : ReadableSpan , parent_context ):
21
+ pass
22
+
23
+ def on_end (self , span : ReadableSpan ):
24
+ # Check if there is any "exception" event with "exception.stack_details"
25
+ has_stack_details = any (
26
+ event .name == "exception" and "exception.stack_details" in event .attributes
27
+ for event in span .events
28
+ )
29
+
30
+ if has_stack_details :
31
+ # Keep only the unique "exception" events based on "exception.stack_trace"
32
+ seen_stack_traces = set ()
33
+ filtered_events = []
34
+ for event in span .events :
35
+ if event .name == "exception" and "exception.stack_details" in event .attributes :
36
+ stack_trace = event .attributes .get ("exception.stack_trace" )
37
+ seen_stack_traces .add (stack_trace )
38
+ filtered_events .append (event )
39
+ elif event .name == "exception" :
40
+ stack_trace = event .attributes .get ("exception.stack_trace" )
41
+ if stack_trace not in seen_stack_traces :
42
+ filtered_events .append (event )
43
+ elif event .name != "exception" :
44
+ filtered_events .append (event )
45
+ span ._events = filtered_events
46
+
47
+ def shutdown (self ):
48
+ pass
49
+
50
+ def force_flush (self , timeout_millis = None ):
51
+ pass
19
52
20
53
def create_tracer_provider (options : MWOptions , resource : Resource ) -> TracerProvider :
21
54
"""
@@ -41,6 +74,7 @@ def create_tracer_provider(options: MWOptions, resource: Resource) -> TracerProv
41
74
exporter ,
42
75
)
43
76
)
77
+ trace_provider .add_span_processor (ExceptionFilteringSpanProcessor ())
44
78
if options .console_exporter :
45
79
output = sys .stdout
46
80
if options .debug_log_file :
@@ -58,4 +92,4 @@ def create_tracer_provider(options: MWOptions, resource: Resource) -> TracerProv
58
92
)
59
93
)
60
94
set_tracer_provider (tracer_provider = trace_provider )
61
- return trace_provider
95
+ return trace_provider
0 commit comments