Evidence ledger 31 sources Checked 30 Sep 2026

Evidence ledger

One row per claim in The shim outlives the migration: ten years of Sentry, read from its own deletions: who published it, what grade it carries, when it was written, when the link was last checked, and the quote or figure it rests on. Nothing in the guide is cited from memory, so anything not in this table is not in the guide.

Field guide: The shim outlives the migration: ten years of Sentry, read from its own deletions Research date: 2026-09-30. Every URL below was fetched during that session.

Method note, and the limit it imposes

This session's network egress reached github.com, raw.githubusercontent.com, pypi.org and registry.npmjs.org and nothing else. Sentry's engineering blog, its status page and its published incident narratives were unreachable, as were papers and conference talks. The hunt was therefore conducted with git clone, git log, git show and two package registries.

Seven repositories were cloned and read in full history: getsentry/sentry (111,408 commits), getsentry/snuba, getsentry/relay, getsentry/self-hosted, getsentry/taskbroker, getsentry/arroyo, getsentry/symbolicator and getsentry/rfcs.

The consequence for the reader: claims about what was built and when are unusually strong here, because they come from commit dates rather than recollection. Claims about outcomes are weak, because no incident narrative was available; every failure card is reconstructed from the commit that closed the incident and the pull request that explains the change, and says so. There are no blog, paper or talk tier sources in this guide, and only three distinct hosts.

