diff --git a/static/app/components/metrics/equationSymbol.spec.tsx b/static/app/components/metrics/equationSymbol.spec.tsx
new file mode 100644
index 00000000000000..dfdcf74cba24b1
--- /dev/null
+++ b/static/app/components/metrics/equationSymbol.spec.tsx
@@ -0,0 +1,24 @@
+import {render, screen} from 'sentry-test/reactTestingLibrary';
+import {textWithMarkupMatcher} from 'sentry-test/utils';
+
+import {
+ EquationSymbol,
+ getEquationSymbol,
+} from 'sentry/components/metrics/equationSymbol';
+
+describe('getEquationSymbol', () => {
+ it('should return the correct symbol', () => {
+ expect(getEquationSymbol(0)).toBe('ƒ1');
+ expect(getEquationSymbol(1)).toBe('ƒ2');
+ });
+});
+
+describe('EquationSymbol', () => {
+ it('renders', () => {
+ render();
+ expect(screen.getByText(textWithMarkupMatcher('ƒ1'))).toBeInTheDocument();
+
+ render();
+ expect(screen.getByText(textWithMarkupMatcher('ƒ6'))).toBeInTheDocument();
+ });
+});
diff --git a/static/app/views/metrics/equationSymbol.tsx b/static/app/components/metrics/equationSymbol.tsx
similarity index 100%
rename from static/app/views/metrics/equationSymbol.tsx
rename to static/app/components/metrics/equationSymbol.tsx
diff --git a/static/app/components/metrics/querySymbol.spec.tsx b/static/app/components/metrics/querySymbol.spec.tsx
new file mode 100644
index 00000000000000..b47735bfd7a5c8
--- /dev/null
+++ b/static/app/components/metrics/querySymbol.spec.tsx
@@ -0,0 +1,33 @@
+import {render, screen} from 'sentry-test/reactTestingLibrary';
+
+import {getQuerySymbol, QuerySymbol} from 'sentry/components/metrics/querySymbol';
+
+describe('getQuerySymbol', () => {
+ it('should return the correct symbol', () => {
+ expect(getQuerySymbol(0)).toBe('a');
+ expect(getQuerySymbol(1)).toBe('b');
+ expect(getQuerySymbol(25)).toBe('z');
+ expect(getQuerySymbol(26)).toBe('aa');
+ expect(getQuerySymbol(27)).toBe('ab');
+ expect(getQuerySymbol(52)).toBe('ba');
+ expect(getQuerySymbol(53)).toBe('bb');
+ expect(getQuerySymbol(77)).toBe('bz');
+ expect(getQuerySymbol(78)).toBe('ca');
+ expect(getQuerySymbol(702)).toBe('aaa');
+ });
+});
+
+describe('QuerySymbol', () => {
+ it('renders', () => {
+ render();
+ expect(screen.getByText('a')).toBeInTheDocument();
+
+ render();
+ expect(screen.getByText('ab')).toBeInTheDocument();
+ });
+
+ it('does not render for negative query ids', () => {
+ const {container} = render();
+ expect(container).toBeEmptyDOMElement();
+ });
+});
diff --git a/static/app/views/metrics/querySymbol.tsx b/static/app/components/metrics/querySymbol.tsx
similarity index 100%
rename from static/app/views/metrics/querySymbol.tsx
rename to static/app/components/metrics/querySymbol.tsx
diff --git a/static/app/components/modals/metricWidgetViewerModal/queries.tsx b/static/app/components/modals/metricWidgetViewerModal/queries.tsx
index 459da23f8f070c..ffbaa2e370c81e 100644
--- a/static/app/components/modals/metricWidgetViewerModal/queries.tsx
+++ b/static/app/components/modals/metricWidgetViewerModal/queries.tsx
@@ -8,7 +8,9 @@ import type {MenuItemProps} from 'sentry/components/dropdownMenu';
import {DropdownMenu} from 'sentry/components/dropdownMenu';
import Input, {type InputProps} from 'sentry/components/input';
import {CreateMetricAlertFeature} from 'sentry/components/metrics/createMetricAlertFeature';
+import {EquationSymbol} from 'sentry/components/metrics/equationSymbol';
import {QueryBuilder} from 'sentry/components/metrics/queryBuilder';
+import {getQuerySymbol, QuerySymbol} from 'sentry/components/metrics/querySymbol';
import {Tooltip} from 'sentry/components/tooltip';
import {DEFAULT_DEBOUNCE_DURATION, SLOW_TOOLTIP_DELAY} from 'sentry/constants';
import {
@@ -36,10 +38,8 @@ import type {
} from 'sentry/views/dashboards/metrics/types';
import {getMetricQueryName} from 'sentry/views/dashboards/metrics/utils';
import {DisplayType} from 'sentry/views/dashboards/types';
-import {EquationSymbol} from 'sentry/views/metrics/equationSymbol';
import {EquationInput} from 'sentry/views/metrics/formulaInput';
import {getCreateAlert} from 'sentry/views/metrics/metricQueryContextMenu';
-import {getQuerySymbol, QuerySymbol} from 'sentry/views/metrics/querySymbol';
interface Props {
addEquation: () => void;
diff --git a/static/app/utils/metrics/dashboardImport.tsx b/static/app/utils/metrics/dashboardImport.tsx
index dd19db003c0547..0f42059a824afe 100644
--- a/static/app/utils/metrics/dashboardImport.tsx
+++ b/static/app/utils/metrics/dashboardImport.tsx
@@ -1,10 +1,10 @@
import {Client} from 'sentry/api';
+import {getQuerySymbol} from 'sentry/components/metrics/querySymbol';
import type {MetricMeta, MRI} from 'sentry/types/metrics';
import {convertToDashboardWidget} from 'sentry/utils/metrics/dashboard';
import type {MetricsQuery} from 'sentry/utils/metrics/types';
import {MetricDisplayType} from 'sentry/utils/metrics/types';
import type {Widget} from 'sentry/views/dashboards/types';
-import {getQuerySymbol} from 'sentry/views/metrics/querySymbol';
// import types
export type ImportDashboard = {
description: string;
diff --git a/static/app/views/dashboards/metrics/utils.tsx b/static/app/views/dashboards/metrics/utils.tsx
index 23624c9345992a..525dda15213840 100644
--- a/static/app/views/dashboards/metrics/utils.tsx
+++ b/static/app/views/dashboards/metrics/utils.tsx
@@ -1,5 +1,7 @@
import {useMemo} from 'react';
+import {getEquationSymbol} from 'sentry/components/metrics/equationSymbol';
+import {getQuerySymbol} from 'sentry/components/metrics/querySymbol';
import type {MRI} from 'sentry/types/metrics';
import {unescapeMetricsFormula} from 'sentry/utils/metrics';
import {NO_QUERY_ID} from 'sentry/utils/metrics/constants';
@@ -18,8 +20,6 @@ import {
type WidgetQuery,
WidgetType,
} from 'sentry/views/dashboards/types';
-import {getEquationSymbol} from 'sentry/views/metrics/equationSymbol';
-import {getQuerySymbol} from 'sentry/views/metrics/querySymbol';
import {getUniqueQueryIdGenerator} from 'sentry/views/metrics/utils/uniqueQueryId';
function extendQuery(query = '', dashboardFilters?: DashboardFilters) {
diff --git a/static/app/views/metrics/pageHeaderActions.tsx b/static/app/views/metrics/pageHeaderActions.tsx
index 6db1f0f86ea297..16a44e9d13d876 100644
--- a/static/app/views/metrics/pageHeaderActions.tsx
+++ b/static/app/views/metrics/pageHeaderActions.tsx
@@ -8,6 +8,7 @@ import {Button} from 'sentry/components/button';
import ButtonBar from 'sentry/components/buttonBar';
import {DropdownMenu} from 'sentry/components/dropdownMenu';
import {CreateMetricAlertFeature} from 'sentry/components/metrics/createMetricAlertFeature';
+import {QuerySymbol} from 'sentry/components/metrics/querySymbol';
import {
IconBookmark,
IconDashboard,
@@ -25,7 +26,6 @@ import useOrganization from 'sentry/utils/useOrganization';
import useRouter from 'sentry/utils/useRouter';
import {useMetricsContext} from 'sentry/views/metrics/context';
import {getCreateAlert} from 'sentry/views/metrics/metricQueryContextMenu';
-import {QuerySymbol} from 'sentry/views/metrics/querySymbol';
import {useCreateDashboard} from 'sentry/views/metrics/useCreateDashboard';
import {useFormulaDependencies} from 'sentry/views/metrics/utils/useFormulaDependencies';
diff --git a/static/app/views/metrics/queries.tsx b/static/app/views/metrics/queries.tsx
index 209042305cbd33..e371e31f83b54c 100644
--- a/static/app/views/metrics/queries.tsx
+++ b/static/app/views/metrics/queries.tsx
@@ -4,7 +4,9 @@ import * as echarts from 'echarts/core';
import GuideAnchor from 'sentry/components/assistant/guideAnchor';
import {Button} from 'sentry/components/button';
+import {EquationSymbol} from 'sentry/components/metrics/equationSymbol';
import {QueryBuilder} from 'sentry/components/metrics/queryBuilder';
+import {getQuerySymbol, QuerySymbol} from 'sentry/components/metrics/querySymbol';
import SwitchButton from 'sentry/components/switchButton';
import {Tooltip} from 'sentry/components/tooltip';
import {IconAdd} from 'sentry/icons';
@@ -23,11 +25,9 @@ import useOrganization from 'sentry/utils/useOrganization';
import usePageFilters from 'sentry/utils/usePageFilters';
import {METRIC_CHART_GROUP} from 'sentry/views/metrics/constants';
import {useMetricsContext} from 'sentry/views/metrics/context';
-import {EquationSymbol} from 'sentry/views/metrics/equationSymbol';
import {EquationInput} from 'sentry/views/metrics/formulaInput';
import {MetricFormulaContextMenu} from 'sentry/views/metrics/metricFormulaContextMenu';
import {MetricQueryContextMenu} from 'sentry/views/metrics/metricQueryContextMenu';
-import {getQuerySymbol, QuerySymbol} from 'sentry/views/metrics/querySymbol';
import {useFormulaDependencies} from 'sentry/views/metrics/utils/useFormulaDependencies';
export function Queries() {
diff --git a/static/app/views/metrics/querySymbol.spec.tsx b/static/app/views/metrics/querySymbol.spec.tsx
deleted file mode 100644
index a97387286dac36..00000000000000
--- a/static/app/views/metrics/querySymbol.spec.tsx
+++ /dev/null
@@ -1,16 +0,0 @@
-import {getQuerySymbol} from 'sentry/views/metrics/querySymbol';
-
-describe('getQuerySymbol', () => {
- it('should return the correct symbol', () => {
- expect(getQuerySymbol(0)).toBe('a');
- expect(getQuerySymbol(1)).toBe('b');
- expect(getQuerySymbol(25)).toBe('z');
- expect(getQuerySymbol(26)).toBe('aa');
- expect(getQuerySymbol(27)).toBe('ab');
- expect(getQuerySymbol(52)).toBe('ba');
- expect(getQuerySymbol(53)).toBe('bb');
- expect(getQuerySymbol(77)).toBe('bz');
- expect(getQuerySymbol(78)).toBe('ca');
- expect(getQuerySymbol(702)).toBe('aaa');
- });
-});
diff --git a/static/app/views/metrics/utils/useFormulaDependencies.tsx b/static/app/views/metrics/utils/useFormulaDependencies.tsx
index 90b55447a89e0b..b09d60add69172 100644
--- a/static/app/views/metrics/utils/useFormulaDependencies.tsx
+++ b/static/app/views/metrics/utils/useFormulaDependencies.tsx
@@ -1,5 +1,6 @@
import {useCallback, useMemo} from 'react';
+import {getQuerySymbol} from 'sentry/components/metrics/querySymbol';
import {unescapeMetricsFormula} from 'sentry/utils/metrics';
import {
isMetricsEquationWidget,
@@ -9,7 +10,6 @@ import {
import {useMetricsContext} from 'sentry/views/metrics/context';
import {parseFormula} from 'sentry/views/metrics/formulaParser/parser';
import {type TokenList, TokenType} from 'sentry/views/metrics/formulaParser/types';
-import {getQuerySymbol} from 'sentry/views/metrics/querySymbol';
interface FormulaDependencies {
dependencies: MetricsQueryWidget[];
diff --git a/static/app/views/metrics/utils/widgetToQuery.tsx b/static/app/views/metrics/utils/widgetToQuery.tsx
index ed9738f0018c8c..23bf9a87b3f1f4 100644
--- a/static/app/views/metrics/utils/widgetToQuery.tsx
+++ b/static/app/views/metrics/utils/widgetToQuery.tsx
@@ -1,7 +1,7 @@
+import {getEquationSymbol} from 'sentry/components/metrics/equationSymbol';
+import {getQuerySymbol} from 'sentry/components/metrics/querySymbol';
import {isMetricsEquationWidget, type MetricsWidget} from 'sentry/utils/metrics/types';
import type {MetricsQueryApiQueryParams} from 'sentry/utils/metrics/useMetricsQuery';
-import {getEquationSymbol} from 'sentry/views/metrics/equationSymbol';
-import {getQuerySymbol} from 'sentry/views/metrics/querySymbol';
export function widgetToQuery(
widget: MetricsWidget,