From 542cd44819f88f6b6c01525991c9b0cb0e6ea347 Mon Sep 17 00:00:00 2001 From: Nar Saynorath Date: Wed, 15 Apr 2026 15:04:24 -0400 Subject: [PATCH 1/2] feat(tracemetrics): Disable Save As for equations Adds a tooltip and disables the button for the equation. Also filters it out from "All Metrics" --- .../explore/metrics/useSaveAsMetricItems.tsx | 24 ++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/static/app/views/explore/metrics/useSaveAsMetricItems.tsx b/static/app/views/explore/metrics/useSaveAsMetricItems.tsx index 009a9af9c9a24f..5b41a10089835e 100644 --- a/static/app/views/explore/metrics/useSaveAsMetricItems.tsx +++ b/static/app/views/explore/metrics/useSaveAsMetricItems.tsx @@ -1,4 +1,5 @@ import {useMemo} from 'react'; +import {useTheme} from '@emotion/react'; import * as Sentry from '@sentry/react'; import { @@ -32,6 +33,7 @@ interface UseSaveAsMetricItemsOptions { } export function useSaveAsMetricItems(_options: UseSaveAsMetricItemsOptions) { + const theme = useTheme(); const location = useLocation(); const organization = useOrganization(); const {saveQuery, updateQuery} = useSaveMetricsMultiQuery(); @@ -111,15 +113,21 @@ export function useSaveAsMetricItems(_options: UseSaveAsMetricItemsOptions) { label: t('All Metrics'), textValue: t('All Metrics'), onAction: () => { - addToDashboard(metricQueries); + addToDashboard( + metricQueries.filter( + metricQuery => + !isVisualizeEquation(metricQuery.queryParams.visualizes[0]!) + ) + ); }, }, ] : []), ...metricQueries.map((metricQuery, index) => { + const visualize = metricQuery.queryParams.visualizes[0]!; return { key: `add-to-dashboard-${index}`, - label: `${metricQuery.label ?? getVisualizeLabel(index, isVisualizeEquation(metricQuery.queryParams.visualizes[0]!))}: ${ + label: `${metricQuery.label ?? getVisualizeLabel(index, isVisualizeEquation(visualize))}: ${ formatTraceMetricsFunction( metricQuery.queryParams.aggregateFields .filter(isVisualize) @@ -127,14 +135,24 @@ export function useSaveAsMetricItems(_options: UseSaveAsMetricItemsOptions) { ) as string }`, onAction: () => { + if (isVisualizeEquation(visualize)) { + return; + } addToDashboard(metricQuery); }, + disabled: isVisualizeEquation(visualize), + tooltip: isVisualizeEquation(visualize) + ? t('Equations cannot currently be added to a dashboard') + : undefined, + style: isVisualizeEquation(visualize) + ? {color: theme.tokens.content.disabled} + : undefined, }; }), ], }, ]; - }, [addToDashboard, metricQueries]); + }, [addToDashboard, metricQueries, theme.tokens.content.disabled]); return useMemo(() => { return [...saveAsItems, ...addToDashboardItems]; From b2db5c8f4627830288baaad4b5942cc7a1c6835f Mon Sep 17 00:00:00 2001 From: Nar Saynorath Date: Wed, 15 Apr 2026 15:12:26 -0400 Subject: [PATCH 2/2] Remove inline style Thought it was necessary, double checked that it was not --- static/app/views/explore/metrics/useSaveAsMetricItems.tsx | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/static/app/views/explore/metrics/useSaveAsMetricItems.tsx b/static/app/views/explore/metrics/useSaveAsMetricItems.tsx index 5b41a10089835e..fa0bfe65fd4bc2 100644 --- a/static/app/views/explore/metrics/useSaveAsMetricItems.tsx +++ b/static/app/views/explore/metrics/useSaveAsMetricItems.tsx @@ -1,5 +1,4 @@ import {useMemo} from 'react'; -import {useTheme} from '@emotion/react'; import * as Sentry from '@sentry/react'; import { @@ -33,7 +32,6 @@ interface UseSaveAsMetricItemsOptions { } export function useSaveAsMetricItems(_options: UseSaveAsMetricItemsOptions) { - const theme = useTheme(); const location = useLocation(); const organization = useOrganization(); const {saveQuery, updateQuery} = useSaveMetricsMultiQuery(); @@ -144,15 +142,12 @@ export function useSaveAsMetricItems(_options: UseSaveAsMetricItemsOptions) { tooltip: isVisualizeEquation(visualize) ? t('Equations cannot currently be added to a dashboard') : undefined, - style: isVisualizeEquation(visualize) - ? {color: theme.tokens.content.disabled} - : undefined, }; }), ], }, ]; - }, [addToDashboard, metricQueries, theme.tokens.content.disabled]); + }, [addToDashboard, metricQueries]); return useMemo(() => { return [...saveAsItems, ...addToDashboardItems];