feat(web): releases page - #764
Open
Makisuo wants to merge 4 commits into
Open
Conversation
A release is a commit the moment it starts serving traffic. The service overview rollups already key on `vcs.ref.head.revision`, so the whole page is a GROUP BY over the splice the services list reads; nothing scans raw traces. - query-engine: `releasesListQuery` (one row per service/env/commit), `releasesTimelineQuery` (org-wide swimlane buckets) and `releaseErrorFingerprintsQuery` (error fingerprints keyed on `service.version`), with tests and SQL-catalog fixtures. - api: `POST /internal/query-engine/releases` and `/release-detail` bundles; the detail runs versions, timeline, this-version and other-versions timeseries and the fingerprints in one invocation. - web: `/releases` with a health/environment/service sidebar, per-service swimlanes and a commit-grouped table with per-service children and "vs. rest of service" deltas; `/releases/$commitSha` with a comparison table, versions rail, the service page's four charts with commit markers, and new/regressed/ongoing issue lists. Sidebar entry under Monitor. Health bands reuse the services table's deploy thresholds (50 spans on each side, 2x error ratio, 25% p95). The filter param is `impact`, not `health`, because the router merges every route's search schema and the services page already owns `health` with different literals.
# Conflicts: # packages/query-engine/src/benchmark/catalog.test.ts
CI's build-web check failed at 651.1 KB gzip against the 650.0 KB cap. main sits at 648.4 KB, so the page had 1.6 KB to spend and spent 2.7: 0.9 in the domain contract, 0.4 in the atoms module (the adapter), 0.3 in the entry for two routes, and the rest in the route shell. - Route shell: the search schema spelled its literals inline instead of importing the release model (which pulled the whole model into every page's first load); the hover-preload loader is gone (loaders stay in the shell by config); `releasesQueryInput` moved out of the route file, since an export of a route module stays in its shell. - Contract: dropped fields nothing read — `lastSeen`, the two estimated counts, the timeline's per-bucket `errorCount`, the fingerprint `lastSeen`, the request `limit` and `excludedNamespaces`. Lazy-loading the adapter was tried and made things worse: the dynamic import boundary split `custom-charts` out of the atoms chunk and cost more than the adapter itself. Local build is now 649.9 KB.
New `releases` organization feature flag (Clerk public metadata key `releases`, off by default, on for self-hosted like the others). Only the sidebar and command-palette row are gated; `/releases` and `/releases/$commitSha` stay reachable by URL.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
A Releases page: what shipped, per service, and whether it changed anything.
/releases— filter sidebar (health band, environment, service; all derived client-side from the same rows), plain-text stats, per-service swimlanes with one dot per version at its first-seen time, and a table grouped by commit with day headers, expandable per-service children, and "this version vs. the rest of the service" deltas for error rate and p95./releases/$commitSha?service=…— commit title and provider link, a comparison table against the other versions of the service in the same window, a versions rail, the service page's four golden-signal charts (with commit markers and a "This version / Other versions" toggle), and three issue lists: new on this version, regressed on it, still occurring.Why
Deploy information already existed as three fragments (the service page's markers and Recent-deploys rail, the services table's deploy cell, and fix verification's version split). None of them answered "what shipped across the fleet, and did it make anything worse?".
How
A release is a commit the moment it starts serving traffic. The service-overview rollups key on
vcs.ref.head.revisionasCommitSha, so every read here is aGROUP BYover the same hourly/minutely/raw splice the services list uses — no rawtracesscan.packages/query-engine:releasesListQuery(one row per service/env/commit with counts, tdigest quantiles and apdex counts),releasesTimelineQuery(org-wide buckets for the swimlanes and the rollout share),releaseErrorFingerprintsQuery(error fingerprints onerror_events_by_timekeyed onservice.version). Tests, catalog fixtures, and the SQL baseline are included;serviceOverviewWindowsis now exported for reuse.apps/api:POST /internal/query-engine/releasesand/release-detailbundle handlers. The detail runs versions, timeline, two timeseries (commitShas: [sha]andexcludedCommitShas: [sha]) and the fingerprints concurrently.apps/web: adapter + atoms, a purerelease-model.tsfor the derivations (tested), and the two routes. Commit resolution reuses the bulk VCS lookup; the issues panel is one v2 list call keyed on the fingerprints.Health bands reuse the services table's constants: 50 spans on each side before comparing, 2× error ratio with a 0.5pp floor for "errors up", +25% p95 for "latency up", and under 90% of the latest bucket for "rolling out" (also behind the span floor).
Reviewer notes
impact, nothealth: TanStack merges every route's search schema into one union, and/servicesalready ownshealthwith different literals.service.version-only (CLI semver) deploys appear, delivered deploy events (GitHub/Cloudflare), and a "fixed by this version" list from verifications.Need help on this PR? Tag
@codesmith-botwith what you need. Autofix is disabled.