WebRTC Metrics

A comprehensive overview of WebRTC statistics, derived calculations, extracted features, and observable signals, to better understand call quality, connectivity, and user experience in rtcStats

Back
clienttrackslifecyclecapturedevices

Client track lifecycle (feature)

Client-level features flagging tracks that ended, or ended almost immediately after capture.

Description

Client-level features, extracted per session into features_client. These cover tracks that are not bound to a peer connection.

rtcstats-server derives these flags from the client trace:

  • audioEnded - an audio track fired its onended event during the session.
  • videoEnded - a video track fired its onended event during the session.
  • audioShortDuration - an audio track ended less than 1000 ms after getUserMedia succeeded.
  • videoShortDuration - a video track ended less than 1000 ms after getUserMedia succeeded.

Why it matters

A track that fires onended on its own was not stopped by your code: the device was unplugged, the driver dropped it, or the OS pulled the stream. The short-duration flags are the sharper signal. A track that dies within a second of a successful getUserMedia almost never reflects a user who joined and left on purpose; it points at a broken or busy device, a permission that was granted then revoked, or a capture that never really started. Trending these flags across the population surfaces flaky-hardware cohorts and instant-hangup patterns that a plain success count hides, because getUserMedia reports success right before the track collapses.

SQL example

Rate of tracks that died within a second of capture, last 7 days:

SELECT
  COUNT(*) FILTER (WHERE client.audio_short_duration)::float / NULLIF(COUNT(*), 0) AS audio_short_rate,
  COUNT(*) FILTER (WHERE client.video_short_duration)::float / NULLIF(COUNT(*), 0) AS video_short_rate
FROM "rtcstats-server" AS server
JOIN features_metadata AS metadata ON metadata.dump_id = server.id
JOIN features_client   AS client   ON client.dump_id   = metadata.id
WHERE server.created_at > NOW() - INTERVAL '7 days';

See also