From 09401b739e7d9392d25d724f36ffa4fd6cbbc73a Mon Sep 17 00:00:00 2001 From: "sentry[bot]" <39604003+sentry[bot]@users.noreply.github.com> Date: Mon, 27 Jul 2026 18:24:12 +0000 Subject: [PATCH 1/2] fix(dashboard): Correctly validate span and tracemetrics aggregates --- packages/cli/src/types/dashboard.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/cli/src/types/dashboard.ts b/packages/cli/src/types/dashboard.ts index 07b83188ec..c6f8c5981e 100644 --- a/packages/cli/src/types/dashboard.ts +++ b/packages/cli/src/types/dashboard.ts @@ -388,6 +388,10 @@ function extractFunctionName(aggregate: string): string { * Example: `p50(value,completion.duration_ms,distribution,none)` */ function isTracemetricsAggregate(aggregate: string): boolean { + // equation| prefix denotes a formula combining multiple tracemetrics aggregates + if (aggregate.startsWith("equation|")) { + return true; + } const parenIdx = aggregate.indexOf("("); if (parenIdx < 0) { return false; From b866d940942e27015dbbc3115e7406abcd78dda6 Mon Sep 17 00:00:00 2001 From: "jared-outpost[bot]" Date: Sat, 1 Aug 2026 10:39:01 +0000 Subject: [PATCH 2/2] test(dashboard): cover equation| tracemetrics aggregate validation --- packages/cli/test/types/dashboard.test.ts | 29 +++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/packages/cli/test/types/dashboard.test.ts b/packages/cli/test/types/dashboard.test.ts index 17702440b8..93f427fcc6 100644 --- a/packages/cli/test/types/dashboard.test.ts +++ b/packages/cli/test/types/dashboard.test.ts @@ -33,6 +33,7 @@ import { TABLE_DISPLAY_TYPES, type TextResult, TIMESERIES_DISPLAY_TYPES, + validateAggregateNames, validateWidgetLayout, WIDGET_TYPES, type WidgetDataResult, @@ -963,6 +964,34 @@ describe("mapWidgetTypeToDataset", () => { }); }); +describe("validateAggregateNames", () => { + test("accepts comma-separated tracemetrics aggregates", () => { + expect(() => + validateAggregateNames( + ["p50(value,completion.duration_ms,distribution,none)"], + "tracemetrics" + ) + ).not.toThrow(); + }); + + test("accepts equation| formula aggregates for tracemetrics", () => { + expect(() => + validateAggregateNames( + [ + "equation|p50(value,a,distribution,none) / p50(value,b,distribution,none)", + ], + "tracemetrics" + ) + ).not.toThrow(); + }); + + test("rejects span-style aggregates for tracemetrics", () => { + expect(() => validateAggregateNames(["count()"], "tracemetrics")).toThrow( + ValidationError + ); + }); +}); + // --------------------------------------------------------------------------- // validateWidgetLayout // ---------------------------------------------------------------------------