openhim-core
Version:
The OpenHIM core application that provides logging and routing of http requests
167 lines (132 loc) • 10.4 kB
text/coffeescript
config = require './config/config'
SDC = require "statsd-client"
statsdServer = config.get 'statsd'
application = config.get 'application'
logger = require "winston"
os = require 'os'
timer = new Date()
domain = os.hostname() + '.' + application.name
util = require 'util'
sdc = new SDC statsdServer
exports.incrementTransactionCount = (ctx, done) ->
logger.info 'sending counts to statsd for ' + domain + '.' + ctx.authorisedChannel._id
transactionStatus = ctx.transactionStatus
try
sdc.increment domain + '.channels'
sdc.increment domain + '.channels.' + transactionStatus
sdc.increment domain + '.channels.' + ctx.authorisedChannel._id
sdc.increment domain + '.channels.' + ctx.authorisedChannel._id + '.statuses.' + transactionStatus
if ctx.mediatorResponse?
if ctx.mediatorResponse.metrics?
for metric in ctx.mediatorResponse.metrics
if metric.type == 'counter'
logger.info 'incrementing mediator counter ' + metric.name
sdc.increment domain + '.channels.' + ctx.authorisedChannel._id + '.' + ctx.mediatorResponse.properties.name + '.mediator_metrics.' + metric.name
if metric.type == 'timer'
logger.info 'incrementing mediator timer ' + metric.name
sdc.timing domain + '.channels.' + ctx.authorisedChannel._id + '.' + ctx.mediatorResponse.properties.name + '.mediator_metrics.' + metric.name, metric.value
if metric.type == 'gauge'
logger.info 'incrementing mediator gauge ' + metric.name
sdc.gauge domain + '.channels.' + ctx.authorisedChannel._id + '.' + ctx.mediatorResponse.properties.name + '.mediator_metrics.' + metric.name, metric.value
if ctx.mediatorResponse.orchestrations?
for orchestration in ctx.mediatorResponse.orchestrations
do (orchestration) ->
orchestrationStatus = orchestration.response.status
orchestrationName = orchestration.name
if orchestration.group
orchestrationName = "#{orchestration.group}.#{orchestration.name}"
sdc.increment domain + '.channels.' + ctx.authorisedChannel._id + '.orchestrations.' + orchestrationName
sdc.increment domain + '.channels.' + ctx.authorisedChannel._id + '.orchestrations.' + orchestrationName + '.statusCodes.' + orchestrationStatus
sdc.increment domain + '.channels.' + ctx.authorisedChannel._id + '.statuses.' + transactionStatus + '.orchestrations.' + orchestrationName
sdc.increment domain + '.channels.' + ctx.authorisedChannel._id + '.statuses.' + transactionStatus + '.orchestrations.' + orchestrationName + '.statusCodes.' + orchestrationStatus
if orchestration.metrics?
for metric in orchestration.metrics
if metric.type == 'counter'
logger.info 'incrementing orchestration counter ' + metric.name
sdc.increment domain + '.channels.' + ctx.authorisedChannel._id + '.' + ctx.mediatorResponse.properties.name + '.orchestrations.' + orchestrationName + '.' + metric.name, metric.value
if metric.type == 'timer'
logger.info 'incrementing orchestration timer ' + metric.name
sdc.timing domain + '.channels.' + ctx.authorisedChannel._id + '.' + ctx.mediatorResponse.properties.name + '.orchestrations.' + orchestrationName + '.' + metric.name, metric.value
if metric.type == 'gauge'
logger.info 'incrementing orchestration gauge ' + metric.name
sdc.gauge domain + '.channels.' + ctx.authorisedChannel._id + '.' + ctx.mediatorResponse.properties.name + '.orchestrations.' + orchestrationName + '.' + metric.name, metric.value
catch error
logger.error error, done
done()
exports.measureTransactionDuration = (ctx, done) ->
logger.info 'sending durations to statsd for ' + domain + '.' + ctx.authorisedChannel._id
transactionStatus = ctx.transactionStatus
try
sdc.timing domain + '.channels' , ctx.timer
sdc.timing domain + '.channels.' + transactionStatus, ctx.timer
sdc.timing domain + '.channels.' + ctx.authorisedChannel._id, ctx.timer
sdc.timing domain + '.channels.' + ctx.authorisedChannel._id + '.statuses.' + transactionStatus, ctx.timer
if ctx.mediatorResponse?
if ctx.mediatorResponse.orchestrations?
for orchestration in ctx.mediatorResponse.orchestrations
do (orchestration) ->
orchestratrionDuration = orchestration.response.timestamp - orchestration.request.timestamp
orchestrationStatus = orchestration.response.status
orchestrationName = orchestration.name
if orchestration.group
orchestrationName = "#{orchestration.group}.#{orchestration.name}"
sdc.timing domain + '.channels.' + ctx.authorisedChannel._id + '.orchestrations.' + orchestrationName, orchestratrionDuration
sdc.timing domain + '.channels.' + ctx.authorisedChannel._id + '.orchestrations.' + orchestrationName + '.statusCodes.' + orchestrationStatus , orchestratrionDuration
catch error
logger.error error, done
done()
exports.nonPrimaryRouteRequestCount = (ctx, route, done) ->
sdc.increment domain + '.channels.' + ctx.authorisedChannel._id + '.nonPrimaryRoutes.' + route.name
sdc.increment domain + '.channels.' + ctx.authorisedChannel._id + '.nonPrimaryRoutes.' + route.name + '.statusCodes.' + route.response.status
if route.metrics?
for metric in route.metrics
if metric.type == 'counter'
logger.info 'incrementing mediator counter ' + metric.name
sdc.increment domain + '.channels.' + ctx.authorisedChannel._id + '.nonPrimaryRoutes.' + route.name + '.mediator_metrics.' + metric.name
if metric.type == 'timer'
logger.info 'incrementing mediator timer ' + metric.name
sdc.timing domain + '.channels.' + ctx.authorisedChannel._id + '.nonPrimaryRoutes.' + route.name + '.mediator_metrics.' + metric.name, metric.value
if metric.type == 'gauge'
logger.info 'incrementing mediator gauge ' + metric.name
sdc.gauge domain + '.channels.' + ctx.authorisedChannel._id + '.nonPrimaryRoutes.' + route.name + '.mediator_metrics.' + metric.name, metric.value
if route.orchestrations?
for orchestration in route.orchestrations
do (orchestration) ->
orchestrationStatus = orchestration.response.status
orchestrationName = orchestration.name
if orchestration.group
orchestrationName = "#{orchestration.group}.#{orchestration.name}"
sdc.increment domain + '.channels.' + ctx.authorisedChannel._id + '.nonPrimaryRoutes.' + route.name + '.orchestrations.' + orchestrationName
sdc.increment domain + '.channels.' + ctx.authorisedChannel._id + '.nonPrimaryRoutes.' + route.name + '.orchestrations.' + orchestrationName + '.statusCodes.' + orchestrationStatus
sdc.increment domain + '.channels.' + ctx.authorisedChannel._id + '.nonPrimaryRoutes.' + route.name + '.statusCodes.' + route.response.status + '.orchestrations.' + orchestrationName
sdc.increment domain + '.channels.' + ctx.authorisedChannel._id + '.nonPrimaryRoutes.' + route.name + '.statusCodes.' + route.response.status + '.orchestrations.' + orchestrationName + '.statusCodes.' + orchestrationStatus
if orchestration.metrics?
for metric in orchestration.metrics
if metric.type == 'counter'
logger.info 'incrementing '+ route.name + ' orchestration counter ' + metric.name
sdc.increment domain + '.channels.' + ctx.authorisedChannel._id + '.nonPrimaryRoutes.' + route.name + '.orchestrations.' + orchestrationName + '.' + metric.name, metric.value
if metric.type == 'timer'
logger.info 'incrementing '+ route.name + 'orchestration timer ' + metric.name
sdc.timing domain + '.channels.' + ctx.authorisedChannel._id + '.nonPrimaryRoutes.' + route.name + '.orchestrations.' + orchestrationName + '.' + metric.name, metric.value
if metric.type == 'gauge'
logger.info 'incrementing '+ route.name + 'orchestration gauge ' + metric.name
sdc.gauge domain + '.channels.' + ctx.authorisedChannel._id + '.nonPrimaryRoutes.' + route.name + '.orchestrations.' + orchestrationName + '.' + metric.name, metric.value
done()
exports.nonPrimaryRouteDurations = (ctx, route, done) ->
sdc.timing domain + '.channels.' + ctx.authorisedChannel._id + '.nonPrimaryRoutes.' + route.name, ctx.timer
sdc.timing domain + '.channels.' + ctx.authorisedChannel._id + '.nonPrimaryRoutes.' + route.name + '.statusCodes.' + route.response.status, ctx.timer
if route.orchestrations?
for orchestration in route.orchestrations
do (orchestration) ->
orchestratrionDuration = orchestration.response.timestamp - orchestration.request.timestamp
orchestrationStatus = orchestration.response.status
orchestrationName = orchestration.name
if orchestration.group
orchestrationName = "#{orchestration.group}.#{orchestration.name}"
sdc.timing domain + '.channels.' + ctx.authorisedChannel._id + '.nonPrimaryRoutes.' + route.name + '.orchestrations.' + orchestrationName, orchestratrionDuration
sdc.timing domain + '.channels.' + ctx.authorisedChannel._id + '.nonPrimaryRoutes.' + route.name + '.orchestrations.' + orchestrationName + '.statusCodes.' + orchestrationStatus , orchestratrionDuration
sdc.timing domain + '.channels.' + ctx.authorisedChannel._id + '.nonPrimaryRoutes.' + route.name + '.statusCodes.' + route.response.status + '.orchestrations.' + orchestrationName, orchestratrionDuration
sdc.timing domain + '.channels.' + ctx.authorisedChannel._id + '.nonPrimaryRoutes.' + route.name + '.statusCodes.' + route.response.status + '.orchestrations.' + orchestrationName + '.statusCodes.' + orchestrationStatus , orchestratrionDuration
done()