From 6a868b3787b2b339a64bbc0973b0d8825d53b3a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miguel=20=C3=81ngel?= Date: Thu, 21 May 2026 12:18:55 -0400 Subject: [PATCH] feat(studio): add stack traces to all error telemetry events MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Send `stack_trace` (up to 4KB) on crash, unhandled_error, and unhandled_promise_rejection events so PostHog captures the full JS call stack for debugging. Also bump `component_stack` from 500→2000 chars, and add `error_name` to promise rejections. --- .../src/components/StudioErrorBoundary.tsx | 3 ++- packages/studio/src/main.tsx | 26 ++++++++++++++----- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/packages/studio/src/components/StudioErrorBoundary.tsx b/packages/studio/src/components/StudioErrorBoundary.tsx index 4a1deb6de5..429974bc90 100644 --- a/packages/studio/src/components/StudioErrorBoundary.tsx +++ b/packages/studio/src/components/StudioErrorBoundary.tsx @@ -21,7 +21,8 @@ export class StudioErrorBoundary extends Component { trackStudioEvent("crash", { error_message: error.message, error_name: error.name, - component_stack: info.componentStack?.slice(0, 500) ?? null, + stack_trace: error.stack?.slice(0, 4000) ?? null, + component_stack: info.componentStack?.slice(0, 2000) ?? null, }); } diff --git a/packages/studio/src/main.tsx b/packages/studio/src/main.tsx index ac0a2af59e..52c4433220 100644 --- a/packages/studio/src/main.tsx +++ b/packages/studio/src/main.tsx @@ -7,19 +7,33 @@ import "./styles/studio.css"; trackStudioEvent("session_start"); +function errorProps(value: unknown): { + error_message: string; + error_name: string | null; + stack_trace: string | null; +} { + if (value instanceof Error) { + return { + error_message: value.message, + error_name: value.name, + stack_trace: value.stack?.slice(0, 4000) ?? null, + }; + } + return { error_message: String(value), error_name: null, stack_trace: null }; +} + window.addEventListener("error", (event) => { trackStudioEvent("unhandled_error", { + ...errorProps(event.error), error_message: event.message, - filename: event.filename ?? null, - lineno: event.lineno ?? null, - colno: event.colno ?? null, + filename: event.filename, + lineno: event.lineno, + colno: event.colno, }); }); window.addEventListener("unhandledrejection", (event) => { - trackStudioEvent("unhandled_promise_rejection", { - error_message: event.reason instanceof Error ? event.reason.message : String(event.reason), - }); + trackStudioEvent("unhandled_promise_rejection", errorProps(event.reason)); }); createRoot(document.getElementById("root")!).render(