// RUM issue capture: forwards client-side errors into the OpenTelemetry RUM // pipeline (window.OtelRUM is loaded from otel.k6n.net in index.html). export function captureRumIssue( message: string, severity = 'ERROR', extra: Record = {}, ): void { const rum = (globalThis as Record).OtelRUM?.last; if (!rum || typeof rum.captureMessage !== 'function') return; try { rum.captureMessage(message, severity, extra); } catch (err) { console.warn('RUM capture failed', err); } } export function installGlobalErrorHandlers(): void { window.addEventListener('error', (event) => { captureRumIssue(event.message || 'Unhandled browser error', 'ERROR', { source: event.filename, line: event.lineno, column: event.colno, }); }); window.addEventListener('unhandledrejection', (event) => { const reason = (event as PromiseRejectionEvent).reason; captureRumIssue(`Unhandled promise rejection: ${reason?.message || reason || 'unknown error'}`, 'ERROR', { name: reason?.name, stack: reason?.stack, }); }); } /** Trace headers for fetches so server spans link to the browser trace. */ export function rumTraceHeaders(): Record { const rum = (window as Record).rum; if (rum && typeof rum.traceHeaders === 'function') return rum.traceHeaders() || {}; return {}; }