diff --git a/static/app/views/performance/newTraceDetails/traceModels/traceTree.spec.tsx b/static/app/views/performance/newTraceDetails/traceModels/traceTree.spec.tsx index f1abe0b0a5f121..1d523573d29264 100644 --- a/static/app/views/performance/newTraceDetails/traceModels/traceTree.spec.tsx +++ b/static/app/views/performance/newTraceDetails/traceModels/traceTree.spec.tsx @@ -1383,7 +1383,7 @@ describe('TraceTree', () => { describe('DirectVisibleChildren', () => { it('returns children for transaction', () => { const tree = TraceTree.FromTrace(trace, traceOptions); - expect(tree.root.children[0]!.directChildren).toEqual( + expect(tree.root.children[0]!.directVisibleChildren).toEqual( tree.root.children[0]!.children ); }); @@ -1404,7 +1404,9 @@ describe('TraceTree', () => { ) as ParentAutogroupNode; expect(parentAutogroup).not.toBeNull(); - expect(parentAutogroup.directChildren[0]).toBe(parentAutogroup.tail.children[0]); + expect(parentAutogroup.directVisibleChildren[0]).toBe( + parentAutogroup.tail.children[0] + ); }); it('returns head for expanded parent autogroup', async () => { const tree = TraceTree.FromTrace(trace, traceOptions); @@ -1423,7 +1425,7 @@ describe('TraceTree', () => { parentAutogroup.expand(true, tree); - expect(parentAutogroup.directChildren[0]).toBe(parentAutogroup.head); + expect(parentAutogroup.directVisibleChildren[0]).toBe(parentAutogroup.head); }); }); diff --git a/static/app/views/performance/newTraceDetails/traceModels/traceTree.tsx b/static/app/views/performance/newTraceDetails/traceModels/traceTree.tsx index 1641238e4fcce8..2dc8c4470451f1 100644 --- a/static/app/views/performance/newTraceDetails/traceModels/traceTree.tsx +++ b/static/app/views/performance/newTraceDetails/traceModels/traceTree.tsx @@ -528,7 +528,8 @@ export class TraceTree extends TraceTreeEventDispatcher { c.parent && c.op === 'pageload' && c.parent.op === 'http.server' && - c.parent.directChildren.filter(child => child.op === 'pageload').length === 1 + c.parent.directVisibleChildren.filter(child => child.op === 'pageload').length === + 1 ) { // // The swap can occur at a later point when new transactions are fetched, // // which means we need to invalidate the tree and re-render the UI. @@ -841,7 +842,7 @@ export class TraceTree extends TraceTreeEventDispatcher { throw new Error('Parent node is missing, this should be unreachable code'); } - const children = node.parent.directChildren; + const children = node.parent.directVisibleChildren; const index = children.indexOf(node); if (index === -1) { throw new Error('Node is not a child of its parent'); diff --git a/static/app/views/performance/newTraceDetails/traceModels/traceTreeNode/baseNode.spec.tsx b/static/app/views/performance/newTraceDetails/traceModels/traceTreeNode/baseNode.spec.tsx index 9031e9a5ec7a96..aea7e0a1761ea0 100644 --- a/static/app/views/performance/newTraceDetails/traceModels/traceTreeNode/baseNode.spec.tsx +++ b/static/app/views/performance/newTraceDetails/traceModels/traceTreeNode/baseNode.spec.tsx @@ -16,6 +16,10 @@ import type {TraceRowProps} from 'sentry/views/performance/newTraceDetails/trace import {BaseNode, type TraceTreeNodeExtra} from './baseNode'; class TestNode extends BaseNode { + get id(): string { + return (this.value as any).event_id; + } + get type(): TraceTree.NodeType { return 'test' as TraceTree.NodeType; } @@ -571,7 +575,7 @@ describe('BaseNode', () => { parent.children = [child1, child2]; - expect(parent.directChildren).toEqual([child1, child2]); + expect(parent.directVisibleChildren).toEqual([child1, child2]); }); it('should return visible children when expanded', () => { @@ -710,7 +714,6 @@ describe('BaseNode', () => { const result = await node.fetchChildren(false, {} as TraceTree, { api: {} as any, - preferences: {} as any, }); expect(result).toBeNull(); diff --git a/static/app/views/performance/newTraceDetails/traceModels/traceTreeNode/baseNode.tsx b/static/app/views/performance/newTraceDetails/traceModels/traceTreeNode/baseNode.tsx index adbbc6858dad39..af959464a8df1a 100644 --- a/static/app/views/performance/newTraceDetails/traceModels/traceTreeNode/baseNode.tsx +++ b/static/app/views/performance/newTraceDetails/traceModels/traceTreeNode/baseNode.tsx @@ -182,10 +182,6 @@ export abstract class BaseNode= 0; i--) { - queue.push(this.directChildren[i]!); + if (this.directVisibleChildren.length > 0) { + for (let i = this.directVisibleChildren.length - 1; i >= 0; i--) { + queue.push(this.directVisibleChildren[i]!); } } @@ -273,9 +269,9 @@ export abstract class BaseNode 0) { - for (let i = node.directChildren.length - 1; i >= 0; i--) { - queue.push(node.directChildren[i]!); + if (node.directVisibleChildren.length > 0) { + for (let i = node.directVisibleChildren.length - 1; i >= 0; i--) { + queue.push(node.directVisibleChildren[i]!); } } } @@ -283,7 +279,11 @@ export abstract class BaseNode { const child = new EapSpanNode(parent, childValue, extra); parent.children = [child]; - expect(parent.directChildren).toEqual([child]); + expect(parent.directVisibleChildren).toEqual([child]); }); it('should filter directChildren for collapsed EAP transactions', () => { @@ -432,7 +432,7 @@ describe('EapSpanNode', () => { transaction.expanded = false; // Should only return child transactions when collapsed - expect(transaction.directChildren).toEqual([childTransaction]); + expect(transaction.directVisibleChildren).toEqual([childTransaction]); }); it('should return all children for expanded EAP transactions', () => { @@ -457,7 +457,7 @@ describe('EapSpanNode', () => { transaction.children = [childTransaction, childSpan]; transaction.expanded = true; - expect(transaction.directChildren).toEqual([childTransaction, childSpan]); + expect(transaction.directVisibleChildren).toEqual([childTransaction, childSpan]); }); }); @@ -894,7 +894,7 @@ describe('EapSpanNode', () => { const node = new EapSpanNode(null, value, extra); expect(node.children).toEqual([]); - expect(node.directChildren).toEqual([]); + expect(node.directVisibleChildren).toEqual([]); expect(node.visibleChildren).toEqual([]); }); }); diff --git a/static/app/views/performance/newTraceDetails/traceModels/traceTreeNode/eapSpanNode.tsx b/static/app/views/performance/newTraceDetails/traceModels/traceTreeNode/eapSpanNode.tsx index 48a9c75ac5d0d4..d6ea7ccb534eff 100644 --- a/static/app/views/performance/newTraceDetails/traceModels/traceTreeNode/eapSpanNode.tsx +++ b/static/app/views/performance/newTraceDetails/traceModels/traceTreeNode/eapSpanNode.tsx @@ -81,6 +81,10 @@ export class EapSpanNode extends BaseNode { } } + get id(): string { + return this.value.event_id; + } + get type(): TraceTree.NodeType { return 'span'; } @@ -106,7 +110,7 @@ export class EapSpanNode extends BaseNode { }; } - get directChildren(): Array> { + get directVisibleChildren(): Array> { if (isEAPTransaction(this.value) && !this.expanded) { // For collapsed eap-transactions we still render the embedded eap-transactions as visible children. // Mimics the behavior of non-eap traces, enabling a less noisy/summarized view of the trace @@ -116,36 +120,6 @@ export class EapSpanNode extends BaseNode { return this.children; } - get visibleChildren(): Array> { - const queue: BaseNode[] = []; - const visibleChildren: BaseNode[] = []; - - if (this.expanded || isEAPTransaction(this.value)) { - const children = this.directChildren; - - for (let i = children.length - 1; i >= 0; i--) { - queue.push(children[i]!); - } - } - - while (queue.length > 0) { - const node = queue.pop()!; - - visibleChildren.push(node); - - // iterate in reverse to ensure nodes are processed in order - if (node.expanded || isEAPTransaction(node.value)) { - const children = node.directChildren; - - for (let i = children.length - 1; i >= 0; i--) { - queue.push(children[i]!); - } - } - } - - return visibleChildren; - } - private _reparentSSRUnderBrowserRequestSpan(node: BaseNode) { const serverRequestHandler = node.parent?.children.find(n => n.op === 'http.server'); diff --git a/static/app/views/performance/newTraceDetails/traceModels/traceTreeNode/errorNode.tsx b/static/app/views/performance/newTraceDetails/traceModels/traceTreeNode/errorNode.tsx index 81eb0eed366910..fa4fcc34c3b115 100644 --- a/static/app/views/performance/newTraceDetails/traceModels/traceTreeNode/errorNode.tsx +++ b/static/app/views/performance/newTraceDetails/traceModels/traceTreeNode/errorNode.tsx @@ -37,6 +37,10 @@ export class ErrorNode extends BaseNode { this.parent?.children.push(this); } + get id(): string { + return this.value.event_id; + } + get type(): TraceTree.NodeType { return 'error'; } diff --git a/static/app/views/performance/newTraceDetails/traceModels/traceTreeNode/noInstrumentationNode.spec.tsx b/static/app/views/performance/newTraceDetails/traceModels/traceTreeNode/noInstrumentationNode.spec.tsx index fee45af21be448..8ada0e1dfed60c 100644 --- a/static/app/views/performance/newTraceDetails/traceModels/traceTreeNode/noInstrumentationNode.spec.tsx +++ b/static/app/views/performance/newTraceDetails/traceModels/traceTreeNode/noInstrumentationNode.spec.tsx @@ -195,7 +195,6 @@ describe('NoInstrumentationNode', () => { it('should include transaction ID in path when closest transaction parent found', () => { const extra = createMockExtra(); - const mockFn = jest.fn(); const transactionValue = makeTransaction({ event_id: 'transaction-id', 'transaction.op': 'navigation', @@ -208,13 +207,7 @@ describe('NoInstrumentationNode', () => { const nextSpanValue = makeSpan({span_id: 'next'}); const missingInstrValue = createMissingInstrumentationSpan(); - const transactionNode = new TransactionNode( - null, - transactionValue, - extra, - mockFn, - mockFn - ); + const transactionNode = new TransactionNode(null, transactionValue, extra); const spanNode = new SpanNode(transactionNode, spanValue, extra); const previousNode = new SpanNode(spanNode, previousSpanValue, extra); const nextNode = new SpanNode(spanNode, nextSpanValue, extra); @@ -243,18 +236,11 @@ describe('NoInstrumentationNode', () => { const span2Value = makeSpan({span_id: 'span2', op: 'http.request'}); const span3Value = makeSpan({span_id: 'span3', op: 'cache.get'}); - const mockFn = jest.fn(); const previousSpanValue = makeSpan({span_id: 'previous'}); const nextSpanValue = makeSpan({span_id: 'next'}); const missingInstrValue = createMissingInstrumentationSpan(); - const transactionNode = new TransactionNode( - null, - transactionValue, - extra, - mockFn, - mockFn - ); + const transactionNode = new TransactionNode(null, transactionValue, extra); const span1Node = new SpanNode(transactionNode, span1Value, extra); const span2Node = new SpanNode(span1Node, span2Value, extra); const span3Node = new SpanNode(span2Node, span3Value, extra); diff --git a/static/app/views/performance/newTraceDetails/traceModels/traceTreeNode/parentAutogroupNode.spec.tsx b/static/app/views/performance/newTraceDetails/traceModels/traceTreeNode/parentAutogroupNode.spec.tsx index 5d42484aa6fb65..b6b9cf64e504be 100644 --- a/static/app/views/performance/newTraceDetails/traceModels/traceTreeNode/parentAutogroupNode.spec.tsx +++ b/static/app/views/performance/newTraceDetails/traceModels/traceTreeNode/parentAutogroupNode.spec.tsx @@ -155,25 +155,6 @@ describe('ParentAutogroupNode', () => { expect(node.id).toBe('tail-span-id'); }); - it('should return undefined when both head and tail ids are undefined', () => { - const extra = createMockExtra(); - const autogroupValue = makeParentAutogroup({}); - const headSpanValue = makeEAPSpan({event_id: undefined}); - const tailSpanValue = makeEAPSpan({event_id: undefined}); - - const headNode = new EapSpanNode(null, headSpanValue, extra); - const tailNode = new EapSpanNode(null, tailSpanValue, extra); - const node = new ParentAutogroupNode( - null, - autogroupValue, - extra, - headNode, - tailNode - ); - - expect(node.id).toBeUndefined(); - }); - it('should return correct drawerTabsTitle', () => { const extra = createMockExtra(); const autogroupValue = makeParentAutogroup({ @@ -283,7 +264,7 @@ describe('ParentAutogroupNode', () => { node.expanded = true; - expect(node.directChildren).toEqual([headNode]); + expect(node.directVisibleChildren).toEqual([headNode]); }); it('should return tail children as directChildren when collapsed', () => { @@ -308,7 +289,7 @@ describe('ParentAutogroupNode', () => { node.expanded = false; - expect(node.directChildren).toEqual([childNode]); + expect(node.directVisibleChildren).toEqual([childNode]); }); it('should compute autogroupedSegments correctly with node chain', () => { @@ -621,14 +602,7 @@ describe('ParentAutogroupNode', () => { const headSpanValue = makeSpan({span_id: 'head-span-id'}); const tailSpanValue = makeSpan({span_id: 'tail-span-id'}); - const mockFn = jest.fn(); - const transactionNode = new TransactionNode( - null, - transactionValue, - extra, - mockFn, - mockFn - ); + const transactionNode = new TransactionNode(null, transactionValue, extra); const headNode = new SpanNode(transactionNode, headSpanValue, extra); const tailNode = new SpanNode(transactionNode, tailSpanValue, extra); const node = new ParentAutogroupNode( @@ -704,7 +678,6 @@ describe('ParentAutogroupNode', () => { ); expect(node.matchByPath('ag-headSpanId')).toBe(true); - expect(node.matchByPath('ag-tailSpanId')).toBe(true); expect(node.matchByPath('ag-differentId')).toBe(false); }); diff --git a/static/app/views/performance/newTraceDetails/traceModels/traceTreeNode/parentAutogroupNode.tsx b/static/app/views/performance/newTraceDetails/traceModels/traceTreeNode/parentAutogroupNode.tsx index 3d1349a4c8fc9f..43959de5953fcd 100644 --- a/static/app/views/performance/newTraceDetails/traceModels/traceTreeNode/parentAutogroupNode.tsx +++ b/static/app/views/performance/newTraceDetails/traceModels/traceTreeNode/parentAutogroupNode.tsx @@ -1,4 +1,5 @@ import type {Theme} from '@emotion/react'; +import {uuid4} from '@sentry/core'; import {t} from 'sentry/locale'; import {AutogroupNodeDetails} from 'sentry/views/performance/newTraceDetails/traceDrawer/details/autogroup'; @@ -36,8 +37,8 @@ export class ParentAutogroupNode extends BaseNode { return 'ag'; } - get id(): string | undefined { - return this.head.id ?? this.tail.id; + get id(): string { + return this.head.id ?? this.tail.id ?? uuid4(); } get autogroupedSegments(): Array<[number, number]> { @@ -106,7 +107,7 @@ export class ParentAutogroupNode extends BaseNode { }; } - get directChildren(): BaseNode[] { + get directVisibleChildren(): BaseNode[] { if (this.expanded) { return [this.head]; } @@ -114,29 +115,6 @@ export class ParentAutogroupNode extends BaseNode { return this.tail.children; } - get visibleChildren(): BaseNode[] { - const queue: BaseNode[] = []; - const visibleChildren: BaseNode[] = []; - - for (let i = this.directChildren.length - 1; i >= 0; i--) { - queue.push(this.directChildren[i]!); - } - - while (queue.length > 0) { - const node = queue.pop()!; - - visibleChildren.push(node); - - const children = node.directChildren; - - for (let i = children.length - 1; i >= 0; i--) { - queue.push(children[i]!); - } - } - - return visibleChildren; - } - getNextTraversalNodes(): BaseNode[] { return [this.head]; } @@ -145,20 +123,6 @@ export class ParentAutogroupNode extends BaseNode { return false; } - matchByPath(path: TraceTree.NodePath): boolean { - if (!path.startsWith(`${this.type}-`)) { - return false; - } - - // Extract id after the first occurrence of `${this.type}-` - const id = path.slice(this.type.length + 1); - if (!id) { - return false; - } - - return this.head.id === id || this.tail.id === id; - } - expand(expanding: boolean, tree: TraceTree): boolean { const index = tree.list.indexOf(this); diff --git a/static/app/views/performance/newTraceDetails/traceModels/traceTreeNode/rootNode.spec.tsx b/static/app/views/performance/newTraceDetails/traceModels/traceTreeNode/rootNode.spec.tsx index 309064b66883ad..3d10779dff2cb4 100644 --- a/static/app/views/performance/newTraceDetails/traceModels/traceTreeNode/rootNode.spec.tsx +++ b/static/app/views/performance/newTraceDetails/traceModels/traceTreeNode/rootNode.spec.tsx @@ -38,7 +38,7 @@ describe('RootNode', () => { const extra = createMockExtra(); const rootNode = new RootNode(null, null, extra); - expect(rootNode.pathToNode()).toStrictEqual([]); + expect(rootNode.type).toBe('root'); }); }); diff --git a/static/app/views/performance/newTraceDetails/traceModels/traceTreeNode/rootNode.tsx b/static/app/views/performance/newTraceDetails/traceModels/traceTreeNode/rootNode.tsx index e6e3d15a31eb2a..e481c51badfddb 100644 --- a/static/app/views/performance/newTraceDetails/traceModels/traceTreeNode/rootNode.tsx +++ b/static/app/views/performance/newTraceDetails/traceModels/traceTreeNode/rootNode.tsx @@ -1,3 +1,5 @@ +import {uuid4} from '@sentry/core'; + import {t} from 'sentry/locale'; import type {TraceTreeNodeDetailsProps} from 'sentry/views/performance/newTraceDetails/traceDrawer/tabs/traceTreeNodeDetails'; import type {TraceTree} from 'sentry/views/performance/newTraceDetails/traceModels/traceTree'; @@ -9,6 +11,10 @@ import {BaseNode} from './baseNode'; export class RootNode extends BaseNode { canShowDetails = false; + get id(): string { + return uuid4(); + } + get type(): TraceTree.NodeType { return 'root'; } @@ -25,10 +31,6 @@ export class RootNode extends BaseNode { return 'virtual root'; } - pathToNode(): TraceTree.NodePath[] { - return []; - } - analyticsName(): string { return 'root'; } @@ -39,10 +41,6 @@ export class RootNode extends BaseNode { return null; } - matchByPath(_path: TraceTree.NodePath): boolean { - return false; - } - renderDetails>( _props: TraceTreeNodeDetailsProps ): React.ReactNode { diff --git a/static/app/views/performance/newTraceDetails/traceModels/traceTreeNode/siblingAutogroupNode.spec.tsx b/static/app/views/performance/newTraceDetails/traceModels/traceTreeNode/siblingAutogroupNode.spec.tsx index 22ab1a18e43c53..30eab51e0a528d 100644 --- a/static/app/views/performance/newTraceDetails/traceModels/traceTreeNode/siblingAutogroupNode.spec.tsx +++ b/static/app/views/performance/newTraceDetails/traceModels/traceTreeNode/siblingAutogroupNode.spec.tsx @@ -93,15 +93,6 @@ describe('SiblingAutogroupNode', () => { expect(node.id).toBe('child-1'); }); - it('should return undefined when no children', () => { - const extra = createMockExtra(); - const autogroupValue = makeSiblingAutogroup({}); - const node = new SiblingAutogroupNode(null, autogroupValue, extra); - - expect(node.children).toEqual([]); - expect(node.id).toBeUndefined(); - }); - it('should return correct op from value', () => { const extra = createMockExtra(); const autogroupValue = makeSiblingAutogroup({ @@ -241,14 +232,7 @@ describe('SiblingAutogroupNode', () => { const autogroupValue = makeSiblingAutogroup({}); const childSpanValue = makeSpan({span_id: 'child-span-id'}); - const mockFn = jest.fn(); - const transactionNode = new TransactionNode( - null, - transactionValue, - extra, - mockFn, - mockFn - ); + const transactionNode = new TransactionNode(null, transactionValue, extra); const childNode = new SpanNode(transactionNode, childSpanValue, extra); const node = new SiblingAutogroupNode(transactionNode, autogroupValue, extra); @@ -259,16 +243,6 @@ describe('SiblingAutogroupNode', () => { expect(path[0]).toBe('ag-child-span-id'); expect(path[1]).toBe('txn-transaction-id'); }); - - it('should handle pathToNode when no children exist', () => { - const extra = createMockExtra(); - const autogroupValue = makeSiblingAutogroup({}); - const node = new SiblingAutogroupNode(null, autogroupValue, extra); - - const path = node.pathToNode(); - expect(path).toHaveLength(1); - expect(path[0]).toBe('ag-undefined'); // Should handle undefined id - }); }); describe('abstract method implementations', () => { diff --git a/static/app/views/performance/newTraceDetails/traceModels/traceTreeNode/siblingAutogroupNode.tsx b/static/app/views/performance/newTraceDetails/traceModels/traceTreeNode/siblingAutogroupNode.tsx index cf1390fc97081f..a7dd7d592041e8 100644 --- a/static/app/views/performance/newTraceDetails/traceModels/traceTreeNode/siblingAutogroupNode.tsx +++ b/static/app/views/performance/newTraceDetails/traceModels/traceTreeNode/siblingAutogroupNode.tsx @@ -1,4 +1,5 @@ import type {Theme} from '@emotion/react'; +import {uuid4} from '@sentry/core'; import {t} from 'sentry/locale'; import {AutogroupNodeDetails} from 'sentry/views/performance/newTraceDetails/traceDrawer/details/autogroup'; @@ -29,9 +30,9 @@ export class SiblingAutogroupNode extends BaseNode { return 'ag'; } - get id(): string | undefined { + get id(): string { const firstChild = this.children[0]; - return firstChild?.id; + return firstChild?.id ?? uuid4(); } get op(): string { @@ -89,20 +90,6 @@ export class SiblingAutogroupNode extends BaseNode { return false; } - matchByPath(path: TraceTree.NodePath): boolean { - if (!path.startsWith(`${this.type}-`)) { - return false; - } - - // Extract id after the first occurrence of `${this.type}-` - const id = path.slice(this.type.length + 1); - if (!id) { - return false; - } - - return this.id === id; - } - matchWithFreeText(query: string): boolean { return this.op?.includes(query) || this.description?.includes(query); } diff --git a/static/app/views/performance/newTraceDetails/traceModels/traceTreeNode/traceNode.tsx b/static/app/views/performance/newTraceDetails/traceModels/traceTreeNode/traceNode.tsx index a50ddc5178ebfe..f460c374de76bd 100644 --- a/static/app/views/performance/newTraceDetails/traceModels/traceTreeNode/traceNode.tsx +++ b/static/app/views/performance/newTraceDetails/traceModels/traceTreeNode/traceNode.tsx @@ -21,6 +21,10 @@ export class TraceNode extends BaseNode { this.parent?.children.push(this); } + get id(): string { + return 'root'; + } + get type(): TraceTree.NodeType { return 'trace'; } @@ -33,10 +37,6 @@ export class TraceNode extends BaseNode { return {title: 'Trace'}; } - pathToNode(): TraceTree.NodePath[] { - return [`trace-root`]; - } - analyticsName(): string { return 'trace'; } diff --git a/static/app/views/performance/newTraceDetails/traceModels/traceTreeNode/uptimeCheckNode.tsx b/static/app/views/performance/newTraceDetails/traceModels/traceTreeNode/uptimeCheckNode.tsx index a92a4da29be2df..2e469bc6ba4d9f 100644 --- a/static/app/views/performance/newTraceDetails/traceModels/traceTreeNode/uptimeCheckNode.tsx +++ b/static/app/views/performance/newTraceDetails/traceModels/traceTreeNode/uptimeCheckNode.tsx @@ -28,6 +28,10 @@ export class UptimeCheckNode extends BaseNode { this.parent?.children.push(this); } + get id(): string { + return this.value.event_id; + } + _createTimingNodes(): UptimeCheckTimingNode[] { const uptimeCheck = this.value; const attrs = uptimeCheck.additional_attributes || {}; diff --git a/static/app/views/performance/newTraceDetails/traceModels/traceTreeNode/uptimeCheckTimingNode.tsx b/static/app/views/performance/newTraceDetails/traceModels/traceTreeNode/uptimeCheckTimingNode.tsx index d6ddfe74878e35..5c358984a8372f 100644 --- a/static/app/views/performance/newTraceDetails/traceModels/traceTreeNode/uptimeCheckTimingNode.tsx +++ b/static/app/views/performance/newTraceDetails/traceModels/traceTreeNode/uptimeCheckTimingNode.tsx @@ -15,6 +15,10 @@ export class UptimeCheckTimingNode extends BaseNode return 'uptime-check-timing'; } + get id(): string { + return this.value.event_id; + } + get drawerTabsTitle(): string { return this.value.description || this.value.op; }