Browse Source

ref(mep): Add analytics for metrics decision (#40888)

This will emit analytic events so we can track users potentially seeing
processed events or not.
Kev 2 years ago
parent
commit
61d8dd0d2d

+ 6 - 0
static/app/utils/analytics/performanceAnalyticsEvents.tsx

@@ -53,6 +53,11 @@ export type PerformanceEventParameters = {
     from_widget?: string;
     to_widget?: string;
   };
+  'performance_views.mep.metrics_outcome': {
+    fallback_from_null: boolean;
+    fallback_from_unparam: boolean;
+    is_on_metrics: boolean;
+  };
   'performance_views.overview.cellaction': {action?: string};
   'performance_views.overview.navigate.summary': {
     project_platforms: string;
@@ -224,4 +229,5 @@ export const performanceEventMap: Record<PerformanceEventKey, string | null> = {
   'performance_views.filter_dropdown.selection': 'Performance Views: Filter Dropdown',
   'performance_views.relative_breakdown.selection':
     'Performance Views: Select Relative Breakdown',
+  'performance_views.mep.metrics_outcome': 'Performance Views: Metrics Outcome',
 };

+ 62 - 23
static/app/utils/performance/contexts/metricsCardinality.tsx

@@ -1,7 +1,8 @@
-import {Fragment, ReactNode} from 'react';
+import {ComponentProps, Fragment, ReactNode, useEffect} from 'react';
 import {Location} from 'history';
 
 import {Organization} from 'sentry/types';
+import trackAdvancedAnalyticsEvent from 'sentry/utils/analytics/trackAdvancedAnalyticsEvent';
 import {parsePeriodToHours} from 'sentry/utils/dates';
 import EventView from 'sentry/utils/discover/eventView';
 import {canUseMetricsData} from 'sentry/utils/performance/contexts/metricsEnhancedSetting';
@@ -44,6 +45,7 @@ export const MetricsCardinalityProvider = (props: {
   children: ReactNode;
   location: Location;
   organization: Organization;
+  sendOutcomeAnalytics?: boolean;
 }) => {
   const isUsingMetrics = canUseMetricsData(props.organization);
 
@@ -76,28 +78,35 @@ export const MetricsCardinalityProvider = (props: {
       <MetricsCompatibilityQuery eventView={_eventView} {...baseDiscoverProps}>
         {compatabilityResult => (
           <MetricsCompatibilitySumsQuery eventView={_eventView} {...baseDiscoverProps}>
-            {sumsResult => (
-              <_Provider
-                value={{
-                  isLoading: compatabilityResult.isLoading || sumsResult.isLoading,
-                  outcome:
-                    compatabilityResult.isLoading || sumsResult.isLoading
-                      ? undefined
-                      : getMetricsOutcome(
-                          compatabilityResult.tableData && sumsResult.tableData
-                            ? {
-                                ...compatabilityResult.tableData,
-                                ...sumsResult.tableData,
-                              }
-                            : null,
-                          !!compatabilityResult.error && !!sumsResult.error,
-                          props.organization
-                        ),
-                }}
-              >
-                {props.children}
-              </_Provider>
-            )}
+            {sumsResult => {
+              const isLoading = compatabilityResult.isLoading || sumsResult.isLoading;
+              const outcome =
+                compatabilityResult.isLoading || sumsResult.isLoading
+                  ? undefined
+                  : getMetricsOutcome(
+                      compatabilityResult.tableData && sumsResult.tableData
+                        ? {
+                            ...compatabilityResult.tableData,
+                            ...sumsResult.tableData,
+                          }
+                        : null,
+                      !!compatabilityResult.error && !!sumsResult.error,
+                      props.organization
+                    );
+
+              return (
+                <Provider
+                  sendOutcomeAnalytics={props.sendOutcomeAnalytics}
+                  organization={props.organization}
+                  value={{
+                    isLoading,
+                    outcome,
+                  }}
+                >
+                  {props.children}
+                </Provider>
+              );
+            }}
           </MetricsCompatibilitySumsQuery>
         )}
       </MetricsCompatibilityQuery>
@@ -105,6 +114,36 @@ export const MetricsCardinalityProvider = (props: {
   );
 };
 
+const Provider = (
+  props: ComponentProps<typeof _Provider> & {
+    organization: Organization;
+    sendOutcomeAnalytics?: boolean;
+  }
+) => {
+  const fallbackFromNull = props.value.outcome?.shouldWarnIncompatibleSDK ?? false;
+  const fallbackFromUnparam =
+    props.value.outcome?.shouldNotifyUnnamedTransactions ?? false;
+  const isOnMetrics = !props.value.outcome?.forceTransactionsOnly;
+  useEffect(() => {
+    if (!props.value.isLoading && props.sendOutcomeAnalytics) {
+      trackAdvancedAnalyticsEvent('performance_views.mep.metrics_outcome', {
+        organization: props.organization,
+        is_on_metrics: isOnMetrics,
+        fallback_from_null: fallbackFromNull,
+        fallback_from_unparam: fallbackFromUnparam,
+      });
+    }
+  }, [
+    props.organization,
+    props.value.isLoading,
+    isOnMetrics,
+    fallbackFromUnparam,
+    fallbackFromNull,
+    props.sendOutcomeAnalytics,
+  ]);
+  return <_Provider {...props}>{props.children}</_Provider>;
+};
+
 export const MetricsCardinalityConsumer = _Context.Consumer;
 
 export const useMetricsCardinalityContext = _useContext;

+ 1 - 0
static/app/views/performance/landing/index.tsx

@@ -192,6 +192,7 @@ export function PerformanceLanding(props: Props) {
               <TabPanels>
                 <Item key={landingDisplay.field}>
                   <MetricsCardinalityProvider
+                    sendOutcomeAnalytics
                     organization={organization}
                     location={location}
                   >