Browse Source

feat(span-tree): Instrument toggle interactions on span tree (#41975)

Ash Anand 2 years ago
parent
commit
755e3b8987

+ 2 - 0
static/app/components/events/interfaces/spans/spanBar.tsx

@@ -52,6 +52,7 @@ import {
 } from 'sentry/utils/performance/quickTrace/quickTraceContext';
 } from 'sentry/utils/performance/quickTrace/quickTraceContext';
 import {QuickTraceEvent, TraceError} from 'sentry/utils/performance/quickTrace/types';
 import {QuickTraceEvent, TraceError} from 'sentry/utils/performance/quickTrace/types';
 import {isTraceFull} from 'sentry/utils/performance/quickTrace/utils';
 import {isTraceFull} from 'sentry/utils/performance/quickTrace/utils';
+import {PerformanceInteraction} from 'sentry/utils/performanceForSentry';
 
 
 import * as AnchorLinkManager from './anchorLinkManager';
 import * as AnchorLinkManager from './anchorLinkManager';
 import {
 import {
@@ -461,6 +462,7 @@ class SpanBar extends Component<SpanBarProps, SpanBarState> {
               return;
               return;
             }
             }
 
 
+            PerformanceInteraction.startInteraction('SpanTreeToggle', 1000 * 10);
             this.props.toggleSpanTree();
             this.props.toggleSpanTree();
           }}
           }}
         >
         >

+ 8 - 1
static/app/components/events/interfaces/spans/spanGroupBar.tsx

@@ -24,6 +24,7 @@ import {
 import {toPercent} from 'sentry/components/performance/waterfall/utils';
 import {toPercent} from 'sentry/components/performance/waterfall/utils';
 import {EventTransaction} from 'sentry/types/event';
 import {EventTransaction} from 'sentry/types/event';
 import {defined} from 'sentry/utils';
 import {defined} from 'sentry/utils';
+import {PerformanceInteraction} from 'sentry/utils/performanceForSentry';
 
 
 import * as AnchorLinkManager from './anchorLinkManager';
 import * as AnchorLinkManager from './anchorLinkManager';
 import * as DividerHandlerManager from './dividerHandlerManager';
 import * as DividerHandlerManager from './dividerHandlerManager';
@@ -221,7 +222,13 @@ export function SpanGroupBar(props: Props) {
                         width: `calc(${toPercent(dividerPosition)} - 0.5px)`,
                         width: `calc(${toPercent(dividerPosition)} - 0.5px)`,
                         paddingTop: 0,
                         paddingTop: 0,
                       }}
                       }}
-                      onClick={() => props.toggleSpanGroup()}
+                      onClick={() => {
+                        PerformanceInteraction.startInteraction(
+                          'SpanTreeToggle',
+                          1000 * 10
+                        );
+                        props.toggleSpanGroup();
+                      }}
                       ref={spanTitleRef}
                       ref={spanTitleRef}
                     >
                     >
                       <RowTitleContainer ref={generateContentSpanBarRef()}>
                       <RowTitleContainer ref={generateContentSpanBarRef()}>

+ 36 - 32
static/app/components/events/interfaces/spans/spanTree.tsx

@@ -9,6 +9,7 @@ import {pickBarColor} from 'sentry/components/performance/waterfall/utils';
 import {t, tct} from 'sentry/locale';
 import {t, tct} from 'sentry/locale';
 import {Organization} from 'sentry/types';
 import {Organization} from 'sentry/types';
 import trackAdvancedAnalyticsEvent from 'sentry/utils/analytics/trackAdvancedAnalyticsEvent';
 import trackAdvancedAnalyticsEvent from 'sentry/utils/analytics/trackAdvancedAnalyticsEvent';
+import {CustomerProfiler} from 'sentry/utils/performanceForSentry';
 
 
 import {DragManagerChildrenProps} from './dragManager';
 import {DragManagerChildrenProps} from './dragManager';
 import {ScrollbarManagerChildrenProps, withScrollbarManager} from './scrollbarManager';
 import {ScrollbarManagerChildrenProps, withScrollbarManager} from './scrollbarManager';
