From fd0112a6f8ef15ea7e8fd6e8aecc989047f966d0 Mon Sep 17 00:00:00 2001 From: lebaudantoine Date: Fri, 14 Aug 2026 12:55:09 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=93=88(frontend)=20stop=20double-reportin?= =?UTF-8?q?g=20media=20device=20failures?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Only report `Other` `MediaDeviceFailure` cases as they genuinely need investigation. Make sure we do not report the same situation both as a media event and as a media exception when it is already handled. --- CHANGELOG.md | 1 + .../src/features/analytics/telemetry.ts | 1 + .../features/rooms/components/Conference.tsx | 3 ++- .../hooks/useWatchMediaDeviceErrors.ts | 19 ++++++++++--------- 4 files changed, 14 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a6b865c9..8f28a591 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,7 @@ and this project adheres to - 🐛(analytics) filter benign ResizeObserver loop error in Sentry/PostHog - 🐛(frontend) stop reporting screen-share denials as errors - 🐛(frontend) generalize screen-share error modal beyond macOS +- 📈(frontend) stop double-reporting media device failures ## [1.26.0] - 2026-08-12 diff --git a/src/frontend/src/features/analytics/telemetry.ts b/src/frontend/src/features/analytics/telemetry.ts index 8587c001..e208490d 100644 --- a/src/frontend/src/features/analytics/telemetry.ts +++ b/src/frontend/src/features/analytics/telemetry.ts @@ -23,6 +23,7 @@ export type LogCode = | 'livekit_room_error' | 'device_switch_failure' | 'permission_poll_failure' + | 'media_devices_error_event' // non-media families | 'participant_mute_api_failure' | 'permissions_api_failure' diff --git a/src/frontend/src/features/rooms/components/Conference.tsx b/src/frontend/src/features/rooms/components/Conference.tsx index d50df015..7149f999 100644 --- a/src/frontend/src/features/rooms/components/Conference.tsx +++ b/src/frontend/src/features/rooms/components/Conference.tsx @@ -225,9 +225,10 @@ export const Conference = ({ backgroundColor: 'primaryDark.50 !important', })} onError={(e) => { + const failure = MediaDeviceFailure.getFailure(e) + if (failure && failure !== MediaDeviceFailure.Other) return reportError('livekit_room_error', e, { path: 'connect_publish', - failure: MediaDeviceFailure.getFailure(e) ?? 'not-a-device-error', }) }} onConnected={async () => { diff --git a/src/frontend/src/features/rooms/livekit/hooks/useWatchMediaDeviceErrors.ts b/src/frontend/src/features/rooms/livekit/hooks/useWatchMediaDeviceErrors.ts index 99a871b1..47803444 100644 --- a/src/frontend/src/features/rooms/livekit/hooks/useWatchMediaDeviceErrors.ts +++ b/src/frontend/src/features/rooms/livekit/hooks/useWatchMediaDeviceErrors.ts @@ -50,15 +50,16 @@ export const useWatchMediaDeviceErrors = (): MediaDeviceAlert & { useEffect(() => { const onDeviceError = (error: Error, kind?: MediaDeviceKind) => { const failure = MediaDeviceFailure.getFailure(error) - if (!failure || !kind) return - - void captureMediaEvent('media-device-error', { - log_code: 'media_devices_error_event', - path: 'connect_publish', - failure, - kind, - }) - + if (!failure) return + if (failure != MediaDeviceFailure.Other) { + void captureMediaEvent('media-device-error', { + log_code: 'media_devices_error_event', + path: 'connect_publish', + failure, + kind: kind ?? 'unknown', + }) + } + if (!kind) return const permissionKind = PERMISSION_BY_DEVICE_KIND[kind] switch (failure) { case MediaDeviceFailure.DeviceInUse: