Skip to content

Instantly share code, notes, and snippets.

@moonthug
Last active October 17, 2018 15:12
Show Gist options
  • Save moonthug/b81eec9fa40b1d6edd24ac2012108d62 to your computer and use it in GitHub Desktop.
Save moonthug/b81eec9fa40b1d6edd24ac2012108d62 to your computer and use it in GitHub Desktop.
Using AWS X-Ray with Hapi.js

HapiJS with AWS XRay

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;
};
}
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment