mirror of
https://github.com/openmhz/trunk-server.git
synced 2026-11-09 23:37:31 -05:00
264 lines
9.2 KiB
JavaScript
264 lines
9.2 KiB
JavaScript
var util = require("util");
|
|
var db = require('./db');
|
|
var stats = {};
|
|
var callTotals = {};
|
|
var errorTotals = {};
|
|
const timePeriod = 15; // in minutes
|
|
var spots = (24*60) / timePeriod; // the number of spots needed to keep track of 24 hours of stats
|
|
|
|
|
|
function updateActiveSystems() {
|
|
|
|
// Go through all of the Syste,s
|
|
db.get().collection('systems', function(err, sysCollection) {
|
|
var cursor = sysCollection.find();
|
|
cursor.each(function(err, item) {
|
|
// go through all the systems
|
|
|
|
// While there are still Systems to work with
|
|
if (item) {
|
|
// if you have recieved some calls during that last period, make the system active
|
|
if ((callTotals[item.shortName] != undefined) && (callTotals[item.shortName][0] > 0)) {
|
|
const active = true;
|
|
const callAvg = callTotals[item.shortName][0] / timePeriod;
|
|
sysCollection.update({
|
|
shortName: item.shortName
|
|
}, {
|
|
$set: {
|
|
"active": active,
|
|
"callAvg": callAvg,
|
|
"lastActive": new Date()
|
|
}
|
|
}, {
|
|
upsert: true
|
|
}, function(err, objects) {
|
|
if (err) {
|
|
console.log("Shortname: " + item.shortName);
|
|
console.warn(err.message);
|
|
}
|
|
});
|
|
} else {
|
|
sysCollection.update({
|
|
shortName: item.shortName
|
|
}, {
|
|
$set: {
|
|
"active": false,
|
|
"callAvg": 0
|
|
}
|
|
}, {
|
|
upsert: true
|
|
}, function(err, objects) {
|
|
if (err) {
|
|
console.log("Shortname: " + item.shortName);
|
|
console.warn(err.message);
|
|
}
|
|
});
|
|
}
|
|
}
|
|
});
|
|
});
|
|
}
|
|
|
|
exports.initStats = function() {
|
|
// get the System Stats collection
|
|
db.get().collection('system_stats', function(err, statsCollection) {
|
|
var cursor = statsCollection.find();
|
|
|
|
// go through each of the Systems in Stats
|
|
cursor.each(function(err, item) {
|
|
|
|
// If you are not at the end...
|
|
if (item) {
|
|
//console.log("Loading stats for: " + item.shortName);
|
|
|
|
// Talkgroup Stats
|
|
if (item.talkgroupStats != undefined) {
|
|
stats[item.shortName] = item.talkgroupStats;
|
|
}
|
|
|
|
// Error Totals
|
|
if (item.errorTotals != undefined) {
|
|
errorTotals[item.shortName] = item.errorTotals;
|
|
}
|
|
|
|
if (item.callTotals != undefined) {
|
|
callTotals[item.shortName] = item.callTotals;
|
|
}
|
|
} else {
|
|
|
|
}
|
|
});
|
|
});
|
|
}
|
|
|
|
// keeps track of the number of calls that get uploaded with an audio file
|
|
exports.addError = function(call) {
|
|
|
|
// if there is no Array associated with the system.
|
|
if (errorTotals[call.shortName] == undefined) {
|
|
errorTotals[call.shortName] = new Array();
|
|
for (var j = 0; j < spots; j++) {
|
|
errorTotals[call.shortName][j] = 0;
|
|
}
|
|
}
|
|
|
|
// Add an error to the count for the current period.
|
|
errorTotals[call.shortName][0]++;
|
|
}
|
|
|
|
// Keeps track of the number of calls for each talkgroup for a system
|
|
exports.addCall = function(call) {
|
|
|
|
// if you haven't started keeping track of stats for the System yet
|
|
if (stats[call.shortName] == undefined) {
|
|
stats[call.shortName] = {};
|
|
|
|
}
|
|
|
|
var stat = stats[call.shortName];
|
|
|
|
// if you haven't started keeping track of Stats for this TG yet...
|
|
if (stat[call.talkgroupNum] == undefined) {
|
|
stat[call.talkgroupNum] = {}
|
|
stat[call.talkgroupNum].calls = 0;
|
|
stat[call.talkgroupNum].totalLen = 0;
|
|
stat[call.talkgroupNum].callCount = new Array();
|
|
stat[call.talkgroupNum].avgLen = new Array();
|
|
for (var j = 0; j < spots; j++) {
|
|
stat[call.talkgroupNum].callCount[j] = 0;
|
|
stat[call.talkgroupNum].avgLen[j] = 0;
|
|
}
|
|
}
|
|
|
|
// add to the call count and total length, Call Average is calc by dividing the two...
|
|
stat[call.talkgroupNum].calls++;
|
|
stat[call.talkgroupNum].totalLen += call.len;
|
|
}
|
|
|
|
|
|
// This gets called when a Time Period is up
|
|
exports.shiftStats = function() {
|
|
db.get().collection('system_stats', function(err, statsCollection) {
|
|
|
|
// for all the systems in Error Stats
|
|
for (var shortName in errorTotals) {
|
|
if (stats.hasOwnProperty(shortName)) {
|
|
|
|
// Update the DB with Error Stats and Error Totals
|
|
statsCollection.update({
|
|
shortName: shortName
|
|
}, {
|
|
$set: {
|
|
"errorTotals": errorTotals[shortName]
|
|
}
|
|
}, {
|
|
upsert: true
|
|
}, function(err, objects) {
|
|
if (err) {
|
|
console.log("Shortname: " + shortName);
|
|
console.log("errorTotals: " + util.inspect(errorTotals[shortName]));
|
|
console.warn(err.message);
|
|
}
|
|
});
|
|
|
|
// move everything back one after updating
|
|
for (var j = spots - 1; j > 0; j--) {
|
|
errorTotals[shortName][j] = errorTotals[shortName][j - 1];
|
|
}
|
|
// reset the first spot back to 0, so you can count the next period
|
|
errorTotals[shortName][0] = 0;
|
|
}
|
|
}
|
|
|
|
// figure out the stats
|
|
|
|
// for each system in stats
|
|
for (var shortName in stats) {
|
|
var callTotal = 0;
|
|
|
|
// if the system is in stats
|
|
if (stats.hasOwnProperty(shortName)) {
|
|
var stat = stats[shortName];
|
|
|
|
// for each talkgroup in that systems stats
|
|
for (var talkgroupNum in stat) {
|
|
if (stat.hasOwnProperty(talkgroupNum)) {
|
|
var tg = stat[talkgroupNum];
|
|
var tgHistoryTotal = 0;
|
|
// move the history for that talkgroup back
|
|
for (var j = spots - 1; j > 0; j--) {
|
|
var i = j - 1;
|
|
tgHistoryTotal += tg.callCount[i];
|
|
tg.callCount[j] = tg.callCount[i];
|
|
tg.avgLen[j] = tg.avgLen[i];
|
|
}
|
|
|
|
// add to the total for that group
|
|
callTotal += tg.calls;
|
|
|
|
|
|
// figure out the history for cell 0;
|
|
tg.callCount[0] = tg.calls;
|
|
tgHistoryTotal += tg.calls;
|
|
if (tg.calls > 0) {
|
|
tg.avgLen[0] = Math.floor(tg.totalLen / tg.calls);
|
|
} else {
|
|
tg.avgLen[0] = 0;
|
|
}
|
|
tg.calls = 0;
|
|
tg.totalLen = 0;
|
|
if (tgHistoryTotal ==0 ) {
|
|
// there has been no recent activity on this talkgroup. remove it from the stats.
|
|
delete stat[talkgroupNum];
|
|
}
|
|
}
|
|
}
|
|
|
|
// figure out call totals for this shortName/Sys
|
|
if (callTotals[shortName] == undefined) {
|
|
callTotals[shortName] = new Array();
|
|
for (var j = 0; j < spots; j++) {
|
|
callTotals[shortName][j] = 0;
|
|
}
|
|
}
|
|
|
|
|
|
for (var j = spots - 1; j > 0; j--) {
|
|
callTotals[shortName][j] = callTotals[shortName][j - 1];
|
|
}
|
|
callTotals[shortName][0] = callTotal;
|
|
|
|
statsCollection.update({
|
|
shortName: shortName
|
|
}, {
|
|
$set: {
|
|
"talkgroupStats": stats[shortName],
|
|
"callTotals": callTotals[shortName]
|
|
}
|
|
}, {
|
|
upsert: true
|
|
}, function(err, objects) {
|
|
if (err){
|
|
console.log("Shortname: " + shortName);
|
|
console.log("TgStats: " + util.inspect(stats[shortName]));
|
|
console.log("Call Totals: " + util.inspect(callTotals[shortName]));
|
|
console.warn(err.message);
|
|
}
|
|
});
|
|
|
|
}
|
|
}
|
|
});
|
|
updateActiveSystems();
|
|
}
|
|
exports.callHistory = function(shortName) {
|
|
return callTotals[shortName];
|
|
}
|
|
exports.tgHistory = function(shortName) {
|
|
return stats[shortName];
|
|
}
|
|
|
|
exports.errorTotals = function(shortName) {
|
|
return errorTotals[shortName];
|
|
}
|