Skip to content

Commit 791cba4

Browse files
committed
fix(tracemetrics): Metric panel title should use equation with label
1 parent 042c595 commit 791cba4

File tree

8 files changed

+38
-8
lines changed

8 files changed

+38
-8
lines changed

static/app/views/explore/metrics/equationBuilder/index.spec.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,8 @@ describe('EquationBuilder', () => {
5555
expect(handleExpressionChange).toHaveBeenCalledWith(
5656
expect.objectContaining({
5757
text: 'count(value,metricA,distribution,none) * 2',
58-
})
58+
}),
59+
'A * 2'
5960
);
6061
});
6162
});

static/app/views/explore/metrics/equationBuilder/index.tsx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ export function EquationBuilder({
2323
onReferenceLabelsChange,
2424
}: {
2525
expression: string;
26-
handleExpressionChange: (expression: Expression) => void;
26+
handleExpressionChange: (resolved: Expression, internalText: string) => void;
2727
onReferenceLabelsChange?: (labels: string[]) => void;
2828
referenceMap?: Record<string, string>;
2929
}) {
@@ -49,7 +49,10 @@ export function EquationBuilder({
4949
(newExpression: Expression) => {
5050
startTransition(() => {
5151
if (newExpression.isValid) {
52-
handleExpressionChange(resolveExpression(newExpression, referenceMap));
52+
handleExpressionChange(
53+
resolveExpression(newExpression, referenceMap),
54+
newExpression.text
55+
);
5356
}
5457
});
5558
},

static/app/views/explore/metrics/metricGraph/index.tsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ interface MetricsGraphProps {
5757
additionalActions?: React.ReactNode;
5858
infoContentHidden?: boolean;
5959
isMetricOptionsEmpty?: boolean;
60+
title?: string;
6061
}
6162

6263
export function MetricsGraph({
@@ -65,6 +66,7 @@ export function MetricsGraph({
6566
additionalActions,
6667
infoContentHidden,
6768
isMetricOptionsEmpty,
69+
title,
6870
}: MetricsGraphProps) {
6971
const metricQueries = useMultiMetricsQueryParams();
7072
const visualize = useMetricVisualize();
@@ -91,6 +93,7 @@ export function MetricsGraph({
9193
additionalActions={additionalActions}
9294
infoContentHidden={infoContentHidden}
9395
isMetricOptionsEmpty={isMetricOptionsEmpty}
96+
title={title}
9497
/>
9598
);
9699
}
@@ -110,6 +113,7 @@ function Graph({
110113
infoContentHidden,
111114
additionalActions,
112115
isMetricOptionsEmpty,
116+
title,
113117
}: GraphProps) {
114118
const organization = useOrganization();
115119
const aggregate = visualize.yAxis;
@@ -178,8 +182,8 @@ function Graph({
178182
if (visualizes.length > 1) {
179183
return metricName;
180184
}
181-
return metricLabel ?? prettifyAggregation(aggregate) ?? aggregate;
182-
}, [aggregate, metricLabel, metricName, visualizes.length]);
185+
return title ?? metricLabel ?? prettifyAggregation(aggregate) ?? aggregate;
186+
}, [aggregate, metricLabel, metricName, visualizes.length, title]);
183187

184188
const Title = <Widget.WidgetTitle title={chartTitle} />;
185189

static/app/views/explore/metrics/metricPanel/index.tsx

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import {
1818
getTraceSamplesTableFields,
1919
TraceSamplesTableColumns,
2020
} from 'sentry/views/explore/metrics/constants';
21+
import {unresolveExpression} from 'sentry/views/explore/metrics/equationBuilder/utils';
2122
import {useMetricAggregatesTable} from 'sentry/views/explore/metrics/hooks/useMetricAggregatesTable';
2223
import {useMetricSamplesTable} from 'sentry/views/explore/metrics/hooks/useMetricSamplesTable';
2324
import {useMetricTimeseries} from 'sentry/views/explore/metrics/hooks/useMetricTimeseries';
@@ -89,6 +90,13 @@ export function MetricPanel({
8990
const topEvents = useTopEvents();
9091
const visualize = useMetricVisualize();
9192

93+
const [title, setTitle] = useState<string | undefined>(() => {
94+
if (isVisualizeEquation(visualize)) {
95+
return unresolveExpression(visualize.expression.text, referenceMap);
96+
}
97+
return undefined;
98+
});
99+
92100
const areQueriesEnabled = isVisualizeFunction(visualize)
93101
? Boolean(traceMetric.name) && !isMetricOptionsEmpty
94102
: isVisualizeEquation(visualize) && Boolean(visualize.expression.text);
@@ -143,6 +151,7 @@ export function MetricPanel({
143151
dragAttributes={dragAttributes}
144152
referencedMetricLabels={referencedMetricLabels}
145153
onEquationLabelsChange={onEquationLabelsChange}
154+
onTitleChange={setTitle}
146155
/>
147156
</Container>
148157
{visualize.visible ? (
@@ -169,6 +178,7 @@ export function MetricPanel({
169178
infoContentHidden={infoContentHidden}
170179
setInfoContentHidden={setInfoContentHidden}
171180
isMetricOptionsEmpty={isMetricOptionsEmpty}
181+
title={title}
172182
/>
173183
</Container>
174184
</Activity>
@@ -192,6 +202,7 @@ export function MetricPanel({
192202
infoContentHidden={infoContentHidden}
193203
setInfoContentHidden={setInfoContentHidden}
194204
isMetricOptionsEmpty={isMetricOptionsEmpty}
205+
title={title}
195206
/>
196207
) : (
197208
<StackedOrientation
@@ -203,6 +214,7 @@ export function MetricPanel({
203214
infoContentHidden={infoContentHidden}
204215
setInfoContentHidden={setInfoContentHidden}
205216
isMetricOptionsEmpty={isMetricOptionsEmpty}
217+
title={title}
206218
/>
207219
)}
208220
</PanelBody>

static/app/views/explore/metrics/metricPanel/sideBySideOrientation.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ export function SideBySideOrientation({
3030
infoContentHidden,
3131
setInfoContentHidden,
3232
isMetricOptionsEmpty,
33+
title,
3334
}: {
3435
infoContentHidden: boolean;
3536
isMetricOptionsEmpty: boolean;
@@ -38,6 +39,7 @@ export function SideBySideOrientation({
3839
setOrientation: (orientation: TableOrientation) => void;
3940
timeseriesResult: ReturnType<typeof useMetricTimeseries>['result'];
4041
traceMetric: TraceMetric;
42+
title?: string;
4143
}) {
4244
const organization = useOrganization();
4345
const hasMetricsUIRefresh = canUseMetricsUIRefresh(organization);
@@ -52,6 +54,7 @@ export function SideBySideOrientation({
5254
timeseriesResult={timeseriesResult}
5355
orientation={orientation}
5456
isMetricOptionsEmpty={isMetricOptionsEmpty}
57+
title={title}
5558
/>
5659
</Container>
5760
<Container minWidth="0">
@@ -98,6 +101,7 @@ export function SideBySideOrientation({
98101
additionalActions={additionalActions}
99102
infoContentHidden={infoContentHidden}
100103
isMetricOptionsEmpty={isMetricOptionsEmpty}
104+
title={title}
101105
/>
102106
</div>
103107
);
@@ -114,6 +118,7 @@ export function SideBySideOrientation({
114118
timeseriesResult={timeseriesResult}
115119
orientation={orientation}
116120
isMetricOptionsEmpty={isMetricOptionsEmpty}
121+
title={title}
117122
/>
118123
),
119124
default: defaultSplit,

static/app/views/explore/metrics/metricPanel/stackedOrientation.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ export function StackedOrientation({
1919
infoContentHidden,
2020
setInfoContentHidden,
2121
isMetricOptionsEmpty,
22+
title,
2223
}: {
2324
canChangeOrientation: boolean;
2425
infoContentHidden: boolean;
@@ -28,6 +29,7 @@ export function StackedOrientation({
2829
setOrientation: (orientation: TableOrientation) => void;
2930
timeseriesResult: ReturnType<typeof useMetricTimeseries>['result'];
3031
traceMetric: TraceMetric;
32+
title?: string;
3133
}) {
3234
const additionalInfoTabActions = (
3335
<Flex direction="row">
@@ -50,6 +52,7 @@ export function StackedOrientation({
5052
timeseriesResult={timeseriesResult}
5153
orientation={orientation}
5254
isMetricOptionsEmpty={isMetricOptionsEmpty}
55+
title={title}
5356
/>
5457
</StackedGraphWrapper>
5558
<div>

static/app/views/explore/metrics/metricToolbar/index.tsx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ interface MetricToolbarProps {
3535
dragAttributes?: DraggableAttributes;
3636
dragListeners?: SyntheticListenerMap;
3737
onEquationLabelsChange?: (equationLabel: string, labels: string[]) => void;
38+
onTitleChange?: (title: string) => void;
3839
referenceMap?: Record<string, string>;
3940
referencedMetricLabels?: Set<string>;
4041
}
@@ -47,6 +48,7 @@ export function MetricToolbar({
4748
dragAttributes,
4849
referencedMetricLabels,
4950
onEquationLabelsChange,
51+
onTitleChange,
5052
}: MetricToolbarProps) {
5153
const organization = useOrganization();
5254
const breakpoints = useBreakpoints();
@@ -80,10 +82,11 @@ export function MetricToolbar({
8082
);
8183

8284
const handleExpressionChange = useCallback(
83-
(newExpression: Expression) => {
85+
(newExpression: Expression, internalText: string) => {
8486
setVisualize(visualize.replace({yAxis: `${EQUATION_PREFIX}${newExpression.text}`}));
87+
onTitleChange?.(internalText);
8588
},
86-
[setVisualize, visualize]
89+
[setVisualize, visualize, onTitleChange]
8790
);
8891

8992
const dndGrid = dragListeners ? 'auto ' : '';

static/app/views/explore/metrics/metricsQueryParams.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,6 @@ export function useMetricLabel(): string {
160160
const {metric} = useTraceMetricContext();
161161

162162
if (isVisualizeEquation(visualize)) {
163-
// TODO: This should show the unresolved expression from the equation builder
164163
return visualize.expression.text;
165164
}
166165
if (isVisualizeFunction(visualize) && visualize.parsedFunction) {

0 commit comments

Comments
 (0)