Log candidates for calls
First attempt at this was sending everything from RTCPeerConnection.getStats() as a separate item in the rageshake, but the rageshake server doesn't handle that in a particularly sensible way and it's probably better to pick & choose what data we want explicitly from a privacy PoV. This summarises the candidates used for the calls into the log that will be included in rageshakes so we can diagnose connectivity issues from rageshakes. Requires https://github.com/matrix-org/matrix-js-sdk/pull/1584
This commit is contained in:
parent
303694754b
commit
ec0266d82b
1 changed files with 38 additions and 0 deletions
|
@ -356,6 +356,7 @@ export default class CallHandler {
|
||||||
this.play(AudioID.Ringback);
|
this.play(AudioID.Ringback);
|
||||||
break;
|
break;
|
||||||
case CallState.Ended:
|
case CallState.Ended:
|
||||||
|
{
|
||||||
Analytics.trackEvent('voip', 'callEnded', 'hangupReason', call.hangupReason);
|
Analytics.trackEvent('voip', 'callEnded', 'hangupReason', call.hangupReason);
|
||||||
this.removeCallForRoom(mappedRoomId);
|
this.removeCallForRoom(mappedRoomId);
|
||||||
if (oldState === CallState.InviteSent && (
|
if (oldState === CallState.InviteSent && (
|
||||||
|
@ -393,6 +394,9 @@ export default class CallHandler {
|
||||||
// don't play the end-call sound for calls that never got off the ground
|
// don't play the end-call sound for calls that never got off the ground
|
||||||
this.play(AudioID.CallEnd);
|
this.play(AudioID.CallEnd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.logCallStats(call, mappedRoomId);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
call.on(CallEvent.Replaced, (newCall: MatrixCall) => {
|
call.on(CallEvent.Replaced, (newCall: MatrixCall) => {
|
||||||
|
@ -412,6 +416,40 @@ export default class CallHandler {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private async logCallStats(call: MatrixCall, mappedRoomId: string) {
|
||||||
|
const stats = await call.getCurrentCallStats();
|
||||||
|
logger.debug(
|
||||||
|
`Call completed. Call ID: ${call.callId}, virtual room ID: ${call.roomId}, ` +
|
||||||
|
`user-facing room ID: ${mappedRoomId}, direction: ${call.direction}, ` +
|
||||||
|
`our Party ID: ${call.ourPartyId}, hangup party: ${call.hangupParty}, ` +
|
||||||
|
`hangup reason: ${call.hangupReason}`,
|
||||||
|
);
|
||||||
|
logger.debug("Local candidates:");
|
||||||
|
for (const cand of stats.filter(item => item.type === 'local-candidate')) {
|
||||||
|
logger.debug(
|
||||||
|
`${cand.id} - type: ${cand.candidateType}, ip: ${cand.ip}, port: ${cand.port}, ` +
|
||||||
|
`protocol: ${cand.protocol}, relay protocol: ${cand.relayProtocol}, network type: ${cand.networkType}`,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
logger.debug("Remote candidates:");
|
||||||
|
for (const cand of stats.filter(item => item.type === 'remote-candidate')) {
|
||||||
|
logger.debug(
|
||||||
|
`${cand.id} - type: ${cand.candidateType}, ip: ${cand.ip}, port: ${cand.port}, ` +
|
||||||
|
`protocol: ${cand.protocol}`,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
logger.debug("Candidate pairs:");
|
||||||
|
for (const pair of stats.filter(item => item.type === 'candidate-pair')) {
|
||||||
|
logger.debug(
|
||||||
|
`${pair.localCandidateId} / ${pair.remoteCandidateId} - state: ${pair.state}, ` +
|
||||||
|
`nominated: ${pair.nominated}, ` +
|
||||||
|
`requests sent ${pair.requestsSent}, requests received ${pair.requestsReceived}, ` +
|
||||||
|
`responses received: ${pair.responsesReceived}, responses sent: ${pair.responsesSent}, ` +
|
||||||
|
`bytes received: ${pair.bytesReceived}, bytes sent: ${pair.bytesSent}, `,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private setCallAudioElement(call: MatrixCall) {
|
private setCallAudioElement(call: MatrixCall) {
|
||||||
const audioElement = getRemoteAudioElement();
|
const audioElement = getRemoteAudioElement();
|
||||||
if (audioElement) call.setRemoteAudioElement(audioElement);
|
if (audioElement) call.setRemoteAudioElement(audioElement);
|
||||||
|
|
Loading…
Reference in a new issue