UNPKG

openhim-core

Version:

The OpenHIM core application that provides logging and routing of http requests

338 lines (322 loc) 8.64 kB
var Channel, Q, Transaction, authorisation, fetchChannelMetrics, fetchGlobalLoadTimeMetrics, fetchGlobalStatusMetrics, getAllowedChannelIDs, getAllowedChannels, logger, moment, mongoose; Transaction = require('./model/transactions').Transaction; Channel = require('./model/channels').Channel; moment = require('moment'); logger = require('winston'); mongoose = require('mongoose'); authorisation = require('./api/authorisation'); Q = require('q'); exports.fetchGlobalLoadTimeMetrics = fetchGlobalLoadTimeMetrics = function(requestingUser, filtersObject) { var from, to; if (filtersObject.startDate && filtersObject.endDate) { filtersObject.startDate = filtersObject.startDate.toString().replace(/"/g, ''); filtersObject.endDate = filtersObject.endDate.toString().replace(/"/g, ''); from = new Date(filtersObject.startDate); to = new Date(filtersObject.endDate); delete filtersObject.startDate; delete filtersObject.endDate; } else { from = moment().subtract(1, "weeks").toDate(); to = moment().toDate(); } filtersObject["request.timestamp"] = { $lt: to, $gt: from }; return getAllowedChannelIDs(requestingUser).then(function(allowedChannelIDs) { filtersObject["channelID"] = { $in: allowedChannelIDs }; return Transaction.aggregate([ { $match: filtersObject }, { $group: { _id: { year: { $year: "$request.timestamp" }, month: { $month: "$request.timestamp" }, day: { $dayOfMonth: "$request.timestamp" }, hour: { $hour: "$request.timestamp" } }, load: { $sum: 1 }, avgResp: { $avg: { $subtract: ["$response.timestamp", "$request.timestamp"] } } } } ]).exec(); }); }; exports.fetchGlobalStatusMetrics = fetchGlobalStatusMetrics = function(requestingUser, filtersObject) { var from, to; if (filtersObject.startDate && filtersObject.endDate) { filtersObject.startDate = filtersObject.startDate.toString().replace(/"/g, ''); filtersObject.endDate = filtersObject.endDate.toString().replace(/"/g, ''); from = new Date(filtersObject.startDate); to = new Date(filtersObject.endDate); delete filtersObject.startDate; delete filtersObject.endDate; } else { from = moment().subtract(1, "weeks").toDate(); to = moment().toDate(); } filtersObject["request.timestamp"] = { $lt: to, $gt: from }; return getAllowedChannelIDs(requestingUser).then(function(allowedChannelIDs) { filtersObject["channelID"] = { $in: allowedChannelIDs }; return Transaction.aggregate([ { $match: filtersObject }, { $group: { _id: { channelID: "$channelID" }, failed: { $sum: { $cond: [ { $eq: ["$status", "Failed"] }, 1, 0 ] } }, successful: { $sum: { $cond: [ { $eq: ["$status", "Successful"] }, 1, 0 ] } }, processing: { $sum: { $cond: [ { $eq: ["$status", "Processing"] }, 1, 0 ] } }, completed: { $sum: { $cond: [ { $eq: ["$status", "Completed"] }, 1, 0 ] } }, completedWErrors: { $sum: { $cond: [ { $eq: ["$status", "Completed with error(s)"] }, 1, 0 ] } } } } ]).exec(); }); }; exports.fetchChannelMetrics = fetchChannelMetrics = function(time, channelId, userRequesting, filtersObject) { var channelID, from, groupObject, to; channelID = mongoose.Types.ObjectId(channelId); if (filtersObject.startDate && filtersObject.endDate) { filtersObject.startDate = filtersObject.startDate.toString().replace(/"/g, ''); filtersObject.endDate = filtersObject.endDate.toString().replace(/"/g, ''); from = new Date(filtersObject.startDate); to = new Date(filtersObject.endDate); } else { from = moment().startOf('day').toDate(); to = moment().endOf('day').toDate(); } filtersObject.channelID = channelID; filtersObject["request.timestamp"] = { $lt: to, $gt: from }; delete filtersObject.startDate; delete filtersObject.endDate; groupObject = {}; groupObject._id = {}; groupObject = { _id: { year: { $year: "$request.timestamp" }, month: { $month: "$request.timestamp" } }, load: { $sum: 1 }, avgResp: { $avg: { $subtract: ["$response.timestamp", "$request.timestamp"] } } }; switch (time) { case "minute": groupObject._id.day = { $dayOfMonth: "$request.timestamp" }; groupObject._id.hour = { $hour: "$request.timestamp" }; groupObject._id.minute = { $minute: "$request.timestamp" }; break; case "hour": groupObject._id.day = { $dayOfMonth: "$request.timestamp" }; groupObject._id.hour = { $hour: "$request.timestamp" }; break; case "day": groupObject._id.day = { $dayOfMonth: "$request.timestamp" }; break; case "week": groupObject._id.week = { $week: "$request.timestamp" }; break; case "month": case "year": delete groupObject._id.month; break; case "status": groupObject = { _id: { channelID: "$channelID" }, failed: { $sum: { $cond: [ { $eq: ["$status", "Failed"] }, 1, 0 ] } }, successful: { $sum: { $cond: [ { $eq: ["$status", "Successful"] }, 1, 0 ] } }, processing: { $sum: { $cond: [ { $eq: ["$status", "Processing"] }, 1, 0 ] } }, completed: { $sum: { $cond: [ { $eq: ["$status", "Completed"] }, 1, 0 ] } }, completedWErrors: { $sum: { $cond: [ { $eq: ["$status", "Completed with error(s)"] }, 1, 0 ] } } }; break; } return Transaction.aggregate([ { $match: filtersObject }, { $group: groupObject } ]).exec(); }; getAllowedChannels = function(requestingUser) { return authorisation.getUserViewableChannels(requestingUser).then(function(allowedChannelsArray) { var allowedChannelIDs, channel, fn, i, len, promises; allowedChannelIDs = []; promises = []; fn = function(channel) { var deferred; deferred = Q.defer(); allowedChannelIDs.push({ _id: channel._id, name: channel.name }); deferred.resolve(); return promises.push(deferred.promise); }; for (i = 0, len = allowedChannelsArray.length; i < len; i++) { channel = allowedChannelsArray[i]; fn(channel); } return (Q.all(promises)).then(function() { return allowedChannelIDs; }); }); }; getAllowedChannelIDs = function(requestingUser) { return authorisation.getUserViewableChannels(requestingUser).then(function(allowedChannelsArray) { var allowedChannelIDs, channel, fn, i, len, promises; allowedChannelIDs = []; promises = []; fn = function(channel) { var deferred; deferred = Q.defer(); allowedChannelIDs.push(channel._id); deferred.resolve(); return promises.push(deferred.promise); }; for (i = 0, len = allowedChannelsArray.length; i < len; i++) { channel = allowedChannelsArray[i]; fn(channel); } return (Q.all(promises)).then(function() { return allowedChannelIDs; }); }); }; exports.getAllowedChannels = getAllowedChannels; exports.getAllowedChannelIDs = getAllowedChannelIDs; //# sourceMappingURL=metrics.js.map