From 527d91d9bd0f5263b7cbc47af32f5bdc5e50f41e Mon Sep 17 00:00:00 2001 From: Minh Vu Date: Sun, 5 Jul 2026 00:29:49 +0200 Subject: [PATCH 1/2] Escape OData filter values in msbench metrics API --- .../api/src/functions/getMsbenchEvalMetrics.ts | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/dashboard/api/src/functions/getMsbenchEvalMetrics.ts b/dashboard/api/src/functions/getMsbenchEvalMetrics.ts index a5db45337..84c3041e5 100644 --- a/dashboard/api/src/functions/getMsbenchEvalMetrics.ts +++ b/dashboard/api/src/functions/getMsbenchEvalMetrics.ts @@ -23,6 +23,11 @@ function getEvalTableClient(): TableClient { ); } +/** Escape a value for use inside an OData string literal (single quotes are doubled). */ +function odataLiteral(value: string): string { + return value.replace(/'/g, "''"); +} + /** * Returns eval metrics from the table. * GET /api/msbench-eval-metrics @@ -39,8 +44,8 @@ async function getMsbenchEvalMetrics(request: HttpRequest, context: InvocationCo const tableClient = getEvalTableClient(); const filters: string[] = []; - if (filterBenchmark) filters.push(`benchmark eq '${filterBenchmark}'`); - if (filterModel) filters.push(`model eq '${filterModel}'`); + if (filterBenchmark) filters.push(`benchmark eq '${odataLiteral(filterBenchmark)}'`); + if (filterModel) filters.push(`model eq '${odataLiteral(filterModel)}'`); if (filterResolved === "1" || filterResolved === "0") filters.push(`resolved eq ${Number(filterResolved)}`); const filter = filters.length > 0 ? filters.join(" and ") : undefined; @@ -64,11 +69,11 @@ async function getMsbenchEvalMetrics(request: HttpRequest, context: InvocationCo body: JSON.stringify(entities), }; } catch (err: any) { - context.log("Error querying eval metrics:", err.message); + context.error("Error querying eval metrics:", err?.message ?? err); return { status: 500, headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ error: err.message }), + body: JSON.stringify({ error: "Failed to query eval metrics" }), }; } } @@ -101,11 +106,11 @@ async function getMsbenchEvalFilters(request: HttpRequest, context: InvocationCo }), }; } catch (err: any) { - context.log("Error querying eval filters:", err.message); + context.error("Error querying eval filters:", err?.message ?? err); return { status: 500, headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ error: err.message }), + body: JSON.stringify({ error: "Failed to query eval filters" }), }; } } From 9a55b06e3b04e4510b262a59ec0861a4e6b1253b Mon Sep 17 00:00:00 2001 From: Minh Vu Date: Sun, 5 Jul 2026 00:35:32 +0200 Subject: [PATCH 2/2] Log full errors in msbench eval metrics API --- dashboard/api/src/functions/getMsbenchEvalMetrics.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dashboard/api/src/functions/getMsbenchEvalMetrics.ts b/dashboard/api/src/functions/getMsbenchEvalMetrics.ts index 84c3041e5..f52ba8bdc 100644 --- a/dashboard/api/src/functions/getMsbenchEvalMetrics.ts +++ b/dashboard/api/src/functions/getMsbenchEvalMetrics.ts @@ -69,7 +69,7 @@ async function getMsbenchEvalMetrics(request: HttpRequest, context: InvocationCo body: JSON.stringify(entities), }; } catch (err: any) { - context.error("Error querying eval metrics:", err?.message ?? err); + context.error("Error querying eval metrics:", err); return { status: 500, headers: { "Content-Type": "application/json" }, @@ -106,7 +106,7 @@ async function getMsbenchEvalFilters(request: HttpRequest, context: InvocationCo }), }; } catch (err: any) { - context.error("Error querying eval filters:", err?.message ?? err); + context.error("Error querying eval filters:", err); return { status: 500, headers: { "Content-Type": "application/json" },