@@ -56,7 +56,8 @@ export const getRepresentativeTraceEvent = (
5656 return { type : 'uptime_check' , event : traceChild . value } ;
5757 }
5858
59- let rootEvent : TraceTree . TraceEvent | null = null ;
59+ let preferredRootEvent : TraceTree . TraceEvent | null = null ;
60+ let firstRootEvent : TraceTree . TraceEvent | null = null ;
6061 let candidateEvent : TraceTree . TraceEvent | null = null ;
6162 let firstEvent : TraceTree . TraceEvent | null = null ;
6263
@@ -66,26 +67,22 @@ export const getRepresentativeTraceEvent = (
6667 : [ ...traceNode . value . transactions , ...traceNode . value . orphan_errors ] ;
6768 for ( const event of events ) {
6869 if ( isRootEvent ( event ) ) {
69- rootEvent = event ;
70+ if ( ! firstRootEvent ) {
71+ firstRootEvent = event ;
72+ }
7073
71- if ( ! isEAP ) {
72- // For non-EAP traces, we return the first root event.
74+ if ( hasPreferredOp ( event ) ) {
75+ preferredRootEvent = event ;
7376 break ;
7477 }
75-
78+ // Otherwise we keep looking for a root eap transaction. If we don't find one, we use other roots, like standalone spans.
7679 continue ;
7780 } else if (
7881 // If we haven't found a root transaction, but we found a candidate transaction
7982 // with an op that we care about, we can use it for the title. We keep looking for
8083 // a root.
8184 ! candidateEvent &&
82- CANDIDATE_TRACE_TITLE_OPS . includes (
83- 'transaction.op' in event
84- ? event [ 'transaction.op' ]
85- : 'op' in event
86- ? event . op
87- : ''
88- )
85+ hasPreferredOp ( event )
8986 ) {
9087 candidateEvent = event ;
9188 continue ;
@@ -97,7 +94,7 @@ export const getRepresentativeTraceEvent = (
9794 }
9895
9996 return {
100- event : rootEvent ?? candidateEvent ?? firstEvent ,
97+ event : preferredRootEvent ?? firstRootEvent ?? candidateEvent ?? firstEvent ,
10198 type : 'span' ,
10299 } ;
103100} ;
@@ -113,3 +110,18 @@ export const isValidEventUUID = (id: string): boolean => {
113110 / ^ [ 0 - 9 a - f ] { 8 } [ 0 - 9 a - f ] { 4 } [ 1 - 5 ] [ 0 - 9 a - f ] { 3 } [ 8 9 a b ] [ 0 - 9 a - f ] { 3 } [ 0 - 9 a - f ] { 12 } $ / i;
114111 return uuidRegex . test ( id ) ;
115112} ;
113+
114+ /**
115+ * Prefer "special" root events over generic root events when generating a title
116+ * for the waterfall view. Picking these improves contextual navigation for linked
117+ * traces, resulting in more meaningful waterfall titles.
118+ */
119+ function hasPreferredOp ( event : TraceTree . TraceEvent ) : boolean {
120+ const op =
121+ 'op' in event
122+ ? event . op
123+ : 'transaction.op' in event
124+ ? event [ 'transaction.op' ]
125+ : undefined ;
126+ return ! ! op && CANDIDATE_TRACE_TITLE_OPS . includes ( op ) ;
127+ }
0 commit comments