From e3c5a5903fe6c36ac81605034a58e889d0042eaf Mon Sep 17 00:00:00 2001 From: Abdullah Khan Date: Sat, 6 Dec 2025 15:51:56 -0500 Subject: [PATCH 1/2] feat(trace-tree-node): Mitigating error node type guards usage --- .../newTraceDetails/traceHeader/meta.tsx | 26 +++++++++++-------- .../traceRenderers/virtualizedViewManager.tsx | 3 +-- .../newTraceDetails/traceRow/traceIcons.tsx | 4 +-- 3 files changed, 18 insertions(+), 15 deletions(-) diff --git a/static/app/views/performance/newTraceDetails/traceHeader/meta.tsx b/static/app/views/performance/newTraceDetails/traceHeader/meta.tsx index 7d9e06c6244660..05ebd51d8f6051 100644 --- a/static/app/views/performance/newTraceDetails/traceHeader/meta.tsx +++ b/static/app/views/performance/newTraceDetails/traceHeader/meta.tsx @@ -10,10 +10,6 @@ import type {OurLogsResponseItem} from 'sentry/views/explore/logs/types'; import type {TraceMetaQueryResults} from 'sentry/views/performance/newTraceDetails/traceApi/useTraceMeta'; import type {RepresentativeTraceEvent} from 'sentry/views/performance/newTraceDetails/traceApi/utils'; import {TraceDrawerComponents} from 'sentry/views/performance/newTraceDetails/traceDrawer/details/styles'; -import { - isEAPError, - isTraceError, -} from 'sentry/views/performance/newTraceDetails/traceGuards'; import type {TraceTree} from 'sentry/views/performance/newTraceDetails/traceModels/traceTree'; import {useTraceQueryParams} from 'sentry/views/performance/newTraceDetails/useTraceQueryParams'; @@ -57,16 +53,24 @@ interface MetaProps { } function getRootDuration(event: TraceTree.TraceEvent | null) { - if (!event || isEAPError(event) || isTraceError(event)) { + if (!event) { return '\u2014'; } - return getDuration( - ('timestamp' in event ? event.timestamp : event.end_timestamp) - - event.start_timestamp, - 2, - true - ); + const startTimestamp = 'start_timestamp' in event ? event.start_timestamp : undefined; + // TODO Abdullah Khan: Clean this up once getRepresentativeTraceEvent is moved to the TraceTree class + const endTimestamp = + 'timestamp' in event + ? event.timestamp + : 'event_timestamp' in event && typeof event.event_timestamp === 'number' + ? event.event_timestamp + : undefined; + + if (!startTimestamp || !endTimestamp) { + return '\u2014'; + } + + return getDuration(endTimestamp - startTimestamp, 2, true); } export function Meta(props: MetaProps) { diff --git a/static/app/views/performance/newTraceDetails/traceRenderers/virtualizedViewManager.tsx b/static/app/views/performance/newTraceDetails/traceRenderers/virtualizedViewManager.tsx index 17f81edd50a5d4..2d68d585ad2dcd 100644 --- a/static/app/views/performance/newTraceDetails/traceRenderers/virtualizedViewManager.tsx +++ b/static/app/views/performance/newTraceDetails/traceRenderers/virtualizedViewManager.tsx @@ -9,7 +9,6 @@ import { cancelAnimationTimeout, requestAnimationTimeout, } from 'sentry/utils/profiling/hooks/useVirtualizedTree/virtualizedTreeUtils'; -import {isEAPError} from 'sentry/views/performance/newTraceDetails/traceGuards'; import {TraceTree} from 'sentry/views/performance/newTraceDetails/traceModels/traceTree'; import type {BaseNode} from 'sentry/views/performance/newTraceDetails/traceModels/traceTreeNode/baseNode'; import {TraceRowWidthMeasurer} from 'sentry/views/performance/newTraceDetails/traceRenderers/traceRowWidthMeasurer'; @@ -1715,7 +1714,7 @@ function getIconTimestamps( } for (const err of node.errors) { - const timestamp = isEAPError(err) ? err.start_timestamp : err.timestamp; + const timestamp = 'start_timestamp' in err ? err.start_timestamp : err.timestamp; if (typeof timestamp === 'number') { min_icon_timestamp = Math.min(min_icon_timestamp, timestamp * 1e3 - icon_width); max_icon_timestamp = Math.max(max_icon_timestamp, timestamp * 1e3 + icon_width); diff --git a/static/app/views/performance/newTraceDetails/traceRow/traceIcons.tsx b/static/app/views/performance/newTraceDetails/traceRow/traceIcons.tsx index a7b710898e0db8..16feb7d15372d5 100644 --- a/static/app/views/performance/newTraceDetails/traceRow/traceIcons.tsx +++ b/static/app/views/performance/newTraceDetails/traceRow/traceIcons.tsx @@ -1,7 +1,6 @@ import {Fragment, useMemo} from 'react'; import clamp from 'lodash/clamp'; -import {isEAPError} from 'sentry/views/performance/newTraceDetails/traceGuards'; import {TraceIcons} from 'sentry/views/performance/newTraceDetails/traceIcons'; import type {BaseNode} from 'sentry/views/performance/newTraceDetails/traceModels/traceTreeNode/baseNode'; import type {VirtualizedViewManager} from 'sentry/views/performance/newTraceDetails/traceRenderers/virtualizedViewManager'; @@ -24,7 +23,8 @@ export function TraceErrorIcons(props: ErrorIconsProps) { return ( {errors.map((error, i) => { - const timestamp = isEAPError(error) ? error.start_timestamp : error.timestamp; + const timestamp = + 'start_timestamp' in error ? error.start_timestamp : error.timestamp; // Clamp the error timestamp to the span's timestamp const left = props.manager.computeRelativeLeftPositionFromOrigin( clamp( From e9c269726377a39fe95fd1fb119d3578445f9bcd Mon Sep 17 00:00:00 2001 From: Abdullah Khan Date: Sat, 6 Dec 2025 19:36:02 -0500 Subject: [PATCH 2/2] feat(trace-tree-node): Fixing small bug --- .../performance/newTraceDetails/traceRow/traceCollapsedRow.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/static/app/views/performance/newTraceDetails/traceRow/traceCollapsedRow.tsx b/static/app/views/performance/newTraceDetails/traceRow/traceCollapsedRow.tsx index cd2bbfbd4d59ed..26ef3192801bd0 100644 --- a/static/app/views/performance/newTraceDetails/traceRow/traceCollapsedRow.tsx +++ b/static/app/views/performance/newTraceDetails/traceRow/traceCollapsedRow.tsx @@ -3,6 +3,7 @@ import {useMemo} from 'react'; import {t} from 'sentry/locale'; import { isCollapsedNode, + isEAPError, isTraceErrorNode, } from 'sentry/views/performance/newTraceDetails/traceGuards'; import type {BaseNode} from 'sentry/views/performance/newTraceDetails/traceModels/traceTreeNode/baseNode'; @@ -25,7 +26,7 @@ export function TraceCollapsedRow(props: TraceRowProps) { seen.add(c); - if (isTraceErrorNode(c)) { + if (isTraceErrorNode(c) || isEAPError(c.value)) { childStatistics.issues++; } else { childStatistics.events++;