From a87496b381ed096dc06d8cd5e65cddf8ac554a39 Mon Sep 17 00:00:00 2001 From: ANSHSINGH050404 <114014895+ANSHSINGH050404@users.noreply.github.com> Date: Mon, 20 Jul 2026 12:23:24 +0530 Subject: [PATCH] fix(webapp): convert epoch-ms to BigInt before nanosecond multiply Avoids IEEE 754 precision loss when ms * 1e6 exceeds Number.MAX_SAFE_INTEGER. Closes #3292 --- .server-changes/fix-otlp-nanosecond-overflow.md | 6 ++++++ apps/webapp/app/v3/eventRepository/common.server.ts | 4 ++-- apps/webapp/app/v3/runEngineHandlers.server.ts | 2 +- 3 files changed, 9 insertions(+), 3 deletions(-) create mode 100644 .server-changes/fix-otlp-nanosecond-overflow.md diff --git a/.server-changes/fix-otlp-nanosecond-overflow.md b/.server-changes/fix-otlp-nanosecond-overflow.md new file mode 100644 index 00000000000..b895deffc11 --- /dev/null +++ b/.server-changes/fix-otlp-nanosecond-overflow.md @@ -0,0 +1,6 @@ +--- +area: webapp +type: fix +--- + +Improve accuracy of run timeline timestamps by converting times to nanoseconds without floating-point rounding errors. diff --git a/apps/webapp/app/v3/eventRepository/common.server.ts b/apps/webapp/app/v3/eventRepository/common.server.ts index eb8bf7f23ec..b16518beae5 100644 --- a/apps/webapp/app/v3/eventRepository/common.server.ts +++ b/apps/webapp/app/v3/eventRepository/common.server.ts @@ -25,7 +25,7 @@ export function extractContextFromCarrier(carrier: Record) { } export function getNowInNanoseconds(): bigint { - return BigInt(new Date().getTime() * 1_000_000); + return BigInt(new Date().getTime()) * BigInt(1_000_000); } export function getDateFromNanoseconds(nanoseconds: bigint): Date { @@ -39,7 +39,7 @@ export function calculateDurationFromStart( ) { const $endtime = typeof endTime === "string" ? new Date(endTime) : endTime; - const duration = Number(BigInt($endtime.getTime() * 1_000_000) - startTime); + const duration = Number(BigInt($endtime.getTime()) * BigInt(1_000_000) - startTime); if (minimumDuration && duration < minimumDuration) { return minimumDuration; diff --git a/apps/webapp/app/v3/runEngineHandlers.server.ts b/apps/webapp/app/v3/runEngineHandlers.server.ts index c44bcc54cec..0d83aad8e2a 100644 --- a/apps/webapp/app/v3/runEngineHandlers.server.ts +++ b/apps/webapp/app/v3/runEngineHandlers.server.ts @@ -555,7 +555,7 @@ export function registerRunEngineEventBusHandlers() { ); await eventRepository.recordEvent(retryMessage, { - startTime: BigInt(time.getTime() * 1000000), + startTime: BigInt(time.getTime()) * BigInt(1_000_000), taskSlug: run.taskIdentifier, environment, attributes: {