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.ioand the status page history, that is the highest-value next hunt. getsentry/rfcsrejected 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.