Skip to content

Commit c133c81

Browse files
authored
ref: Add types to store and symbolication (#29014)
1 parent 7179feb commit c133c81

File tree

5 files changed

+167
-67
lines changed

5 files changed

+167
-67
lines changed

mypy.ini

+2
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ files = src/sentry/api/bases/external_actor.py,
5757
src/sentry/spans/**/*.py,
5858
src/sentry/tasks/app_store_connect.py,
5959
src/sentry/tasks/low_priority_symbolication.py,
60+
src/sentry/tasks/store.py,
61+
src/sentry/tasks/symbolication.py,
6062
src/sentry/tasks/update_user_reports.py,
6163
src/sentry/unmerge.py,
6264
src/sentry/utils/appleconnect/,

src/sentry/tasks/store.py

+103-43
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import logging
22
from datetime import datetime
33
from time import time
4+
from typing import Any, Callable, Dict, List, Optional
45

56
import sentry_sdk
67
from django.conf import settings
@@ -12,6 +13,7 @@
1213
from sentry.constants import DEFAULT_STORE_NORMALIZER_ARGS
1314
from sentry.datascrubbing import scrub_data
1415
from sentry.eventstore import processing
16+
from sentry.eventstore.processing.base import Event
1517
from sentry.killswitches import killswitch_matches_context
1618
from sentry.models import Activity, Organization, Project, ProjectOption
1719
from sentry.stacktraces.processing import process_stacktraces, should_process_for_stacktraces
@@ -33,9 +35,13 @@ class RetryProcessing(Exception):
3335
pass
3436

3537

36-
@metrics.wraps("should_process")
37-
def should_process(data):
38+
@metrics.wraps("should_process") # type: ignore
39+
def should_process(data: CanonicalKeyDict) -> bool:
3840
"""Quick check if processing is needed at all."""
41+
return _should_process_inner(data)
42+
43+
44+
def _should_process_inner(data: CanonicalKeyDict) -> bool:
3945
from sentry.plugins.base import plugins
4046

4147
if data.get("type") == "transaction":
@@ -59,13 +65,13 @@ def should_process(data):
5965

6066

6167
def submit_process(
62-
project,
63-
from_reprocessing,
64-
cache_key,
65-
event_id,
66-
start_time,
67-
data_has_changed=None,
68-
):
68+
project: Optional[Project],
69+
from_reprocessing: bool,
70+
cache_key: str,
71+
event_id: Optional[str],
72+
start_time: Optional[int],
73+
data_has_changed: bool = False,
74+
) -> None:
6975
task = process_event_from_reprocessing if from_reprocessing else process_event
7076
task.delay(
7177
cache_key=cache_key,
@@ -75,7 +81,14 @@ def submit_process(
7581
)
7682

7783

78-
def submit_save_event(project_id, from_reprocessing, cache_key, event_id, start_time, data):
84+
def submit_save_event(
85+
project_id: int,
86+
from_reprocessing: bool,
87+
cache_key: Optional[str],
88+
event_id: Optional[str],
89+
start_time: Optional[int],
90+
data: Optional[Event],
91+
) -> None:
7992
if cache_key:
8093
data = None
8194

@@ -90,7 +103,14 @@ def submit_save_event(project_id, from_reprocessing, cache_key, event_id, start_
90103
)
91104

92105

93-
def _do_preprocess_event(cache_key, data, start_time, event_id, process_task, project):
106+
def _do_preprocess_event(
107+
cache_key: str,
108+
data: Optional[Event],
109+
start_time: Optional[int],
110+
event_id: Optional[str],
111+
process_task: Callable[[Optional[str], Optional[int], Optional[str], bool], None],
112+
project: Optional[Project],
113+
) -> None:
94114
from sentry.lang.native.processing import should_process_with_symbolicator
95115
from sentry.tasks.symbolication import should_demote_symbolication, submit_symbolicate
96116

@@ -147,15 +167,20 @@ def _do_preprocess_event(cache_key, data, start_time, event_id, process_task, pr
147167
submit_save_event(project_id, from_reprocessing, cache_key, event_id, start_time, original_data)
148168

149169

150-
@instrumented_task(
170+
@instrumented_task( # type: ignore
151171
name="sentry.tasks.store.preprocess_event",
152172
queue="events.preprocess_event",
153173
time_limit=65,
154174
soft_time_limit=60,
155175
)
156176
def preprocess_event(
157-
cache_key=None, data=None, start_time=None, event_id=None, project=None, **kwargs
158-
):
177+
cache_key: str,
178+
data: Optional[Event] = None,
179+
start_time: Optional[int] = None,
180+
event_id: Optional[str] = None,
181+
project: Optional[Project] = None,
182+
**kwargs: Any,
183+
) -> None:
159184
return _do_preprocess_event(
160185
cache_key=cache_key,
161186
data=data,
@@ -166,15 +191,20 @@ def preprocess_event(
166191
)
167192

168193

169-
@instrumented_task(
194+
@instrumented_task( # type: ignore
170195
name="sentry.tasks.store.preprocess_event_from_reprocessing",
171196
queue="events.reprocessing.preprocess_event",
172197
time_limit=65,
173198
soft_time_limit=60,
174199
)
175200
def preprocess_event_from_reprocessing(
176-
cache_key=None, data=None, start_time=None, event_id=None, project=None, **kwargs
177-
):
201+
cache_key: str,
202+
data: Optional[Event] = None,
203+
start_time: Optional[int] = None,
204+
event_id: Optional[str] = None,
205+
project: Optional[Project] = None,
206+
**kwargs: Any,
207+
) -> None:
178208
return _do_preprocess_event(
179209
cache_key=cache_key,
180210
data=data,
@@ -185,13 +215,13 @@ def preprocess_event_from_reprocessing(
185215
)
186216

187217

188-
@instrumented_task(
218+
@instrumented_task( # type: ignore
189219
name="sentry.tasks.store.retry_process_event",
190220
queue="sleep",
191221
time_limit=(60 * 5) + 5,
192222
soft_time_limit=60 * 5,
193223
)
194-
def retry_process_event(process_task_name, task_kwargs, **kwargs):
224+
def retry_process_event(process_task_name: str, task_kwargs: Dict[str, Any], **kwargs: Any) -> None:
195225
"""
196226
The only purpose of this task is be enqueued with some ETA set. This is
197227
essentially an implementation of ETAs on top of Celery's existing ETAs, but
@@ -210,14 +240,14 @@ def retry_process_event(process_task_name, task_kwargs, **kwargs):
210240

211241

212242
def do_process_event(
213-
cache_key,
214-
start_time,
215-
event_id,
216-
process_task,
217-
data=None,
218-
data_has_changed=None,
219-
from_symbolicate=False,
220-
):
243+
cache_key: str,
244+
start_time: Optional[int],
245+
event_id: Optional[str],
246+
process_task: Callable[[Optional[str], Optional[int], Optional[str], bool], None],
247+
data: Optional[Event] = None,
248+
data_has_changed: bool = False,
249+
from_symbolicate: bool = False,
250+
) -> None:
221251
from sentry.plugins.base import plugins
222252

223253
if data is None:
@@ -237,7 +267,7 @@ def do_process_event(
237267

238268
event_id = data["event_id"]
239269

240-
def _continue_to_save_event():
270+
def _continue_to_save_event() -> None:
241271
from_reprocessing = process_task is process_event_from_reprocessing
242272
submit_save_event(project_id, from_reprocessing, cache_key, event_id, start_time, data)
243273

@@ -259,7 +289,7 @@ def _continue_to_save_event():
259289
"organization", Organization.objects.get_from_cache(id=project.organization_id)
260290
)
261291

262-
has_changed = bool(data_has_changed)
292+
has_changed = data_has_changed
263293

264294
with sentry_sdk.start_span(op="tasks.store.process_event.get_reprocessing_revision"):
265295
# Fetch the reprocessing revision
@@ -376,13 +406,19 @@ def _continue_to_save_event():
376406
return _continue_to_save_event()
377407

378408

379-
@instrumented_task(
409+
@instrumented_task( # type: ignore
380410
name="sentry.tasks.store.process_event",
381411
queue="events.process_event",
382412
time_limit=65,
383413
soft_time_limit=60,
384414
)
385-
def process_event(cache_key, start_time=None, event_id=None, data_has_changed=None, **kwargs):
415+
def process_event(
416+
cache_key: str,
417+
start_time: Optional[int] = None,
418+
event_id: Optional[str] = None,
419+
data_has_changed: bool = False,
420+
**kwargs: Any,
421+
) -> None:
386422
"""
387423
Handles event processing (for those events that need it)
388424
@@ -402,15 +438,19 @@ def process_event(cache_key, start_time=None, event_id=None, data_has_changed=No
402438
)
403439

404440

405-
@instrumented_task(
441+
@instrumented_task( # type: ignore
406442
name="sentry.tasks.store.process_event_from_reprocessing",
407443
queue="events.reprocessing.process_event",
408444
time_limit=65,
409445
soft_time_limit=60,
410446
)
411447
def process_event_from_reprocessing(
412-
cache_key, start_time=None, event_id=None, data_has_changed=None, **kwargs
413-
):
448+
cache_key: str,
449+
start_time: Optional[int] = None,
450+
event_id: Optional[str] = None,
451+
data_has_changed: bool = False,
452+
**kwargs: Any,
453+
) -> None:
414454
return do_process_event(
415455
cache_key=cache_key,
416456
start_time=start_time,
@@ -420,7 +460,9 @@ def process_event_from_reprocessing(
420460
)
421461

422462

423-
def delete_raw_event(project_id, event_id, allow_hint_clear=False):
463+
def delete_raw_event(
464+
project_id: int, event_id: Optional[str], allow_hint_clear: bool = False
465+
) -> None:
424466
set_current_event_project(project_id)
425467

426468
if event_id is None:
@@ -448,8 +490,14 @@ def delete_raw_event(project_id, event_id, allow_hint_clear=False):
448490

449491

450492
def create_failed_event(
451-
cache_key, data, project_id, issues, event_id, start_time=None, reprocessing_rev=None
452-
):
493+
cache_key: str,
494+
data: Optional[Event],
495+
project_id: int,
496+
issues: List[Dict[str, str]],
497+
event_id: Optional[str],
498+
start_time: Optional[int] = None,
499+
reprocessing_rev: Any = None,
500+
) -> bool:
453501
"""If processing failed we put the original data from the cache into a
454502
raw event. Returns `True` if a failed event was inserted
455503
"""
@@ -538,8 +586,13 @@ def create_failed_event(
538586

539587

540588
def _do_save_event(
541-
cache_key=None, data=None, start_time=None, event_id=None, project_id=None, **kwargs
542-
):
589+
cache_key: Optional[str] = None,
590+
data: Optional[Event] = None,
591+
start_time: Optional[int] = None,
592+
event_id: Optional[str] = None,
593+
project_id: Optional[int] = None,
594+
**kwargs: Any,
595+
) -> None:
543596
"""
544597
Saves an event to the database.
545598
"""
@@ -643,7 +696,9 @@ def _do_save_event(
643696
time_synthetic_monitoring_event(data, project_id, start_time)
644697

645698

646-
def time_synthetic_monitoring_event(data, project_id, start_time):
699+
def time_synthetic_monitoring_event(
700+
data: Event, project_id: int, start_time: Optional[int]
701+
) -> bool:
647702
"""
648703
For special events produced by the recurring synthetic monitoring
649704
functions, emit timing metrics for:
@@ -691,13 +746,18 @@ def time_synthetic_monitoring_event(data, project_id, start_time):
691746
return True
692747

693748

694-
@instrumented_task(
749+
@instrumented_task( # type: ignore
695750
name="sentry.tasks.store.save_event",
696751
queue="events.save_event",
697752
time_limit=65,
698753
soft_time_limit=60,
699754
)
700755
def save_event(
701-
cache_key=None, data=None, start_time=None, event_id=None, project_id=None, **kwargs
702-
):
756+
cache_key: Optional[str] = None,
757+
data: Optional[Event] = None,
758+
start_time: Optional[int] = None,
759+
event_id: Optional[str] = None,
760+
project_id: Optional[int] = None,
761+
**kwargs: Any,
762+
) -> None:
703763
_do_save_event(cache_key, data, start_time, event_id, project_id, **kwargs)

0 commit comments

Comments
 (0)