openhim-core
Version:
The OpenHIM core application that provides logging and routing of http requests
356 lines (301 loc) • 8.76 kB
text/coffeescript
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'
#################################################
# Fetches allowed Global Load Time Metrics #
################################################
exports.fetchGlobalLoadTimeMetrics = fetchGlobalLoadTimeMetrics = (requestingUser, filtersObject) ->
if filtersObject.startDate and 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
getAllowedChannelIDs(requestingUser).then (allowedChannelIDs) ->
filtersObject["channelID"] = $in: allowedChannelIDs
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()
#################################################
# Fetches allowed Global Status Metrics #
################################################
exports.fetchGlobalStatusMetrics = fetchGlobalStatusMetrics = (requestingUser, filtersObject) ->
if filtersObject.startDate and 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)
#remove startDate/endDate from objects filter (Not part of filtering and will break filter)
delete filtersObject.startDate
delete filtersObject.endDate
else
from = moment().subtract(1, "weeks").toDate()
to = moment().toDate()
filtersObject["request.timestamp"] =
$lt: to
$gt: from
getAllowedChannelIDs(requestingUser).then (allowedChannelIDs) ->
filtersObject["channelID"] = $in: allowedChannelIDs
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()
#################################################
# Fetches allowed Channel Metrics #
################################################
exports.fetchChannelMetrics = fetchChannelMetrics = (time, channelId, userRequesting, filtersObject) ->
channelID = mongoose.Types.ObjectId(channelId)
if filtersObject.startDate and 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
# remove startDate/endDate from objects filter (Not part of filtering and will break filter)
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
when "minute"
groupObject._id.day = $dayOfMonth: "$request.timestamp"
groupObject._id.hour = $hour: "$request.timestamp"
groupObject._id.minute = $minute: "$request.timestamp"
when "hour"
groupObject._id.day = $dayOfMonth: "$request.timestamp"
groupObject._id.hour = $hour: "$request.timestamp"
when "day"
groupObject._id.day = $dayOfMonth: "$request.timestamp"
when "week"
groupObject._id.week = $week: "$request.timestamp"
when "month", "year"
delete groupObject._id.month
when "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
]
else
#do nothng
Transaction.aggregate([
{
$match: filtersObject
}
{
$group: groupObject
}
]).exec()
#################################################
# Fetches allowed Channels #
################################################
getAllowedChannels = (requestingUser) ->
authorisation.getUserViewableChannels requestingUser
.then (allowedChannelsArray)->
allowedChannelIDs = []
promises = []
for channel in allowedChannelsArray
do (channel) ->
deferred = Q.defer()
allowedChannelIDs.push
_id: channel._id
name: channel.name
deferred.resolve()
promises.push deferred.promise
(Q.all promises).then ->
allowedChannelIDs
#################################################
# Fetches allowed Channel IDs #
################################################
getAllowedChannelIDs = (requestingUser) ->
authorisation.getUserViewableChannels requestingUser
.then (allowedChannelsArray)->
allowedChannelIDs = []
promises = []
for channel in allowedChannelsArray
do (channel) ->
deferred = Q.defer()
allowedChannelIDs.push channel._id
deferred.resolve()
promises.push deferred.promise
(Q.all promises).then ->
allowedChannelIDs
exports.getAllowedChannels = getAllowedChannels
exports.getAllowedChannelIDs = getAllowedChannelIDs