RTC Call Stats
Sometimes you need a way to capture certain metrics related to a call. This may be helpful if you want to tailor the experience to your users or debug issues. Typical metrics of interest are audio/video bitrate, round trip time, total consumed bandwidth and packet loss.
100ms SDK provides this data via certain events. These events are emitted continuously within a fixed interval of one second after a room has been joined. You can get stats:
- as an overall summary by subscribing to
HMSUpdateListenerActions.ON_RTC_STATS
event, or - on a per track basis by subscribing to
HMSUpdateListenerActions.ON_LOCAL_AUDIO_STATS
event for local audio stats,HMSUpdateListenerActions.ON_LOCAL_VIDEO_STATS
event for local video stats,HMSUpdateListenerActions.ON_REMOTE_AUDIO_STATS
event for remote peers' audio stats,HMSUpdateListenerActions.ON_REMOTE_VIDEO_STATS
event for remote peers' video stats
To get a list of all events emitted by the 100ms React Native SDK, check out Event Listener guide
Let's see how we can get Stats by subscribing to above events -
Subscribe to Events
You can subscribe to stats events as per your use case:
HMSUpdateListenerActions.ON_RTC_STATS
: This event provides combined stats for the Room session.HMSUpdateListenerActions.ON_LOCAL_AUDIO_STATS
: This event provides stats for local audio track.HMSUpdateListenerActions.ON_LOCAL_VIDEO_STATS
: This event provides stats for local video track with all the available layers.HMSUpdateListenerActions.ON_REMOTE_AUDIO_STATS
: This event provides stats for remote peers' audio tracks.HMSUpdateListenerActions.ON_REMOTE_VIDEO_STATS
: This event provides stats for remote peers' video tracks.
const onChangeRtcStats = (data: { rtcStats: HMSRTCStatsReport // `HMSRTCStatsReport` is explained in 'Supplementary bytes' section }) => { console.log(data.rtcStats); }; hmsInstance.addEventListener(HMSUpdateListenerActions.ON_RTC_STATS, onChangeRtcStats); // This function is subscribed to `ON_LOCAL_AUDIO_STATS` event const onChangeLocalAudioStats = (data: { localAudioStats: HMSLocalAudioStats, // `HMSLocalAudioStats` is explained in 'Supplementary bytes' section track: HMSLocalAudioTrack, peer: HMSPeer }) => { console.log(data.localAudioStats); }; hmsInstance.addEventListener( HMSUpdateListenerActions.ON_LOCAL_AUDIO_STATS, onChangeLocalAudioStats ); // This function is subscribed to `ON_LOCAL_VIDEO_STATS` event const onChangeLocalVideoStats = (data: { localVideoStats: HMSLocalVideoStats, // `HMSLocalVideoStats` is explained in 'Supplementary bytes' section track: HMSLocalVideoTrack, peer: HMSPeer }) => { console.log(data.localVideoStats); }; hmsInstance.addEventListener( HMSUpdateListenerActions.ON_LOCAL_VIDEO_STATS, onChangeLocalVideoStats ); // This function is subscribed to `ON_REMOTE_AUDIO_STATS` event const onChangeRemoteAudioStats = (data: { remoteAudioStats: HMSRemoteAudioStats, // `HMSRemoteAudioStats` is explained in 'Supplementary bytes' section track: HMSRemoteAudioTrack, peer: HMSPeer }) => { console.log(data.remoteAudioStats); }; hmsInstance.addEventListener( HMSUpdateListenerActions.ON_REMOTE_AUDIO_STATS, onChangeRemoteAudioStats ); // This function is subscribed to `ON_REMOTE_VIDEO_STATS` event const onChangeRemoteVideoStats = (data: { remoteVideoStats: HMSRemoteVideoStats, // `HMSRemoteVideoStats` is explained in 'Supplementary bytes' section track: HMSRemoteVideoTrack, peer: HMSPeer }) => { console.log(data.remoteVideoStats); }; hmsInstance.addEventListener( HMSUpdateListenerActions.ON_REMOTE_VIDEO_STATS, onChangeRemoteVideoStats );
Unsubscribe from Events
You can remove your event subscriptions after you are done with these stats and don't want to receive these event updates anymore -
hmsInstance.removeEventListener(HMSUpdateListenerActions.ON_RTC_STATS); hmsInstance.removeEventListener(HMSUpdateListenerActions.ON_LOCAL_AUDIO_STATS); hmsInstance.removeEventListener(HMSUpdateListenerActions.ON_LOCAL_VIDEO_STATS); hmsInstance.removeEventListener(HMSUpdateListenerActions.ON_REMOTE_AUDIO_STATS); hmsInstance.removeEventListener(HMSUpdateListenerActions.ON_REMOTE_VIDEO_STATS);
Supplementary bytes
HMSRTCStatsReport
This class will contain the combined stats for the Room. Interface for HMSRTCStatsReport
class looks like -
interface HMSRTCStats { // Total bytes sent in the current session. bytesSent?: number; // Total bytes received in the current session. bytesReceived?: number; // Total packets received in the current session. packetsReceived?: number; // Total packets lost in the current session. packetsLost?: number; // Total outgoing bitrate observed since previous report. bitrateSent?: number; // Total incoming bitrate observed since previous report in Kb/s. bitrateReceived?: number; // Average round trip time observed since previous report in seconds. roundTripTime?: number; } interface HMSRTCStatsReport { // Summary of all video tracks video?: HMSRTCStats; // Summary of all audio tracks audio?: HMSRTCStats; // Combined audio + video values combined?: HMSRTCStats; }
HMSLocalAudioStats
This class contains stats related to local audio track. Interface for HMSLocalAudioStats
class looks like -
interface HMSLocalAudioStats { // Round trip time observed since previous report. roundTripTime?: number; // Total bytes sent by this track in the current session. bytesSent?: number; // Outgoing bitrate of this track observed since previous report in Kb/s. bitrate?: number; }
HMSLocalVideoStats
This class contains stats related to local video track. Interface for HMSLocalVideoStats
class looks like -
interface HMSVideoResolution { height?: number; width?: number; } interface HMSLocalVideoStats { // Round trip time observed since previous report. roundTripTime?: number; // Total bytes sent by this track in the current session. bytesSent?: number; // Outgoing bitrate of this track observed since previous report in Kb/s. bitrate?: number; // Resolution of video frames being sent. resolution?: HMSVideoResolution; // Frame rate of video frames being sent (FPS). frameRate?: number; }
HMSRemoteAudioStats
This class contains stats related to remote audio track. Interface for HMSRemoteAudioStats
class looks like -
class HMSRemoteAudioStats { // Packet Jitter measured in seconds for this track. Calculated as defined in section 6.4.1. of RFC3550. jitter?: number; // Total bytes received by this track in the current session. bytesReceived?: number; // Incoming bitrate of this track observed since previous report in Kb/s. bitrate?: number; // Total packets received by this track in the current session. packetsReceived?: number; // Total packets lost by this track in the current session. packetsLost?: number; }
HMSRemoteVideoStats
This class contains stats related to remote video track. Interface for HMSRemoteVideoStats
class looks like -
interface HMSVideoResolution { height?: number; width?: number; } class HMSRemoteVideoStats { // Packet Jitter measured in seconds for this track. Calculated as defined in section 6.4.1. of RFC3550. jitter?: number; // Total bytes received by this track in the current session. bytesReceived?: number; // Incoming bitrate of this track observed since previous report in Kb/s. bitrate?: number; // Total packets received by this track in the current session. packetsReceived?: number; // Total packets lost by this track in the current session. packetsLost?: number; // Resolution of video frames being received. resolution?: HMSVideoResolution; // Frame rate of video frames being received (FPS). frameRate?: number; }