From c8d8d2822d301540294972e5e15052940cf3a912 Mon Sep 17 00:00:00 2001
From: s1gr1d <32902192+s1gr1d@users.noreply.github.com>
Date: Fri, 13 Nov 2026 14:13:35 +0100
Subject: [PATCH 1/2] feat(trace-view): Show server rendering and cache
lifecycle to all users
Remove the frontend checks for the flag performance-trace-cache-lifecycle. The Cache Lifecycle and Server Rendering sections in the span details and the server render placeholder rows in the waterfall now show for all organizations. Both section titles get a "new" badge.
The backend flag registration is removed in a separate PR.
---
.../span/eapSections/cacheLifecycle.tsx | 29 +++++---------
.../span/eapSections/serverRendering.tsx | 3 +-
.../traceDrawer/details/span/index.tsx | 40 +++++++++----------
.../traceTree.serverRendering.spec.tsx | 14 ++-----
.../traceDetails/traceModels/traceTree.tsx | 4 +-
5 files changed, 35 insertions(+), 55 deletions(-)
diff --git a/static/app/views/performance/traceDetails/traceDrawer/details/span/eapSections/cacheLifecycle.tsx b/static/app/views/performance/traceDetails/traceDrawer/details/span/eapSections/cacheLifecycle.tsx
index 973704daf93e..2762edaec6f7 100644
--- a/static/app/views/performance/traceDetails/traceDrawer/details/span/eapSections/cacheLifecycle.tsx
+++ b/static/app/views/performance/traceDetails/traceDrawer/details/span/eapSections/cacheLifecycle.tsx
@@ -2,7 +2,7 @@ import {Fragment, useState} from 'react';
import {useTheme} from '@emotion/react';
import type {Location} from 'history';
-import {Tag} from '@sentry/scraps/badge';
+import {FeatureBadge, Tag} from '@sentry/scraps/badge';
import {LinkButton} from '@sentry/scraps/button';
import {InfoText} from '@sentry/scraps/info';
import {Flex, Grid, Stack} from '@sentry/scraps/layout';
@@ -191,28 +191,21 @@ function LifecycleFoldSection({
children: React.ReactNode;
tag?: React.ReactNode;
}) {
- const title = (
-
- );
-
return (
- {title}
- {tag}
-
- ) : (
- title
- )
+
+
+
+ {tag}
+
}
>
{children}
diff --git a/static/app/views/performance/traceDetails/traceDrawer/details/span/eapSections/serverRendering.tsx b/static/app/views/performance/traceDetails/traceDrawer/details/span/eapSections/serverRendering.tsx
index 280455161714..6dc0dc6ee7c9 100644
--- a/static/app/views/performance/traceDetails/traceDrawer/details/span/eapSections/serverRendering.tsx
+++ b/static/app/views/performance/traceDetails/traceDrawer/details/span/eapSections/serverRendering.tsx
@@ -1,7 +1,7 @@
import {IconOpen} from '@sentry/icons/open';
import type {Location} from 'history';
-import {Tag} from '@sentry/scraps/badge';
+import {FeatureBadge, Tag} from '@sentry/scraps/badge';
import {Button} from '@sentry/scraps/button';
import {Flex, Stack} from '@sentry/scraps/layout';
import {Link} from '@sentry/scraps/link';
@@ -121,6 +121,7 @@ function SectionTitle({type}: {type: ServerRenderingType | undefined}) {
'Where the server spans of this page are. A reused part has its spans in the trace that rendered it.'
)}
/>
+
{type ? {TYPE_LABELS[type]} : null}
);
diff --git a/static/app/views/performance/traceDetails/traceDrawer/details/span/index.tsx b/static/app/views/performance/traceDetails/traceDrawer/details/span/index.tsx
index 5272e9c689aa..1752e2e7573a 100644
--- a/static/app/views/performance/traceDetails/traceDrawer/details/span/index.tsx
+++ b/static/app/views/performance/traceDetails/traceDrawer/details/span/index.tsx
@@ -410,28 +410,24 @@ function EAPSpanNodeDetailsContent({
avgSpanDuration={avgSpanDuration}
hideNodeActions={hideNodeActions}
/>
- {organization.features.includes('performance-trace-cache-lifecycle') ? (
-
-
-
-
- ) : null}
+
+
, org = organization) {
- return TraceTree.FromTrace(makeEAPTrace([pageload]), {replay: null, organization: org});
+function buildTree(pageload: ReturnType) {
+ return TraceTree.FromTrace(makeEAPTrace([pageload]), {replay: null, organization});
}
function getPageload(tree: TraceTree) {
@@ -161,10 +159,4 @@ eap trace root
expect(tree.root.findChild(isServerRenderNode)).toBeNull();
});
-
- it('adds no placeholder without the feature', () => {
- const tree = buildTree(makePageload('static'), OrganizationFixture());
-
- expect(tree.root.findChild(isServerRenderNode)).toBeNull();
- });
});
diff --git a/static/app/views/performance/traceDetails/traceModels/traceTree.tsx b/static/app/views/performance/traceDetails/traceModels/traceTree.tsx
index 5ecb4ba03275..8891a764b2df 100644
--- a/static/app/views/performance/traceDetails/traceModels/traceTree.tsx
+++ b/static/app/views/performance/traceDetails/traceModels/traceTree.tsx
@@ -576,9 +576,7 @@ export class TraceTree extends TraceTreeEventDispatcher {
tree.indicators.sort((a, b) => a.start - b.start);
- if (options.organization.features.includes('performance-trace-cache-lifecycle')) {
- TraceTree.AddServerRenderPlaceholders(tree.root);
- }
+ TraceTree.AddServerRenderPlaceholders(tree.root);
TraceTree.ApplyPreferences(tree.root, options);
From 1059c1dc6371582df751c24fe2b9418b0e52e2ab Mon Sep 17 00:00:00 2001
From: s1gr1d <32902192+s1gr1d@users.noreply.github.com>
Date: Fri, 13 Nov 2026 14:50:50 +0100
Subject: [PATCH 2/2] fix(trace-view): Use sentence case for section titles
---
.../traceDrawer/details/span/eapSections/cacheLifecycle.tsx | 2 +-
.../details/span/eapSections/serverRendering.spec.tsx | 2 +-
.../traceDrawer/details/span/eapSections/serverRendering.tsx | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/static/app/views/performance/traceDetails/traceDrawer/details/span/eapSections/cacheLifecycle.tsx b/static/app/views/performance/traceDetails/traceDrawer/details/span/eapSections/cacheLifecycle.tsx
index 2762edaec6f7..66ffdc5e5a83 100644
--- a/static/app/views/performance/traceDetails/traceDrawer/details/span/eapSections/cacheLifecycle.tsx
+++ b/static/app/views/performance/traceDetails/traceDrawer/details/span/eapSections/cacheLifecycle.tsx
@@ -198,7 +198,7 @@ function LifecycleFoldSection({
title={
{
links: [makeLink('cache_origin')],
});
- expect(screen.getByText('Server Rendering')).toBeInTheDocument();
+ expect(screen.getByText('Server rendering')).toBeInTheDocument();
expect(screen.getByText('Static')).toBeInTheDocument();
expect(screen.getByText('Whole page')).toBeInTheDocument();
expect(screen.getByText('Rendered earlier and reused')).toBeInTheDocument();
diff --git a/static/app/views/performance/traceDetails/traceDrawer/details/span/eapSections/serverRendering.tsx b/static/app/views/performance/traceDetails/traceDrawer/details/span/eapSections/serverRendering.tsx
index 6dc0dc6ee7c9..632eeb6e5b6b 100644
--- a/static/app/views/performance/traceDetails/traceDrawer/details/span/eapSections/serverRendering.tsx
+++ b/static/app/views/performance/traceDetails/traceDrawer/details/span/eapSections/serverRendering.tsx
@@ -116,7 +116,7 @@ function SectionTitle({type}: {type: ServerRenderingType | undefined}) {
return (