Browse Source

ref(starifish): require referrer in discover hooks (#70540)

Every discover query should have a referrer
Dominik Buszowiecki 10 months ago
parent
commit
f567c88d4f

+ 19 - 17
static/app/components/events/eventStatisticalDetector/aggregateSpanDiff.tsx

@@ -117,23 +117,25 @@ function AggregateSpanDiff({event, project}: AggregateSpanDiffProps) {
     data: spansData,
     isLoading: isSpansDataLoading,
     isError: isSpansDataError,
-  } = useSpanMetrics({
-    search,
-    fields: [
-      'span.op',
-      'any(span.description)',
-      'span.group',
-      `regression_score(span.self_time,${breakpoint})`,
-      `avg_by_timestamp(span.self_time,less,${breakpoint})`,
-      `avg_by_timestamp(span.self_time,greater,${breakpoint})`,
-      `epm_by_timestamp(less,${breakpoint})`,
-      `epm_by_timestamp(greater,${breakpoint})`,
-    ],
-    sorts: [{field: `regression_score(span.self_time,${breakpoint})`, kind: 'desc'}],
-    limit: 10,
-    enabled: isSpansOnly,
-    referrer: 'api.performance.transactions.statistical-detector-root-cause-analysis',
-  });
+  } = useSpanMetrics(
+    {
+      search,
+      fields: [
+        'span.op',
+        'any(span.description)',
+        'span.group',
+        `regression_score(span.self_time,${breakpoint})`,
+        `avg_by_timestamp(span.self_time,less,${breakpoint})`,
+        `avg_by_timestamp(span.self_time,greater,${breakpoint})`,
+        `epm_by_timestamp(less,${breakpoint})`,
+        `epm_by_timestamp(greater,${breakpoint})`,
+      ],
+      sorts: [{field: `regression_score(span.self_time,${breakpoint})`, kind: 'desc'}],
+      limit: 10,
+      enabled: isSpansOnly,
+    },
+    'api.performance.transactions.statistical-detector-root-cause-analysis'
+  );
 
   const tableData = useMemo(() => {
     if (isSpansOnly) {

+ 33 - 28
static/app/views/aiMonitoring/PipelinesTable.tsx

@@ -100,35 +100,40 @@ export function PipelinesTable() {
     sort = {field: 'spm()', kind: 'desc'};
   }
 
-  const {data, isLoading, meta, pageLinks, error} = useSpanMetrics({
-    search: MutableSearch.fromQueryObject({
-      'span.category': 'ai.pipeline',
-      'span.description': spanDescription ? `*${spanDescription}*` : undefined,
-    }),
-    fields: [
-      'project.id',
-      'span.group',
-      'span.description',
-      'spm()',
-      'avg(span.duration)',
-      'sum(span.duration)',
-    ],
-    sorts: [sort],
-    limit: 25,
-    cursor,
-    referrer: 'api.ai-pipelines.view',
-  });
+  const {data, isLoading, meta, pageLinks, error} = useSpanMetrics(
+    {
+      search: MutableSearch.fromQueryObject({
+        'span.category': 'ai.pipeline',
+        'span.description': spanDescription ? `*${spanDescription}*` : undefined,
+      }),
+      fields: [
+        'project.id',
+        'span.group',
+        'span.description',
+        'spm()',
+        'avg(span.duration)',
+        'sum(span.duration)',
+      ],
+      sorts: [sort],
+      limit: 25,
+      cursor,
+    },
+    'api.ai-pipelines.view'
+  );
 
-  const {data: tokensUsedData, isLoading: tokensUsedLoading} = useSpanMetrics({
-    search: new MutableSearch(
-      `span.category:ai span.ai.pipeline.group:[${(data as Row[])?.map(x => x['span.group']).join(',')}]`
-    ),
-    fields: [
-      'span.ai.pipeline.group',
-      'ai_total_tokens_used()',
-      'ai_total_tokens_used(c:spans/ai.total_cost@usd)',
-    ],
-  });
+  const {data: tokensUsedData, isLoading: tokensUsedLoading} = useSpanMetrics(
+    {
+      search: new MutableSearch(
+        `span.category:ai span.ai.pipeline.group:[${(data as Row[])?.map(x => x['span.group']).join(',')}]`
+      ),
+      fields: [
+        'span.ai.pipeline.group',
+        'ai_total_tokens_used()',
+        'ai_total_tokens_used(c:spans/ai.total_cost@usd)',
+      ],
+    },
+    'api.performance.ai-analytics.token-usage-chart'
+  );
 
   const rows: Row[] = (data as Row[]).map(baseRow => {
     const row: Row = {

+ 28 - 21
static/app/views/aiMonitoring/aiMonitoringDetailsPage.tsx

@@ -54,29 +54,36 @@ export default function AiMonitoringPage({params}: Props) {
     'span.category': 'ai.pipeline',
   };
 
-  const {data, isLoading: areSpanMetricsLoading} = useSpanMetrics({
-    search: MutableSearch.fromQueryObject(filters),
-    fields: [
-      SpanMetricsField.SPAN_OP,
-      SpanMetricsField.SPAN_DESCRIPTION,
-      'count()',
-      `${SpanFunction.SPM}()`,
-      `avg(${SpanMetricsField.SPAN_DURATION})`,
-    ],
-    enabled: Boolean(groupId),
-    referrer: 'api.ai-pipelines.view',
-  });
+  const {data, isLoading: areSpanMetricsLoading} = useSpanMetrics(
+    {
+      search: MutableSearch.fromQueryObject(filters),
+      fields: [
+        SpanMetricsField.SPAN_OP,
+        SpanMetricsField.SPAN_DESCRIPTION,
+        'count()',
+        `${SpanFunction.SPM}()`,
+        `avg(${SpanMetricsField.SPAN_DURATION})`,
+      ],
+      enabled: Boolean(groupId),
+    },
+    'api.ai-pipelines.view'
+  );
   const spanMetrics = data[0] ?? {};
 
-  const {data: totalTokenData, isLoading: isTotalTokenDataLoading} = useSpanMetrics({
-    search: MutableSearch.fromQueryObject({
-      'span.category': 'ai',
-      'span.ai.pipeline.group': groupId,
-    }),
-    fields: ['ai_total_tokens_used()', 'ai_total_tokens_used(c:spans/ai.total_cost@usd)'],
-    enabled: Boolean(groupId),
-    referrer: 'api.ai-pipelines.view',
-  });
+  const {data: totalTokenData, isLoading: isTotalTokenDataLoading} = useSpanMetrics(
+    {
+      search: MutableSearch.fromQueryObject({
+        'span.category': 'ai',
+        'span.ai.pipeline.group': groupId,
+      }),
+      fields: [
+        'ai_total_tokens_used()',
+        'ai_total_tokens_used(c:spans/ai.total_cost@usd)',
+      ],
+      enabled: Boolean(groupId),
+    },
+    'api.ai-pipelines.view'
+  );
   const tokenUsedMetric = totalTokenData[0] ?? {};
 
   return (

+ 5 - 0
static/app/views/performance/browser/resources/referrer.ts

@@ -0,0 +1,5 @@
+// TODO - all resource referrers here
+export enum Referrer {
+  RESOURCE_SUMMARY_METRICS_RIBBON = 'api.performance.browser.resources.resource-summary-metrics-ribbon',
+  RESOURCE_SUMMARY_CHARTS = 'api.performance.browser.resources.resource-summary-charts',
+}

+ 21 - 17
static/app/views/performance/browser/resources/resourceSummaryPage/index.tsx

@@ -14,6 +14,7 @@ import {useLocation} from 'sentry/utils/useLocation';
 import useOrganization from 'sentry/utils/useOrganization';
 import {useParams} from 'sentry/utils/useParams';
 import {normalizeUrl} from 'sentry/utils/withDomainRequired';
+import {Referrer} from 'sentry/views/performance/browser/resources/referrer';
 import ResourceInfo from 'sentry/views/performance/browser/resources/resourceSummaryPage/resourceInfo';
 import ResourceSummaryCharts from 'sentry/views/performance/browser/resources/resourceSummaryPage/resourceSummaryCharts';
 import ResourceSummaryTable from 'sentry/views/performance/browser/resources/resourceSummaryPage/resourceSummaryTable';
@@ -46,23 +47,26 @@ function ResourceSummary() {
   const {
     query: {transaction},
   } = useLocation();
-  const {data} = useSpanMetrics({
-    search: MutableSearch.fromQueryObject({
-      'span.group': groupId,
-    }),
-    fields: [
-      `avg(${SPAN_SELF_TIME})`,
-      `avg(${HTTP_RESPONSE_CONTENT_LENGTH})`,
-      `avg(${HTTP_DECODED_RESPONSE_CONTENT_LENGTH})`,
-      `avg(${HTTP_RESPONSE_TRANSFER_SIZE})`,
-      `sum(${SPAN_SELF_TIME})`,
-      'spm()',
-      SPAN_OP,
-      SPAN_DESCRIPTION,
-      'time_spent_percentage()',
-      'project.id',
-    ],
-  });
+  const {data} = useSpanMetrics(
+    {
+      search: MutableSearch.fromQueryObject({
+        'span.group': groupId,
+      }),
+      fields: [
+        `avg(${SPAN_SELF_TIME})`,
+        `avg(${HTTP_RESPONSE_CONTENT_LENGTH})`,
+        `avg(${HTTP_DECODED_RESPONSE_CONTENT_LENGTH})`,
+        `avg(${HTTP_RESPONSE_TRANSFER_SIZE})`,
+        `sum(${SPAN_SELF_TIME})`,
+        'spm()',
+        SPAN_OP,
+        SPAN_DESCRIPTION,
+        'time_spent_percentage()',
+        'project.id',
+      ],
+    },
+    Referrer.RESOURCE_SUMMARY_METRICS_RIBBON
+  );
   const spanMetrics = selectedSpanOp
     ? data.find(item => item[SPAN_OP] === selectedSpanOp) ?? {}
     : data[0] ?? {};

+ 23 - 21
static/app/views/performance/browser/resources/resourceSummaryPage/resourceSummaryCharts.tsx

@@ -4,6 +4,7 @@ import {formatRate} from 'sentry/utils/formatters';
 import getDynamicText from 'sentry/utils/getDynamicText';
 import {MutableSearch} from 'sentry/utils/tokenizeSearch';
 import {RESOURCE_THROUGHPUT_UNIT} from 'sentry/views/performance/browser/resources';
+import {Referrer} from 'sentry/views/performance/browser/resources/referrer';
 import {useResourceModuleFilters} from 'sentry/views/performance/browser/resources/utils/useResourceFilters';
 import {AVG_COLOR, THROUGHPUT_COLOR} from 'sentry/views/starfish/colors';
 import Chart, {ChartType} from 'sentry/views/starfish/components/chart';
@@ -27,29 +28,30 @@ const {
 
 function ResourceSummaryCharts(props: {groupId: string}) {
   const filters = useResourceModuleFilters();
-  // console.log({
-  //   ...(filters[RESOURCE_RENDER_BLOCKING_STATUS]
-  //     ? {[RESOURCE_RENDER_BLOCKING_STATUS]: filters[RESOURCE_RENDER_BLOCKING_STATUS]}
-  //     : {}),
-  // });
 
   const {data: spanMetricsSeriesData, isLoading: areSpanMetricsSeriesLoading} =
-    useSpanMetricsSeries({
-      search: MutableSearch.fromQueryObject({
-        'span.group': props.groupId,
-        ...(filters[RESOURCE_RENDER_BLOCKING_STATUS]
-          ? {[RESOURCE_RENDER_BLOCKING_STATUS]: filters[RESOURCE_RENDER_BLOCKING_STATUS]}
-          : {}),
-      }),
-      yAxis: [
-        `spm()`,
-        `avg(${SPAN_SELF_TIME})`,
-        `avg(${HTTP_RESPONSE_CONTENT_LENGTH})`,
-        `avg(${HTTP_DECODED_RESPONSE_CONTENT_LENGTH})`,
-        `avg(${HTTP_RESPONSE_TRANSFER_SIZE})`,
-      ],
-      enabled: Boolean(props.groupId),
-    });
+    useSpanMetricsSeries(
+      {
+        search: MutableSearch.fromQueryObject({
+          'span.group': props.groupId,
+          ...(filters[RESOURCE_RENDER_BLOCKING_STATUS]
+            ? {
+                [RESOURCE_RENDER_BLOCKING_STATUS]:
+                  filters[RESOURCE_RENDER_BLOCKING_STATUS],
+              }
+            : {}),
+        }),
+        yAxis: [
+          `spm()`,
+          `avg(${SPAN_SELF_TIME})`,
+          `avg(${HTTP_RESPONSE_CONTENT_LENGTH})`,
+          `avg(${HTTP_DECODED_RESPONSE_CONTENT_LENGTH})`,
+          `avg(${HTTP_RESPONSE_TRANSFER_SIZE})`,
+        ],
+        enabled: Boolean(props.groupId),
+      },
+      Referrer.RESOURCE_SUMMARY_CHARTS
+    );
 
   if (spanMetricsSeriesData) {
     spanMetricsSeriesData[`avg(${HTTP_RESPONSE_TRANSFER_SIZE})`].lineStyle = {

+ 33 - 27
static/app/views/performance/cache/cacheLandingPage.tsx

@@ -53,21 +53,25 @@ export function CacheLandingPage() {
     isLoading: isCacheHitRateLoading,
     data: cacheHitRateData,
     error: cacheHitRateError,
-  } = useSpanMetricsSeries({
-    yAxis: [`${CACHE_MISS_RATE}()`],
-    search: MutableSearch.fromQueryObject(BASE_FILTERS),
-    referrer: Referrer.LANDING_CACHE_HIT_MISS_CHART,
-  });
+  } = useSpanMetricsSeries(
+    {
+      yAxis: [`${CACHE_MISS_RATE}()`],
+      search: MutableSearch.fromQueryObject(BASE_FILTERS),
+    },
+    Referrer.LANDING_CACHE_HIT_MISS_CHART
+  );
 
   const {
     isLoading: isThroughputDataLoading,
     data: throughputData,
     error: throughputError,
-  } = useSpanMetricsSeries({
-    search: MutableSearch.fromQueryObject(BASE_FILTERS),
-    yAxis: ['spm()'],
-    referrer: Referrer.LANDING_CACHE_THROUGHPUT_CHART,
-  });
+  } = useSpanMetricsSeries(
+    {
+      search: MutableSearch.fromQueryObject(BASE_FILTERS),
+      yAxis: ['spm()'],
+    },
+    Referrer.LANDING_CACHE_THROUGHPUT_CHART
+  );
 
   const {
     isLoading: isTransactionsListLoading,
@@ -75,23 +79,25 @@ export function CacheLandingPage() {
     meta: transactionsListMeta,
     error: transactionsListError,
     pageLinks: transactionsListPageLinks,
-  } = useSpanMetrics({
-    search: MutableSearch.fromQueryObject(BASE_FILTERS),
-    fields: [
-      'project',
-      'project.id',
-      'transaction',
-      'spm()',
-      `${CACHE_MISS_RATE}()`,
-      'sum(span.self_time)',
-      'time_spent_percentage()',
-      `avg(${CACHE_ITEM_SIZE})`,
-    ],
-    sorts: [sort],
-    cursor,
-    limit: TRANSACTIONS_TABLE_ROW_COUNT,
-    referrer: Referrer.LANDING_CACHE_TRANSACTION_LIST,
-  });
+  } = useSpanMetrics(
+    {
+      search: MutableSearch.fromQueryObject(BASE_FILTERS),
+      fields: [
+        'project',
+        'project.id',
+        'transaction',
+        'spm()',
+        `${CACHE_MISS_RATE}()`,
+        'sum(span.self_time)',
+        'time_spent_percentage()',
+        `avg(${CACHE_ITEM_SIZE})`,
+      ],
+      sorts: [sort],
+      cursor,
+      limit: TRANSACTIONS_TABLE_ROW_COUNT,
+    },
+    Referrer.LANDING_CACHE_TRANSACTION_LIST
+  );
 
   addCustomMeta(transactionsListMeta);
 

+ 1 - 0
static/app/views/performance/cache/referrers.ts

@@ -4,6 +4,7 @@ export enum Referrer {
   LANDING_CACHE_TRANSACTION_LIST = 'api.performance.cache.landing-cache-transaction-list',
 
   SAMPLES_CACHE_METRICS_RIBBON = 'api.performance.cache.samples-cache-metrics-ribbon',
+  SAMPLES_CACHE_TRANSACTION_DURATION_CHART = 'api.performance.cache.samples-cache-transaction-duration-chart',
   SAMPLES_CACHE_TRANSACTION_DURATION = 'api.performance.cache.samples-cache-transaction-duration',
   SAMPLES_CACHE_SPAN_SAMPLES = 'api.performance.cache.samples-cache-span-samples',
   SAMPLES_CACHE_SPAN_SAMPLES_TRANSACTION_DURATION = 'api.performance.cache.samples-cache-span-samples',

+ 7 - 5
static/app/views/performance/cache/samplePanel/charts/transactionDurationChart.tsx

@@ -37,11 +37,13 @@ export function TransactionDurationChart({
     transaction,
   };
 
-  const {data, isLoading} = useMetricsSeries({
-    yAxis: ['avg(transaction.duration)'],
-    search: MutableSearch.fromQueryObject(search),
-    referrer: Referrer.SAMPLES_CACHE_TRANSACTION_DURATION,
-  });
+  const {data, isLoading} = useMetricsSeries(
+    {
+      yAxis: ['avg(transaction.duration)'],
+      search: MutableSearch.fromQueryObject(search),
+    },
+    Referrer.SAMPLES_CACHE_TRANSACTION_DURATION_CHART
+  );
 
   const sampledSpanDataSeries = useSampleScatterPlotSeries(
     samples,

+ 24 - 19
static/app/views/performance/cache/samplePanel/samplePanel.tsx

@@ -73,27 +73,32 @@ export function CacheSamplePanel() {
   };
 
   const {data: cacheTransactionMetrics, isFetching: areCacheTransactionMetricsFetching} =
-    useSpanMetrics({
-      search: MutableSearch.fromQueryObject(filters),
-      fields: [
-        `${SpanFunction.SPM}()`,
-        `${SpanFunction.CACHE_MISS_RATE}()`,
-        `${SpanFunction.TIME_SPENT_PERCENTAGE}()`,
-        `sum(${SpanMetricsField.SPAN_SELF_TIME})`,
-        `avg(${SpanMetricsField.CACHE_ITEM_SIZE})`,
-      ],
-      enabled: isPanelOpen,
-      referrer: Referrer.SAMPLES_CACHE_METRICS_RIBBON,
-    });
+    useSpanMetrics(
+      {
+        search: MutableSearch.fromQueryObject(filters),
+        fields: [
+          `${SpanFunction.SPM}()`,
+          `${SpanFunction.CACHE_MISS_RATE}()`,
+          `${SpanFunction.TIME_SPENT_PERCENTAGE}()`,
+          `sum(${SpanMetricsField.SPAN_SELF_TIME})`,
+          `avg(${SpanMetricsField.CACHE_ITEM_SIZE})`,
+        ],
+        enabled: isPanelOpen,
+      },
+      Referrer.SAMPLES_CACHE_METRICS_RIBBON
+    );
 
   const {data: transactionDurationData, isLoading: isTransactionDurationLoading} =
-    useMetrics({
-      search: MutableSearch.fromQueryObject({
-        transaction: query.transaction,
-      } satisfies MetricsQueryFilters),
-      fields: [`avg(${MetricsFields.TRANSACTION_DURATION})`],
-      enabled: isPanelOpen && Boolean(query.transaction),
-    });
+    useMetrics(
+      {
+        search: MutableSearch.fromQueryObject({
+          transaction: query.transaction,
+        } satisfies MetricsQueryFilters),
+        fields: [`avg(${MetricsFields.TRANSACTION_DURATION})`],
+        enabled: isPanelOpen && Boolean(query.transaction),
+      },
+      Referrer.SAMPLES_CACHE_TRANSACTION_DURATION
+    );
 
   const sampleFilters: SpanIndexedQueryFilters = {
     ...BASE_FILTERS,

Some files were not shown because too many files changed in this diff