openhim-core
Version:
The OpenHIM core application that provides logging and routing of http requests
186 lines (181 loc) • 3.98 kB
JavaScript
var Transaction, logger;
Transaction = require('./model/transactions').Transaction;
logger = require('winston');
exports.calculateMetrics = function(startDate, endDate, transactionFilter, channelIDs, timeSeries, groupByChannels) {
var group, match, pipeline;
if (!(startDate instanceof Date) || !(endDate instanceof Date)) {
return new Promise(function(resolve, reject) {
return reject(new Error('startDate and endDate must be provided and be of type Date'));
});
}
match = {
"request.timestamp": {
$lt: endDate,
$gt: startDate
}
};
if (transactionFilter) {
Object.assign(match, transactionFilter);
}
if (channelIDs) {
match.channelID = {
$in: channelIDs
};
}
group = {
_id: {},
total: {
$sum: 1
},
avgResp: {
$avg: {
$subtract: ["$response.timestamp", "$request.timestamp"]
}
},
minResp: {
$min: {
$subtract: ["$response.timestamp", "$request.timestamp"]
}
},
maxResp: {
$max: {
$subtract: ["$response.timestamp", "$request.timestamp"]
}
},
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
]
}
}
};
if (groupByChannels) {
group._id.channelID = '$channelID';
}
if (timeSeries) {
switch (timeSeries) {
case "minute":
group._id.minute = {
$minute: "$request.timestamp"
};
group._id.hour = {
$hour: "$request.timestamp"
};
group._id.day = {
$dayOfMonth: "$request.timestamp"
};
group._id.week = {
$week: "$request.timestamp"
};
group._id.month = {
$month: "$request.timestamp"
};
group._id.year = {
$year: "$request.timestamp"
};
break;
case "hour":
group._id.hour = {
$hour: "$request.timestamp"
};
group._id.week = {
$week: "$request.timestamp"
};
group._id.day = {
$dayOfMonth: "$request.timestamp"
};
group._id.month = {
$month: "$request.timestamp"
};
group._id.year = {
$year: "$request.timestamp"
};
break;
case "day":
group._id.day = {
$dayOfMonth: "$request.timestamp"
};
group._id.week = {
$week: "$request.timestamp"
};
group._id.month = {
$month: "$request.timestamp"
};
group._id.year = {
$year: "$request.timestamp"
};
break;
case "week":
group._id.week = {
$week: "$request.timestamp"
};
group._id.month = {
$month: "$request.timestamp"
};
group._id.year = {
$year: "$request.timestamp"
};
break;
case "month":
group._id.month = {
$month: "$request.timestamp"
};
group._id.year = {
$year: "$request.timestamp"
};
break;
case "year":
group._id.year = {
$year: "$request.timestamp"
};
}
}
pipeline = [
{
$match: match
}, {
$group: group
}
];
return Transaction.aggregate(pipeline).exec();
};
//# sourceMappingURL=metrics.js.map