Skip to content

Commit c0ec961

Browse files
committed
Resolved issue where exception was being recorded twice
1 parent 2bc7075 commit c0ec961

File tree

1 file changed

+36
-2
lines changed

1 file changed

+36
-2
lines changed

middleware/trace.py

+36-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import sys
33
import logging
44
from opentelemetry.sdk.resources import Resource
5-
from opentelemetry.sdk.trace import TracerProvider
5+
from opentelemetry.sdk.trace import TracerProvider, SpanProcessor, ReadableSpan
66
from opentelemetry.sdk.trace.export import (
77
BatchSpanProcessor,
88
SimpleSpanProcessor,
@@ -16,6 +16,39 @@
1616

1717
_logger = logging.getLogger(__name__)
1818

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
1952

2053
def create_tracer_provider(options: MWOptions, resource: Resource) -> TracerProvider:
2154
"""
@@ -41,6 +74,7 @@ def create_tracer_provider(options: MWOptions, resource: Resource) -> TracerProv
4174
exporter,
4275
)
4376
)
77+
trace_provider.add_span_processor(ExceptionFilteringSpanProcessor())
4478
if options.console_exporter:
4579
output = sys.stdout
4680
if options.debug_log_file:
@@ -58,4 +92,4 @@ def create_tracer_provider(options: MWOptions, resource: Resource) -> TracerProv
5892
)
5993
)
6094
set_tracer_provider(tracer_provider=trace_provider)
61-
return trace_provider
95+
return trace_provider

0 commit comments

Comments
 (0)