From 8ad31af72a90880431af729df0a822e59c6d293e Mon Sep 17 00:00:00 2001 From: saravanakumardb1 Date: Sat, 28 Feb 2026 02:36:55 -0800 Subject: [PATCH] chore(telemetry): add tracing headers to flush + .env.example --- web/.env.example | 5 +++++ web/.gitignore | 1 + web/src/lib/telemetry.ts | 22 +++++++++++++--------- 3 files changed, 19 insertions(+), 9 deletions(-) create mode 100644 web/.env.example diff --git a/web/.env.example b/web/.env.example new file mode 100644 index 0000000..3e9c855 --- /dev/null +++ b/web/.env.example @@ -0,0 +1,5 @@ +# ChronoMind Web — Environment Configuration +# Copy to .env.local and fill in values + +# Platform Service (backend API for sync, auth, telemetry) +NEXT_PUBLIC_PLATFORM_SERVICE_URL=http://localhost:4003/api diff --git a/web/.gitignore b/web/.gitignore index cf4579f..d2097c8 100644 --- a/web/.gitignore +++ b/web/.gitignore @@ -35,6 +35,7 @@ yarn-error.log* # env files (can opt-in for committing if needed) .env* +!.env.example # vercel .vercel diff --git a/web/src/lib/telemetry.ts b/web/src/lib/telemetry.ts index 0302b4f..087028a 100644 --- a/web/src/lib/telemetry.ts +++ b/web/src/lib/telemetry.ts @@ -121,16 +121,20 @@ export function flush(): void { const body = JSON.stringify({ productId: PRODUCT_ID, events }); const url = `${baseUrl}/telemetry/events`; + const headers: Record = { + 'Content-Type': 'application/json', + 'x-product-id': PRODUCT_ID, + 'x-request-id': uuid(), + }; + try { - const sent = navigator.sendBeacon(url, body); - if (!sent) { - fetch(url, { - method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body, - keepalive: true, - }).catch(() => {}); - } + // sendBeacon doesn't support custom headers — use fetch with keepalive + fetch(url, { + method: 'POST', + headers, + body, + keepalive: true, + }).catch(() => {}); } catch { // Best effort — telemetry is non-critical }