A quick brain dump of where I'm at with getting Hapi and AWS Xray working
I'll might turn into a Hapi plugin at some point...
const { getListener } = require('./xray'); | |
module.exports = { | |
server: { | |
host: '0.0.0.0', | |
port: process.env.API_HTTP_PORT || 3000, | |
listener: getListener(), | |
}, | |
register: { | |
plugins: [ | |
{ plugin: './plugins/logs' }, | |
{ plugin: './routes/api' }, | |
{ plugin: './routes/core' } | |
] | |
} | |
}; |
const xray = require('../xray'); | |
const log = require('../utils/log'); | |
const debug = require('debug')('plugin:logs'); | |
const register = (server, options) => { | |
xray.setLogger(log); | |
server.ext({ | |
type: 'onRequest', | |
method: xray.getRequestHandler() | |
}); | |
}; | |
exports.plugin = { | |
register, | |
name: 'logs', | |
version: '0.1' | |
}; |
const xray = require('aws-xray-sdk'); | |
const pjson = require('../../package'); | |
const http = xray.captureHTTPs(require('http')); | |
xray.captureAWS(require('aws-sdk')); | |
xray.capturePromise(); | |
module.exports = { | |
getListener: () => { | |
return http.createServer(); | |
}, | |
setLogger: logger => { | |
xray.setLogger(logger); | |
}, | |
getRequestHandler: () => { | |
xray.middleware.setDefaultName(pjson.name); | |
return (request, h) => { | |
const header = xray.middleware.processHeaders(request); | |
const name = xray.middleware.resolveName(request.headers.host); | |
const segment = new xray.Segment(name, header.Root, header.Parent); | |
xray.middleware.resolveSampling(header, segment, { | |
req: request.raw.req | |
}); | |
segment.addIncomingRequestData( | |
new xray.middleware.IncomingRequestData(request.raw.req) | |
); | |
xray.getLogger().debug(`Starting express segment: { | |
url: ${request.url}, | |
name: ${segment.name}, | |
trace_id: ${segment.trace_id}, | |
id: ${segment.id}, | |
sampled: ${!segment.notTraced} | |
}`); | |
request.server.events.on('response', req => { | |
if (req.response.statusCode === 429) { | |
segment.addThrottleFlag(); | |
} | |
const cause = xray.utils.getCauseTypeFromHttpStatus( | |
req.response.statusCode | |
); | |
if (cause) { | |
segment[cause] = true; | |
} | |
if (request.response._error) { | |
if (req.response.statusCode !== 404) { | |
segment.addError(request.response._error); | |
} | |
} | |
segment.http.close(request.response); | |
segment.close(); | |
xray.getLogger().debug(`Closed express segment successfully: { | |
url: ${request.url}, | |
name: ${segment.name}, | |
trace_id: ${segment.trace_id}, | |
id: ${segment.id}, | |
sampled: ${!segment.notTraced} | |
}`); | |
}); | |
const ns = xray.getNamespace(); | |
ns.bindEmitter(request.raw.req); | |
ns.bindEmitter(request.raw.res); | |
ns.run(() => { | |
xray.setSegment(segment); | |
}); | |
return h.continue; | |
}; | |
} | |
}; |