diff --git a/lib/instrumentation/module/koa-router.js b/lib/instrumentation/module/koa-router.js index a32db813..ee45ef1c 100644 --- a/lib/instrumentation/module/koa-router.js +++ b/lib/instrumentation/module/koa-router.js @@ -11,6 +11,9 @@ const shimmer = require('shimmer') const ServiceTypeCode = require('../../constant/service-type').ServiceTypeCode const log = require('../../utils/logger') const layerPatchedSymbol = Symbol('PinpointKoaLayerPatched') +const { makeMethodDescriptorBuilder } = require('../../context/make-method-descriptor-builder') +const KoaMethodDescriptorBuilder = require('../../context/koa-method-descriptor-builder') +const apiMetaService = require('../../context/api-meta-service') module.exports = function (agent, version, router) { if (!semver.satisfies(version, '>=5.2.0 <8')) { @@ -27,38 +30,45 @@ module.exports = function (agent, version, router) { } layer[layerPatchedSymbol] = true - if (layer.stack) { - layer.stack.forEach((fn, index) => { - if (typeof fn === 'function') { - let result - layer.stack[index] = async function (ctx, next) { - const name = fn.name || 'AnonymousFunction' - const trace = agent.traceContext.currentTraceObject() - let spanEventRecorder = null - try { - if (trace) { - spanEventRecorder = trace.traceBlockBegin() - spanEventRecorder.recordServiceType(ServiceTypeCode.koa) - spanEventRecorder.recordApiDesc(`koa.router.${ctx.method.toLocaleLowerCase()} [${name}]`) - } - result = await fn.apply(this, arguments) - } catch (e) { - if (!e._pinpointCheck) { - e._pinpointCheck = true - spanEventRecorder.recordServiceType(ServiceTypeCode.koa) - spanEventRecorder.recordApiDesc(`koa.router.${ctx.method.toLocaleLowerCase()} [${name}]`) - spanEventRecorder.recordException(e, true) - } - throw e - } finally { - if (trace) { - trace.traceBlockEnd(spanEventRecorder) - } - } - return result - } + + if (!Array.isArray(layer.stack) || layer.stack.length < 1) { + return layer + } + + const handlerIndex = layer.stack.length - 1 + const fn = layer.stack[handlerIndex] + if (typeof fn !== 'function') { + return layer + } + + const builder = KoaMethodDescriptorBuilder.make(makeMethodDescriptorBuilder('koa', 3, 4)) + const methodDescriptor = apiMetaService.cacheApiWithBuilder(builder) + layer.stack[handlerIndex] = async function (ctx, next) { + const name = fn.name || 'AnonymousFunction' + const trace = agent.traceContext.currentTraceObject() + let spanEventRecorder = null + let result + try { + if (trace) { + spanEventRecorder = trace.traceBlockBegin() + spanEventRecorder.recordServiceType(ServiceTypeCode.koa) + spanEventRecorder.recordApiDesc(`koa.router.${ctx.method.toLocaleLowerCase()} [${name}]`) + } + result = await fn.apply(this, arguments) + } catch (e) { + if (!e._pinpointCheck) { + e._pinpointCheck = true + spanEventRecorder.recordServiceType(ServiceTypeCode.koa) + spanEventRecorder.recordApiDesc(`koa.router.${ctx.method.toLocaleLowerCase()} [${name}]`) + spanEventRecorder.recordException(e, true) + } + throw e + } finally { + if (trace) { + trace.traceBlockEnd(spanEventRecorder) } - }) + } + return result } return layer } diff --git a/test/instrumentation/module/koa.test.js b/test/instrumentation/module/koa.test.js index e1336e48..5cc0e08e 100644 --- a/test/instrumentation/module/koa.test.js +++ b/test/instrumentation/module/koa.test.js @@ -7,11 +7,8 @@ const test = require('tape') const axios = require('axios') -const { log, fixture, util, enableDataSending } = require('../../test-helper') - - +const { log } = require('../../test-helper') const agent = require('../../support/agent-singleton-mock') - const Koa = require('koa') const Router = require('koa-router')