Skip to content

Commit

Permalink
[#104] koa module
Browse files Browse the repository at this point in the history
  • Loading branch information
feelform committed Feb 15, 2022
1 parent e5669da commit 1c05199
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 35 deletions.
72 changes: 41 additions & 31 deletions lib/instrumentation/module/koa-router.js
Original file line number Diff line number Diff line change
Expand Up @@ -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')) {
Expand All @@ -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
}
Expand Down
5 changes: 1 addition & 4 deletions test/instrumentation/module/koa.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -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')

Expand Down

0 comments on commit 1c05199

Please sign in to comment.