Saves PeerConnection statistics and prepares to send them over XMPP(written by Boris Grozev).
This commit is contained in:
parent
71b63cd0b3
commit
7e90d73003
|
@ -28,5 +28,6 @@ var config = {
|
|||
useBundle: true,
|
||||
enableRecording: true,
|
||||
enableWelcomePage: false,
|
||||
enableSimulcast: false
|
||||
enableSimulcast: false,
|
||||
logStats: false // Enable logging of PeerConnection stats via the focus
|
||||
};
|
||||
|
|
109
rtp_sts.js
109
rtp_sts.js
|
@ -1,4 +1,5 @@
|
|||
/* global ssrc2jid */
|
||||
/* jshint -W117 */
|
||||
/**
|
||||
* Calculates packet lost percent using the number of lost packets and the
|
||||
* number of all packet.
|
||||
|
@ -125,6 +126,37 @@ function StatsCollector(peerconnection, audioLevelsInterval,
|
|||
this.currentStatsReport = null;
|
||||
this.baselineStatsReport = null;
|
||||
this.audioLevelsIntervalId = null;
|
||||
|
||||
/**
|
||||
* Gather PeerConnection stats once every this many milliseconds.
|
||||
*/
|
||||
this.GATHER_INTERVAL = 10000;
|
||||
|
||||
/**
|
||||
* Log stats via the focus once every this many milliseconds.
|
||||
*/
|
||||
this.LOG_INTERVAL = 60000;
|
||||
|
||||
/**
|
||||
* Gather stats and store them in this.statsToBeLogged.
|
||||
*/
|
||||
this.gatherStatsIntervalId = null;
|
||||
|
||||
/**
|
||||
* Send the stats already saved in this.statsToBeLogged to be logged via
|
||||
* the focus.
|
||||
*/
|
||||
this.logStatsIntervalId = null;
|
||||
|
||||
/**
|
||||
* Stores the statistics which will be send to the focus to be logged.
|
||||
*/
|
||||
this.statsToBeLogged =
|
||||
{
|
||||
timestamps: [],
|
||||
stats: {}
|
||||
};
|
||||
|
||||
// Updates stats interval
|
||||
this.audioLevelsIntervalMilis = audioLevelsInterval;
|
||||
|
||||
|
@ -148,6 +180,10 @@ StatsCollector.prototype.stop = function ()
|
|||
this.audioLevelsIntervalId = null;
|
||||
clearInterval(this.statsIntervalId);
|
||||
this.statsIntervalId = null;
|
||||
clearInterval(this.logStatsIntervalId);
|
||||
this.logStatsIntervalId = null;
|
||||
clearInterval(this.gatherStatsIntervalId);
|
||||
this.gatherStatsIntervalId = null;
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -204,8 +240,81 @@ StatsCollector.prototype.start = function ()
|
|||
},
|
||||
self.statsIntervalMilis
|
||||
);
|
||||
|
||||
if (config.logStats) {
|
||||
this.gatherStatsIntervalId = setInterval(
|
||||
function () {
|
||||
self.peerconnection.getStats(
|
||||
function (report) {
|
||||
self.addStatsToBeLogged(report.result());
|
||||
},
|
||||
function () {
|
||||
}
|
||||
);
|
||||
},
|
||||
this.GATHER_INTERVAL
|
||||
);
|
||||
|
||||
this.logStatsIntervalId = setInterval(
|
||||
function() { self.logStats(); },
|
||||
this.LOG_INTERVAL);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Converts the stats to the format used for logging, and saves the data in
|
||||
* this.statsToBeLogged.
|
||||
* @param reports Reports as given by webkitRTCPerConnection.getStats.
|
||||
*/
|
||||
StatsCollector.prototype.addStatsToBeLogged = function (reports) {
|
||||
var self = this;
|
||||
var num_records = this.statsToBeLogged.timestamps.length;
|
||||
this.statsToBeLogged.timestamps.push(new Date().getTime());
|
||||
reports.map(function (report) {
|
||||
var stat = self.statsToBeLogged.stats[report.id];
|
||||
if (!stat) {
|
||||
stat = self.statsToBeLogged.stats[report.id] = {};
|
||||
}
|
||||
stat.type = report.type;
|
||||
report.names().map(function (name) {
|
||||
var values = stat[name];
|
||||
if (!values) {
|
||||
values = stat[name] = [];
|
||||
}
|
||||
while (values.length < num_records) {
|
||||
values.push(null);
|
||||
}
|
||||
values.push(report.stat(name));
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
StatsCollector.prototype.logStats = function () {
|
||||
var deflate = true;
|
||||
|
||||
var content = JSON.stringify(this.statsToBeLogged);
|
||||
if (deflate) {
|
||||
content = String.fromCharCode.apply(null, Pako.deflateRaw(content));
|
||||
}
|
||||
content = Base64.encode(content);
|
||||
|
||||
// XEP-0337-ish
|
||||
var message = $msg();
|
||||
message.c('log', { xmlns: 'urn:xmpp:eventlog',
|
||||
id: 'PeerConnectionStats'});
|
||||
message.c('message').t(content).up();
|
||||
if (deflate) {
|
||||
message.c('tag', {name: "deflated", value: "true"}).up();
|
||||
}
|
||||
message.up();
|
||||
|
||||
//TODO: actually send the message...
|
||||
console.log(message.toString());
|
||||
|
||||
// Reset the stats
|
||||
this.statsToBeLogged.stats = {};
|
||||
this.statsToBeLogged.timestamps = [];
|
||||
};
|
||||
|
||||
/**
|
||||
* Stats processing logic.
|
||||
|
|
Loading…
Reference in New Issue