feat(logging): Store JS console logs in RTCStats.

With this commit JS console logs can optionally be sent to the RTCstats server
for storage and processing.

The functionality is off by default and can be enabled by setting to `true` the
config.js option

    config.analytics.rtcstatsStoreLogs: false // off by default

Obviously, if rtcstats is disabled/not configured nothing will be sent to the
rtcstats backend, even if this setting is set to `true`.

This commit also adds a config.js option that can be used to disable sending the
logs back to callstats:

    config.callstatsStoreLogs: true // on by default

Obviously, if callstats is disabled nothing would be sent in the first place,
but if callstats is enabled and this new configuration parameter is set to
`false`, then callstats will be kept active but no logs will be sent to
callstats.
This commit is contained in:
George Politis 2022-08-25 12:41:05 +00:00 committed by George Politis
parent 7dba5f8a7e
commit 289ece42df
3 changed files with 66 additions and 0 deletions

View File

@ -822,6 +822,7 @@ var config = {
// Application ID and Secret.
// callStatsID: '',
// callStatsSecret: '',
// callstatsStoreLogs: true,
// The callstats initialize config params as described in the API:
// https://docs.callstats.io/docs/javascript#callstatsinitialize-with-app-secret
@ -958,6 +959,7 @@ var config = {
// PeerConnection states along with getStats metrics polled at the specified
// interval.
// rtcstatsEnabled: false,
// rtcstatsStoreLogs: false,
// In order to enable rtcstats one needs to provide a endpoint url.
// rtcstatsEndpoint: wss://rtcstats-server-pilot.jitsi.net/,

View File

@ -1,3 +1,8 @@
/* eslint-disable lines-around-comment */
// @ts-ignore
import RTCStats from '../../rtcstats/RTCStats';
// @ts-ignore
import { canSendRtcstatsData } from '../../rtcstats/functions';
// @ts-ignore
import { getCurrentConference } from '../conference';
@ -45,6 +50,38 @@ export default class JitsiMeetLogStorage {
return Boolean(conference);
}
/**
* Checks whether callstats logs storage is enabled.
*
* @returns {boolean} <tt>true</tt> when this storage can store logs to
* callstats, <tt>false</tt> otherwise.
*/
canStoreLogsCallstats() {
const { callstatsStoreLogs } = this.getState()['features/base/config'];
// The behavior prior to adding this configuration parameter, is to send logs to callstats (if callstats is
// enabled). So, in order to maintain backwards compatibility I set the default of this option to be true, i.e.
// if the config.callstatsStoreLogs is not set, the JS console logs will be sent to callstats (if callstats is
// enabled)
return callstatsStoreLogs || callstatsStoreLogs === undefined;
}
/**
* Checks whether rtcstats logs storage is enabled.
*
* @returns {boolean} <tt>true</tt> when this storage can store logs to
* rtcstats, <tt>false</tt> otherwise.
*/
canStoreLogsRtcstats() {
const config = this.getState()['features/base/config'];
// Saving the logs in RTCStats is a new feature and so there is no prior behavior that needs to be maintained.
// That said, this is still experimental and needs to be rolled out gradually so we want this to be off by
// default.
return config?.analytics?.rtcstatsStoreLogs && canSendRtcstatsData(this.getState());
}
/**
* Called by the <tt>LogCollector</tt> to store a series of log lines into
* batch.
@ -54,6 +91,23 @@ export default class JitsiMeetLogStorage {
* @returns {void}
*/
storeLogs(logEntries: Array<string|any>) {
if (this.canStoreLogsCallstats()) {
this.storeLogsCallstats(logEntries);
}
if (this.canStoreLogsRtcstats()) {
RTCStats.sendLogs(logEntries);
}
}
/**
* Store the console logs in callstats (if callstats is enabled).
*
* @param {Array<string|any>} logEntries - The log entries to send to the rtcstats server.
* @returns {void}
*/
storeLogsCallstats(logEntries: Array<string|any>) {
const conference = getCurrentConference(this.getState());
if (!conference || !conference.isCallstatsEnabled()) {

View File

@ -85,6 +85,16 @@ class RTCStats {
this.trace && this.trace.identity('identity', null, identityData);
}
/**
* Send console logs to rtcstats server.
*
* @param {Array<string|any>} logEntries - The log entries to send to the rtcstats server.
* @returns {void}
*/
sendLogs(logEntries) {
this.trace && this.trace.statsEntry('logs', null, logEntries);
}
/**
* Send dominant speaker data, the data will be processed by rtcstats-server and saved in the dump file.
*