DashboardsentryDistillation

Distillation

ID: 8c02d71d-dc88-4155-8012-3b9f654335f2
Session: 0rWXqG93IDSI
Generation: 0
Tokens: 1264
R_compression: 12.966
C_norm: 0.000
Archived: No
Created: 2026-07-30 15:51:04
Source IDs:
["dbd7affbf2e588a549c6b88598422107","969161f719d6cc8365331b8740f9ba57"]

Observations

<observations> Date: July 30, 2026 * 🟡 (15:47) File traced: commit d7fcb07bc428b049a6fe94adfaa5c5217a25796e by Ben McKerry, dated Tue Jul 21 00:50:48 2026 -0400. Title: "feat(ingest): add option to reprocess events not in nodestore (#120133)". Adds `--reprocess-only-events-not-in-nodestore` flag to ingest consumers, analogous to `--reprocess-only-stuck-events` but for events NOT in nodestore (vs events stuck in processing redis). Purpose: reprocess events previously stuck in processing redis (due to failing during `save_*`), then deleted from processing redis (meaning other reprocess flag won't work) * 🟡 (15:47) Diff details for d7fcb07bc42 in `src/sentry/ingest/consumer/processors.py`: - Imports added: `from sentry import features, nodestore` (replacing single `from sentry import features`) - Import added: `from sentry.services.eventstore.models import Event` - New parameter on `process_event`: `reprocess_only_events_not_in_nodestore: bool = False` (added between `reprocess_only_stuck_events` and `inline_save_event`) - New code block after line 188 (after `reprocess_only_stuck_events` check): ``` if reprocess_only_events_not_in_nodestore: with start_span(op="nodestore.exists", name="nodestore.exists"): node_id = Event.generate_node_id(project_id, event_id) if nodestore.backend.get(node_id) is not None: return ``` * 🟡 (15:47) Diff details for 99e5d7c5133 ("fix(feedback): don't orphan feedback payloads in the processing store") — behavioral change: - Before: `with metrics.timer("ingest_consumer._store_event"): cache_key = processing_store.store(data)` always wrote to Redis - After: ``` cache_key = None if data.get("type") != "feedback": with metrics.timer("ingest_consumer._store_event"): cache_key = processing_store.store(data) ``` - Comment added: "Feedback events pass their payload inline to `save_event_feedback` and never read it back from the processing store, so skip the Redis write for them. Storing would orphan the payload in Redis until its TTL expires, since nothing on the feedback path deletes it." - Comment on `cache_key=None` in denylist path updated from "no need to cache as volume is low" to "data is passed inline; not stored in Redis" - Transaction path (`assert cache_key is not None`) and error/preprocess path (`cache_key or ""`) are unaffected — only feedback is skipped * 🟡 (15:47) Diff details for 5ae4736ff76 ("feat(ingest): Run save_event inline for ingest events raw task"): - New params on `process_event`: `inline_save_event: bool = False`, `inline_save_event_transaction: bool = False` - Transaction path refactored from direct `.delay()` to: ``` save_transaction_kwargs: dict[str, Any] = { "cache_key": cache_key, "data": None, "start_time": start_time, "event_id": event_id, "project_id": project_id, } if inline_save_event_transaction: save_event_transaction(**save_transaction_kwargs) else: save_event_transaction.delay(**save_transaction_kwargs) ``` * 🟡 (15:47) Refined analysis: conditions where `event_accepted.send_robust()` is NOT called — full list with line numbers: 1. `processors.py:131` — Duplicate event (cache dedup hit) 2. `processors.py:144` — Killswitch `store.load-shed-pipeline-projects` matches 3. `processors.py:150` — `orjson.loads(payload)` raises (OUTSIDE try block, propagates unhandled, NOT wrapped as Retriable) 4. `processors.py:175` — Killswitch `store.load-shed-parsed-pipeline-projects` matches 5. `processors.py:188` — `reprocess_only_stuck_events=True` and event not in processing_store 6. `processors.py:196` — `reprocess_only_events_not_in_nodestore=True` and event IS in nod