diff --git a/lib/instrumentation/module/express.js b/lib/instrumentation/module/express.js index e05ee857..53de3d47 100644 --- a/lib/instrumentation/module/express.js +++ b/lib/instrumentation/module/express.js @@ -16,6 +16,9 @@ const { makeMethodDescriptorBuilder } = require('../../context/make-method-descr const ExpressMethodDescriptorBuilder = require('../../context/express-method-descriptor-builder') const semver = require('semver') +const parameterizedLayerPathSymbol = Symbol('PinpointParameterizedLayerPathSymbol') +const layerPatchedSymbol = Symbol('layer-patched') + // https://github.com/elastic/apm-agent-nodejs/blob/master/lib/instrumentation/modules/express.js module.exports = function (agent, version, express) { try { @@ -28,8 +31,6 @@ module.exports = function (agent, version, express) { return express } - const layerPatchedSymbol = Symbol('layer-patched') - const MODULE_NAME = 'express' const methodNames = ['GET', 'POST', 'PUT', 'HEAD', 'DELETE', 'OPTIONS', 'PATCH', 'ALL'] @@ -74,6 +75,7 @@ module.exports = function (agent, version, express) { }) function patchLayer(layer, objectName, layerName, layerPath) { + /* if (!layer[layerPatchedSymbol] && false) { layer[layerPatchedSymbol] = true @@ -81,22 +83,30 @@ module.exports = function (agent, version, express) { let handle if (origin.length !== 4) { - // https://github.com/elastic/apm-agent-nodejs/issues/443#issuecomment-455352070 - if (!layer.route && layerPath && typeof next === 'function') { - - } handle = function (req, res, next) { - + // https://github.com/elastic/apm-agent-nodejs/issues/443#issuecomment-455352070 + if (!layer.route && layerPath && typeof next === 'function') { + safePush(req, parameterizedLayerPathSymbol, layerPath) + arguments[2] = function () { + if (!(req.route && arguments[0] instanceof Error)) { + req[parameterizedLayerPathSymbol].pop() + } + return next.apply(this, arguments) + } + } + + return origin.apply(this, arguments) } } else { handle = function (err, req, res, next) { - + return origin.apply(this, arguments) } } return handle }) } + */ let appAllMethodDescriptor let handlerMethodDescriptor if (objectName == 'route') { @@ -112,6 +122,11 @@ module.exports = function (agent, version, express) { }) } + function safePush(obj, prop, value) { + if (!obj[prop]) obj[prop] = [] + obj[prop].push(value) + } + function recordHandle(original, objectName, layerName, appAllMethodDescriptor, handlerMethodDescriptor, layerPath) { return function (req) { const trace = agent.traceContext.currentTraceObject()