Skip to content

Commit ee04fd0

Browse files
authored
chore(spans): Reorder functions in the process-segments consumer (#87270)
Moves code around for readability, no functional changes. Public functions are now at the top, and remaining functions in functional decomposition order.
1 parent cc312e7 commit ee04fd0

File tree

2 files changed

+47
-51
lines changed

2 files changed

+47
-51
lines changed

src/sentry/spans/consumers/process_segments/factory.py

+29-33
Original file line numberDiff line numberDiff line change
@@ -26,38 +26,6 @@
2626
logger = logging.getLogger(__name__)
2727

2828

29-
def process_message(message: Message[KafkaPayload]) -> list[Span]:
30-
value = message.payload.value
31-
segment = BUFFERED_SEGMENT_SCHEMA.decode(value)
32-
return process_segment(cast(list[Span], segment["spans"]))
33-
34-
35-
def _process_message(message: Message[KafkaPayload]) -> list[Span]:
36-
if not options.get("standalone-spans.process-segments-consumer.enable"):
37-
return []
38-
39-
try:
40-
return process_message(message)
41-
except Exception: # NOQA
42-
raise
43-
# TODO: Implement error handling
44-
# sentry_sdk.capture_exception()
45-
# assert isinstance(message.value, BrokerValue)
46-
# raise InvalidMessage(message.value.partition, message.value.offset)
47-
48-
49-
def explode_segment(message: tuple[list[Span], Mapping[Partition, int]]):
50-
spans, committable = message
51-
last = len(spans) - 1
52-
for i, span in enumerate(spans):
53-
if span is not None:
54-
yield Value(
55-
payload=KafkaPayload(key=None, value=orjson.dumps(span), headers=[]),
56-
committable=committable if i == last else {},
57-
timestamp=None,
58-
)
59-
60-
6129
class DetectPerformanceIssuesStrategyFactory(ProcessingStrategyFactory[KafkaPayload]):
6230
def __init__(
6331
self,
@@ -104,7 +72,7 @@ def create_with_partitions(
10472
# the generator function.
10573
zip_commit = RunTask(
10674
function=lambda m: (m.payload, m.committable),
107-
next_step=Unfold(generator=explode_segment, next_step=produce_step),
75+
next_step=Unfold(generator=_unfold_segment, next_step=produce_step),
10876
)
10977

11078
return run_task_with_multiprocessing(
@@ -119,3 +87,31 @@ def create_with_partitions(
11987

12088
def shutdown(self):
12189
self.pool.close()
90+
91+
92+
def _process_message(message: Message[KafkaPayload]) -> list[Span]:
93+
if not options.get("standalone-spans.process-segments-consumer.enable"):
94+
return []
95+
96+
try:
97+
value = message.payload.value
98+
segment = BUFFERED_SEGMENT_SCHEMA.decode(value)
99+
return process_segment(cast(list[Span], segment["spans"]))
100+
except Exception: # NOQA
101+
raise
102+
# TODO: Implement error handling
103+
# sentry_sdk.capture_exception()
104+
# assert isinstance(message.value, BrokerValue)
105+
# raise InvalidMessage(message.value.partition, message.value.offset)
106+
107+
108+
def _unfold_segment(message: tuple[list[Span], Mapping[Partition, int]]):
109+
spans, committable = message
110+
last = len(spans) - 1
111+
for i, span in enumerate(spans):
112+
if span is not None:
113+
yield Value(
114+
payload=KafkaPayload(key=None, value=orjson.dumps(span), headers=[]),
115+
committable=committable if i == last else {},
116+
timestamp=None,
117+
)

src/sentry/spans/consumers/process_segments/message.py

+18-18
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,24 @@ class Span(SchemaSpan, total=False):
3939
hash: str | None # Added in enrichment
4040

4141

42+
def process_segment(spans: list[Span]) -> list[Span]:
43+
segment_span = _find_segment_span(spans)
44+
if segment_span is None:
45+
# TODO: Handle segments without a defined segment span once all
46+
# functions are refactored to a span interface.
47+
return spans
48+
49+
with metrics.timer("spans.consumers.process_segments.get_project"):
50+
project = Project.objects.get_from_cache(id=segment_span["project_id"])
51+
52+
_enrich_spans(segment_span, spans)
53+
_create_models(segment_span, project)
54+
_detect_performance_problems(segment_span, spans, project)
55+
_record_signals(segment_span, spans, project)
56+
57+
return spans
58+
59+
4260
def _find_segment_span(spans: list[Span]) -> Span | None:
4361
"""
4462
Finds the segment in the span in the list that has ``is_segment`` set to
@@ -237,21 +255,3 @@ def _record_signals(segment_span: Span, spans: list[Span], project: Project) ->
237255
for module, is_module in INSIGHT_MODULE_FILTERS.items():
238256
if not get_project_insight_flag(project, module) and is_module(spans):
239257
record_first_insight_span(project, module)
240-
241-
242-
def process_segment(spans: list[Span]) -> list[Span]:
243-
segment_span = _find_segment_span(spans)
244-
if segment_span is None:
245-
# TODO: Handle segments without a defined segment span once all
246-
# functions are refactored to a span interface.
247-
return spans
248-
249-
with metrics.timer("spans.consumers.process_segments.get_project"):
250-
project = Project.objects.get_from_cache(id=segment_span["project_id"])
251-
252-
_enrich_spans(segment_span, spans)
253-
_create_models(segment_span, project)
254-
_detect_performance_problems(segment_span, spans, project)
255-
_record_signals(segment_span, spans, project)
256-
257-
return spans

0 commit comments

Comments
 (0)