# Org Title Tier Published Checked URL Claim taken from it Supporting quote or figure
1 Sentry RFC 0002: New Architecture adr 2022-07-21 2026-09-30 https://github.com/getsentry/rfcs/blob/main/text/0002-new-architecture.md RabbitMQ had reached a limit that degraded the whole pipeline when it hit disk "Our use of RabbitMQ is reaching the limits of what can be done with this system safely. If we hit disk our entire pipeline crawls to a grind and we're no longer able to keep up with the traffic."
2 Sentry RFC 0002: New Architecture adr 2022-07-21 2026-09-30 https://github.com/getsentry/rfcs/blob/main/text/0002-new-architecture.md Task duration variance, not volume, was the binding constraint on the queue "a JavaScript event can make it in the low milliseconds through the entire pipeline whereas a native event can spend up to 30 minutes or more in the pipeline in very extreme cases (completely cold caches against a slow symbol server)"
3 Sentry RFC 0002: New Architecture adr 2022-07-21 2026-09-30 https://github.com/getsentry/rfcs/blob/main/text/0002-new-architecture.md The serialization format, not the network, was what kept the system Python-only "We still use pickle as serialization format for Celery which means that it's not possible for code outside of the Sentry monolith to dispatch tasks."
4 Sentry RFC 0002: New Architecture adr 2022-07-21 2026-09-30 https://github.com/getsentry/rfcs/blob/main/text/0002-new-architecture.md Buffers were to be phased out because they scale poorly and cannot be filtered "The issue with buffers is that they are rather hard to scale, require the use of pickle for the model updates and are hard to work with when it comes to filtering."
5 Sentry RFC 0042: GoCD succeeds Freight as our CD solution adr 2022-09-20 2026-09-30 https://github.com/getsentry/rfcs/blob/main/text/0042-gocd-succeeds-freight-as-our-cd-solution.md An in-house tool's expiry date is the departure of its authors "Freight has been around for many years, and as primary contributors are no longer here it has been in maintenance mode for a long time."
6 Sentry RFC 0042: GoCD succeeds Freight as our CD solution adr 2022-09-20 2026-09-30 https://github.com/getsentry/rfcs/blob/main/text/0042-gocd-succeeds-freight-as-our-cd-solution.md Unowned schema migrations in an internal tool caused downtime "no one knows what alembic is and this actually resulted in some downtime as a recent Freight migration had to be figured out adhoc"
7 Sentry RFC 0042: GoCD succeeds Freight as our CD solution adr 2022-09-20 2026-09-30 https://github.com/getsentry/rfcs/blob/main/text/0042-gocd-succeeds-freight-as-our-cd-solution.md ArgoCD was rejected as the wrong category of tool, not as a weaker one "It is not general-purpose pipelining technology, which is what we want." Tekton: "a complex system with moving parts in k8s".
8 Sentry RFC 0119: Rust in Sentry adr 2023-10-25 2026-09-30 https://github.com/getsentry/rfcs/blob/main/text/0119-rust-in-sentry.md Public per-crate Python bindings were rejected because of maintenance and SemVer obligations "Maintaining Python Bindings is itself a huge burden and cumbersome to do"; disadvantages of the rejected option include "SemVer API maintenance obligations"
9 Sentry RFC 0157: Distroless base images adr 2026-03-27 2026-09-30 https://github.com/getsentry/rfcs/blob/main/text/0157-distroless-base-images.md Unused OS packages cost triage whether or not they are exploitable "Standard base images (e.g. python:3.x-slim, node:24-slim) ship with hundreds of OS packages that the application itself never uses"; "every new CVE in an unused package still requires triage and remediation"
10 Sentry The RFC corpus adr 2022-07-21 to 2026-09-25 2026-09-30 https://github.com/getsentry/rfcs/tree/main/text 64 merged RFCs with proposal numbers reaching 157; the corpus is dominated by SDK and product semantics, and the platform moves are largely absent Counted: 64 .md files in text/; highest referenced rfcs/pull/157; per-year merged counts fall from ~28 in 2023 to 5 in 2024 and 2 in 2025
11 Sentry self-hosted deployment manifest, full history source 2016-02-11 to 2026-09-29 2026-09-30 https://github.com/getsentry/self-hosted/blob/master/docker-compose.yml The reference deployment grew from 8 containers to 69 Mid-year service counts: 2016-06-28 = 8; 2019-06-20 = 7; 2020-06-29 = 23; 2021-06-30 = 30; 2023-06-30 = 38; 2024-06-20 = 56; 2025-06-30 = 60; 2026-07-01 = 69
12 Sentry self-hosted#220, make on-premise work for Sentry 10 source 2019-11-12 2026-09-30 https://github.com/getsentry/self-hosted/pull/220 Kafka, ZooKeeper, ClickHouse, Snuba and Symbolicator entered the deployment in one commit Commit subject: "feat(sentry10): Make on-premise work for Sentry 10 (#220)"; -S search dates first appearance of zookeeper:, kafka:, clickhouse:, snuba-api: and symbolicator: to 2019-11-12
13 Sentry self-hosted, Business Source License switch source 2019-11-06 2026-09-30 https://github.com/getsentry/self-hosted/pull/267 The licence change lands six days before the architecture change; correlation only, no causal claim is made Commit subject: "meta(LICENSE): Switch to Business Source License 1.1 (#267)"
14 Sentry self-hosted#3260, remove cdc and wal2json source 2024-08-12 2026-09-30 https://github.com/getsentry/self-hosted/pull/3260 Postgres change data capture was removed rather than replaced Commit subject: "Remove cdc and wal2json and use the default postgres entrypoint (#3260)"
15 Sentry self-hosted#3263, ZooKeeper-less Kafka source 2024-08-13 2026-09-30 https://github.com/getsentry/self-hosted/pull/3263 ZooKeeper left the deployment in August 2024 Commit subject: "Migrate to zookeeper-less kafka (#3263)"; zookeeper: absent from HEAD compose file
16 Sentry self-hosted#3498, S3 node store with SeaweedFS source 2025-09-13 2026-09-30 https://github.com/getsentry/self-hosted/pull/3498 Event bodies moved to an S3-compatible object store in the reference deployment Commit subject: "feat: Use S3 node store with seaweedfs (#3498)"; seaweedfs: first appears 2025-09-13
17 Sentry self-hosted#3946, remove the worker and cron containers source 2025-09-19 2026-09-30 https://github.com/getsentry/self-hosted/pull/3946 The Celery worker and cron containers, present since 2016-05-27, were removed Commit subject: "chore(tasks): Remove the worker and cron containers (#3946)"; taskbroker:, taskworker: and taskscheduler: first appear 2025-06-11
18 Sentry self-hosted installer minimum requirements source 2021-03-30 to 2025-03-27 2026-09-30 https://github.com/getsentry/self-hosted/blob/master/install/_min-requirements.sh The enforced RAM floor roughly quadrupled in three years 2021-03-30: MIN_RAM_HARD=3800 MIN_RAM_SOFT=7800 MIN_CPU_HARD=2 MIN_CPU_SOFT=4; 2024-08-17: MIN_RAM_HARD=15900 MIN_CPU_HARD=4; 2024-08-23: MIN_RAM_HARD=14000; 2025-03-27 introduces two tiers (7000/2 and 14000/4)
19 Sentry sentry/tsdb/redissnuba.py source 2019-02-28 to 2026-08-25 2026-09-30 https://github.com/getsentry/sentry/blob/master/src/sentry/tsdb/redissnuba.py The dual-backend shim is a per-method routing table, and it is still being maintained 91 months after it was added File contains method_specifications mapping each method to READ or WRITE, and a handler def dont_do_this(callargs): raise NotImplementedError("do not run this please"). Added 2019-02-28 ("tsdb: Add RedisSnubaTSDB backend"); most recent change 2026-08-25, "ref(tsdb): remove the dead Redis cmsketch frequency tables (#122479)"
20 Sentry sentry, node store backend directories source 2013-09-10 to 2019-10-14 2026-09-30 https://github.com/getsentry/sentry/tree/master/src/sentry/nodestore Five node store engines existed; three were deleted django added 2013-09-10 (present); riak 2013-10-17 to 2019-10-14; cassandra 2013-11-05 to 2019-04-26; bigtable added 2019-01-25 (present); multi 2013-10-17 to 2019-04-26
21 Sentry sentry, issue search backend directories source 2013-10-20 to 2019-02-27 2026-09-30 https://github.com/getsentry/sentry/tree/master/src/sentry/search Solr and Elasticsearch were both tried and abandoned inside two years, with no recorded reason django 2013-10-20 to 2019-02-27; solr 2013-10-20 to 2015-08-18 (22 months); elastic_search 2014-05-20 to 2015-10-04 (17 months); snuba added 2018-04-23 (present)
22 Sentry sentry, tag store backend directories source 2017-10-03 to 2019-10-10 2026-09-30 https://github.com/getsentry/sentry/tree/master/src/sentry/tagstore A full tag store rewrite (v2) was abandoned after 22 months; its shim lasted 4 months legacy 2017-10-03 to 2019-10-10; v2 2017-11-27 to 2019-09-30; multi 2017-12-19 to 2018-04-24; snuba added 2018-03-30 (present)
23 Sentry sentry#100326, remove more celery related code source 2025-09-26 2026-09-30 https://github.com/getsentry/sentry/pull/100326 Celery survived 126 months in the monolith and was removed in numbered parts src/sentry/celery.py added 2015-04-09, deleted 2025-09-26. Commit body: "Continue from #100302 and #99677 and remove another chunk of celery related code. Only one consumer and some settings remain. Refs STREAM-435"
24 Sentry sentry, taskworker package source 2025-01-31 2026-09-30 https://github.com/getsentry/sentry/tree/master/src/sentry/taskworker The Celery replacement landed in the monolith eight months before Celery was deleted src/sentry/taskworker/__init__.py added 2025-01-31
25 Sentry sentry, silo and hybridcloud packages source 2022-09-12 to 2023-09-25 2026-09-30 https://github.com/getsentry/sentry Regionalisation arrived through a decorator layer over existing models, not a new system src/sentry/silo first file 2022-10-28; src/sentry/hybridcloud 2023-09-25; earliest related commit "feat(hybrid-cloud): Introduce Region info and sentry region config (#38655)", 2022-09-12
26 Sentry Snuba README source 2018-03-01 to 2026-09 2026-09-30 https://github.com/getsentry/snuba/blob/master/README.rst Snuba existed to replace Postgres plus Redis for search and aggregation, and then absorbed everything time-series shaped "Snuba was originally developed to replace a combination of Postgres and Redis to search and provide aggregated data on Sentry errors. Since then it has evolved into the current form where it supports most time series related Sentry features over several data sets."
27 Sentry Snuba architecture overview source 2026-09 2026-09-30 https://github.com/getsentry/snuba/blob/master/docs/source/architecture/overview.rst The engine choice and the consistency bargain are both stated "Clickhouse was chosen as backing storage because it provides a good balance of the real time performance Snuba needs, its distributed and replicated nature, its flexibility in terms of storage engines and consistency guarantees." And: "By properly selecting the Clickhouse table engine to deduplicate rows we can achieve exactly once semantics if we accept eventual consistency."
28 Sentry Snuba ClickHouse migrations source 2026-09 2026-09-30 https://github.com/getsentry/snuba/tree/master/snuba/snuba_migrations Schema churn on the analytical store is large and ongoing 252 migration .py files under snuba/snuba_migrations at HEAD
29 Sentry Arroyo README source 2021-06-11 to 2026-09 2026-09-30 https://github.com/getsentry/arroyo/blob/main/README.md The consumer framework was extracted as a library with a strategy interface, not as a service "Arroyo includes a number of pre-built strategies such as RunTask, Filter, Reduce, CommitOffsets and more"; "Strategies can be chained together to form complex message processing pipelines."
30 Sentry Relay README and repository history source 2018-01-17 to 2026-09 2026-09-30 https://github.com/getsentry/relay/blob/master/README.md Relay is a proxy that moves server and SDK work to the edge; it was twice renamed "The Sentry Relay is a service that pushes some functionality from the Sentry SDKs as well as the Sentry server into a proxy process." First commit 2018-01-17; "ref: Rename smith to semaphore (#17)", 2018-05-09
31 Sentry Taskbroker README source 2024-11-01 to 2026-09 2026-09-30 https://github.com/getsentry/taskbroker/blob/main/README.md The replacement for Celery uses Kafka for transport and a local SQLite store for inflight tasks "Taskbroker consumes those messages and stores them in a SQLite database to avoid head-of-line blocking, enable out-of-order execution and per-task acknowledgements." Workers use gRPC GetTask and SetTaskStatus
32 Sentry arroyo#237, INC-378 postmortem 2023-05-22 2026-09-30 https://github.com/getsentry/arroyo/pull/237 A library join timeout did not hold under the overload it existed for "Pool.join will block for more than timeout seconds if there is a task that takes more than timeout seconds"; the description notes the problem is worsened when next_step rejects messages and batches are reprocessed
33 Sentry arroyo#425, inc-1013 postmortem 2025-01-24 2026-09-30 https://github.com/getsentry/arroyo/pull/425 A failing dead-letter queue stopped the consumer it was protecting "Right now, if the produce fails for any reason, the consumer backlogs, allow graceful degradation instead"
34 Sentry snuba#8002, inc-2173 postmortem 2026-06-08 2026-09-30 https://github.com/getsentry/snuba/pull/8002 Under storage overload, forcing a downsampled tier was preferred to rate limiting The change defaults queries to TIER_8 instead of TIER_1 during high-load ClickHouse incidents, which the author states "will lead to a degraded performance for customers" but is an improvement on aggressive rate limiting; also flips storage_routing.enable_get_cluster_loadinfo to False
35 Sentry snuba#7925, inc-2141 postmortem 2026-05-14 2026-09-30 https://github.com/getsentry/snuba/pull/7925 A liveness probe that checked non-essential clusters converted a partial dependency outage into lost capacity Commit subject: "fix(inc-2141): only check essential clusters in liveness healthcheck (#7925)"
36 Sentry snuba#7945 and #7952, INC-2179 postmortem 2026-05-19, 2026-05-20 2026-09-30 https://github.com/getsentry/snuba/pull/7945 Out-of-range timestamps reached a time-partitioned store and had to be dropped at ingestion, then cleaned up Commit subjects: "ref(INC-2179): drop eap-items and accepted-outcomes messages with out-of-range timestamps (#7945)" and "ref(INC-2179): drop past data older than 30 days (#7952)"
37 Sentry relay#1355, INC-181 postmortem 2022-07-28 2026-09-30 https://github.com/getsentry/relay/pull/1355 Edge relays dropped real customer events because a descriptive flag disagreed with the payload Commit subject: "fix(unreal): Don't drop event in PoP relays [INC-181] [ISSUE-1558] (#1355)". The PR describes envelopes with creates_event set true that carry no event, affecting Unreal payloads and potentially minidumps
38 Sentry Public commit logs, incident identifiers postmortem 2022-07-28 to 2026-05-19 2026-09-30 https://github.com/getsentry/snuba/commits/master Internal incident numbers leak into public commit subjects, which makes a private incident stream partially countable Observed range INC-181 (relay, 2022-07-28) to INC-2179 (snuba, 2026-05-19). Inference, not reported: if the numbering is sequential over one stream, that is roughly 2,000 numbered incidents in 46 months. The scheme is not published
39 PyPI sentry (the server package) casestudy 2012-01-04 to 2023-07-25 2026-09-30 https://pypi.org/project/sentry/ The server stopped being distributable as a Python package in July 2023 371 releases; first 2012-01-04 (2.0.0-Alpha1), last 2023-07-25 (23.7.1)
40 PyPI raven and sentry-sdk casestudy 2011-10-10 to 2026-09-28 2026-09-30 https://pypi.org/project/sentry-sdk/ The Python client was reset rather than migrated, with five months of overlap raven: 187 releases, 2011-10-10 to 2018-12-19. sentry-sdk: 351 releases, 2018-07-26 to 2026-09-28 (2.71.0)
41 PyPI sentry-relay casestudy 2020-01-27 to 2026-09-23 2026-09-30 https://pypi.org/project/sentry-relay/ The Rust bindings RFC 0119 calls a burden had four years of public releases behind it 93 releases, first 2020-01-27, latest 2026-09-23 (0.9.31)
42 PyPI sentry-arroyo casestudy 2021-06-29 to 2026-09-25 2026-09-30 https://pypi.org/project/sentry-arroyo/ The consumer library was published publicly 18 days after its first commit 205 releases, first 2021-06-29 (0.0.1), latest 2026-09-25 (2.44.2); repository first commit 2021-06-11
43 npm raven-js and @sentry/browser casestudy 2013-12-20 to 2026-09-29 2026-09-30 https://www.npmjs.com/package/@sentry/browser The browser client reset began 18 months before the Python one ended raven-js: 88 versions, 2013-12-20 to 2019-06-04. @sentry/browser: 750 versions, 2017-12-07 to 2026-09-29 (9.47.2)