@@ -349,38 +350,41 @@ class SpanTree extends Component<PropType> {
         }
         }
 
 
         acc.spanTree.push(
         acc.spanTree.push(
-          <SpanBar
-            key={key}
-            organization={organization}
-            event={waterfallModel.event}
-            spanBarColor={spanBarColor}
-            spanBarType={spanBarType}
-            span={span}
-            showSpanTree={!waterfallModel.hiddenSpanSubTrees.has(getSpanID(span))}
-            numOfSpanChildren={numOfSpanChildren}
-            trace={waterfallModel.parsedTrace}
-            generateBounds={generateBounds}
-            toggleSpanTree={this.toggleSpanTree(getSpanID(span))}
-            treeDepth={treeDepth}
-            continuingTreeDepths={continuingTreeDepths}
-            spanNumber={spanNumber}
-            isLast={isLast}
-            isRoot={isRoot}
-            showEmbeddedChildren={payload.showEmbeddedChildren}
-            toggleEmbeddedChildren={payload.toggleEmbeddedChildren}
-            toggleSiblingSpanGroup={toggleSiblingSpanGroup}
-            fetchEmbeddedChildrenState={payload.fetchEmbeddedChildrenState}
-            toggleSpanGroup={toggleSpanGroup}
-            numOfSpans={numOfSpans}
-            groupType={groupType}
-            groupOccurrence={payload.groupOccurrence}
-            isEmbeddedTransactionTimeAdjusted={payload.isEmbeddedTransactionTimeAdjusted}
-            onWheel={onWheel}
-            generateContentSpanBarRef={generateContentSpanBarRef}
-            markSpanOutOfView={markSpanOutOfView}
-            markSpanInView={markSpanInView}
-            storeSpanBar={storeSpanBar}
-          />
+          <CustomerProfiler id="SpanBar" key={key}>
+            <SpanBar
+              organization={organization}
+              event={waterfallModel.event}
+              spanBarColor={spanBarColor}
+              spanBarType={spanBarType}
+              span={span}
+              showSpanTree={!waterfallModel.hiddenSpanSubTrees.has(getSpanID(span))}
+              numOfSpanChildren={numOfSpanChildren}
+              trace={waterfallModel.parsedTrace}
+              generateBounds={generateBounds}
+              toggleSpanTree={this.toggleSpanTree(getSpanID(span))}
+              treeDepth={treeDepth}
+              continuingTreeDepths={continuingTreeDepths}
+              spanNumber={spanNumber}
+              isLast={isLast}
+              isRoot={isRoot}
+              showEmbeddedChildren={payload.showEmbeddedChildren}
+              toggleEmbeddedChildren={payload.toggleEmbeddedChildren}
+              toggleSiblingSpanGroup={toggleSiblingSpanGroup}
+              fetchEmbeddedChildrenState={payload.fetchEmbeddedChildrenState}
+              toggleSpanGroup={toggleSpanGroup}
+              numOfSpans={numOfSpans}
+              groupType={groupType}
+              groupOccurrence={payload.groupOccurrence}
+              isEmbeddedTransactionTimeAdjusted={
+                payload.isEmbeddedTransactionTimeAdjusted
+              }
+              onWheel={onWheel}
+              generateContentSpanBarRef={generateContentSpanBarRef}
+              markSpanOutOfView={markSpanOutOfView}
+              markSpanInView={markSpanInView}
+              storeSpanBar={storeSpanBar}
+            />
+          </CustomerProfiler>
         );
         );
 
 
         // If this is an embedded span tree, we will manually mark these spans as in view.
         // If this is an embedded span tree, we will manually mark these spans as in view.

+ 12 - 15
static/app/components/events/interfaces/spans/traceView.tsx

@@ -4,7 +4,6 @@ import {Observer} from 'mobx-react';
 import EmptyStateWarning from 'sentry/components/emptyStateWarning';
 import EmptyStateWarning from 'sentry/components/emptyStateWarning';
 import {t} from 'sentry/locale';
 import {t} from 'sentry/locale';
 import {Organization} from 'sentry/types';
 import {Organization} from 'sentry/types';
-import {CustomerProfiler} from 'sentry/utils/performanceForSentry';
 
 
 import * as CursorGuideHandler from './cursorGuideHandler';
 import * as CursorGuideHandler from './cursorGuideHandler';
 import * as DividerHandlerManager from './dividerHandlerManager';
 import * as DividerHandlerManager from './dividerHandlerManager';
@@ -91,20 +90,18 @@ class TraceView extends PureComponent<Props> {
                             {this.renderHeader(dragProps)}
                             {this.renderHeader(dragProps)}
                             <Observer>
                             <Observer>
                               {() => (
                               {() => (
-                                <CustomerProfiler id="SpanTree">
-                                  <SpanTree
-                                    traceViewRef={this.traceViewRef}
-                                    dragProps={dragProps}
-                                    organization={organization}
-                                    waterfallModel={waterfallModel}
-                                    filterSpans={waterfallModel.filterSpans}
-                                    spans={waterfallModel.getWaterfall({
-                                      viewStart: dragProps.viewWindowStart,
-                                      viewEnd: dragProps.viewWindowEnd,
-                                    })}
-                                    focusedSpanIds={waterfallModel.focusedSpanIds}
-                                  />
-                                </CustomerProfiler>
+                                <SpanTree
+                                  traceViewRef={this.traceViewRef}
+                                  dragProps={dragProps}
+                                  organization={organization}
+                                  waterfallModel={waterfallModel}
+                                  filterSpans={waterfallModel.filterSpans}
+                                  spans={waterfallModel.getWaterfall({
+                                    viewStart: dragProps.viewWindowStart,
+                                    viewEnd: dragProps.viewWindowEnd,
+                                  })}
+                                  focusedSpanIds={waterfallModel.focusedSpanIds}
+                                />
                               )}
                               )}
                             </Observer>
                             </Observer>
                           </ScrollbarManager.Provider>
                           </ScrollbarManager.Provider>