|
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; |
|
}; |
|
} |
|
}; |