Derived figures, with the arithmetic

All of these are differences between two commit dates from rows 19 to 23 above. They are the lifetime of a file in the repository, which is a proxy for the lifetime of a deployed backend and not identical to it.

Component Added Deleted Months
Node store, Riak 2013-10-17 2019-10-14 72
Node store, Cassandra 2013-11-05 2019-04-26 66
Node store, multi (shim) 2013-10-17 2019-04-26 66
Issue search, Django 2013-10-20 2019-02-27 64
Issue search, Solr 2013-10-20 2015-08-18 22
Issue search, Elasticsearch 2014-05-20 2015-10-04 17
Tag store, legacy 2017-10-03 2019-10-10 24
Tag store, v2 2017-11-27 2019-09-30 22
Tag store, multi (shim) 2017-12-19 2018-04-24 4
Redis and Snuba time series (shim) 2019-02-28 still present 91 and counting
Celery in the monolith 2015-04-09 2025-09-26 126

Tier mix

Tier Count
postmortem (incident fixes, reconstructed) 6
source 15
adr 5
casestudy (registry records) 5
blog 0
paper 0
talk 0
vendor 0

Three distinct hosts: github.com, pypi.org, npmjs.com. Below the breadth this guide's format normally requires, for the reason given at the top of this file.

Threads that were opened and did not produce

  • Sentry's own incident narratives. The identifiers in rows 32 to 38 point at internal records. No public write-up of any of them was reachable. If you can reach blog.sentry.io and the status page history, that is the highest-value next hunt.
  • getsentry/rfcs rejected proposals. Only three proposal branches survive on the remote (0023-improve-fingerprinting-for-performance-issues, 0028-scaling-codeowners, 0071-shorter-env-var-names), against a numbering sequence that reaches 157. Most rejected arguments were not preserved as branches, so the closed pull requests are where they live.
  • The 2013 to 2015 search experiments. Solr and Elasticsearch were added and removed with no design document, no RFC (the repository did not exist) and no explanatory commit body. This is the one decision in the guide with no recorded reason at all.
  • Whether any shim ever returned inconsistent answers. Nothing in the corpus records this, which is weak evidence either way, for the reason given in the failures section.