Skip to content

Commit 4f4cdf7

Browse files
committed
[#389] Support Exception Chain Metadata (PExceptionMetaData)
1 parent b18f5ea commit 4f4cdf7

File tree

2 files changed

+52
-25
lines changed

2 files changed

+52
-25
lines changed

lib/context/trace/exception-builder.js

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,15 @@
99
const { nextExceptionId } = require('./id-generator')
1010
const { namedGroupCallSite } = require('../../instrumentation/call-stack')
1111

12+
class Frame {
13+
constructor(className = '', fileName = 'unknown', lineNumber = 0, methodName = '') {
14+
this.className = className
15+
this.fileName = fileName
16+
this.lineNumber = lineNumber
17+
this.methodName = methodName
18+
}
19+
}
20+
1221
class Exception {
1322
constructor(errorClassName, errorMessage, startTime) {
1423
this.errorClassName = errorClassName
@@ -43,7 +52,18 @@ class ExceptionBuilder {
4352

4453
const exception = new Exception(className, message, Date.now())
4554
exception.frameStack = stack.slice(1).map(callSite => {
46-
return namedGroupCallSite(callSite.trim())
55+
const { type, location, lineNumber, functionName, methodName } = namedGroupCallSite(callSite.trim())
56+
57+
let functionNameWithMethod
58+
if (functionName && methodName) {
59+
functionNameWithMethod = `${functionName} [as ${methodName}]`
60+
} else if (functionName) {
61+
functionNameWithMethod = functionName
62+
} else if (methodName) {
63+
functionNameWithMethod = methodName
64+
}
65+
66+
return new Frame(type, location, lineNumber, functionNameWithMethod)
4767
})
4868
exception.stack = stack
4969
return exception

test/context/trace/exception-builder.test.js

Lines changed: 31 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -27,68 +27,75 @@ test('ExceptionBuilder Test - snapshot-like multiline', (t) => {
2727
t.equal(actual.errorMessage, 'error case', `Error message is ${actual.errorMessage}`)
2828
t.equal(actual.frameStack.length, 10, `Frame stack length is ${actual.frameStack.length}`)
2929

30-
t.deepEqual(actual.frameStack[0], {
30+
let actualFrame = actual.frameStack[0]
31+
t.deepEqual({ location: actualFrame.fileName, lineNumber: actualFrame.lineNumber }, {
3132
location: '/Users/workspace/pinpoint/pinpoint-node-agent/test/instrumentation/module/express.test.js',
32-
fileName: 'express.test.js',
3333
lineNumber: 110,
3434
}, 'at /Users/workspace/pinpoint/pinpoint-node-agent/test/instrumentation/module/express.test.js:110:11')
35-
t.deepEqual(actual.frameStack[1], {
35+
36+
actualFrame = actual.frameStack[1]
37+
t.deepEqual({ type: actualFrame.className, location: actualFrame.fileName, lineNumber: actualFrame.lineNumber, functionName: actualFrame.methodName }, {
3638
location: '/Users/workspace/pinpoint/pinpoint-node-agent/node_modules/express/lib/router/layer.js',
37-
fileName: 'layer.js',
3839
lineNumber: 95,
3940
type: 'Layer',
40-
functionName: 'handle',
41-
methodName: 'handle_request'
41+
functionName: 'handle [as handle_request]',
4242
}, 'at Layer.handle [as handle_request] (/Users/workspace/pinpoint/pinpoint-node-agent/node_modules/express/lib/router/layer.js:95:5)')
43-
t.deepEqual(actual.frameStack[2], {
43+
44+
actualFrame = actual.frameStack[2]
45+
t.deepEqual({ location: actualFrame.fileName, lineNumber: actualFrame.lineNumber, functionName: actualFrame.methodName }, {
4446
location: '/Users/workspace/pinpoint/pinpoint-node-agent/node_modules/express/lib/router/route.js',
45-
fileName: 'route.js',
4647
lineNumber: 149,
4748
functionName: 'next'
4849
}, 'at next (/Users/workspace/pinpoint/pinpoint-node-agent/node_modules/express/lib/router/route.js:149:13)')
49-
t.deepEqual(actual.frameStack[3], {
50+
51+
actualFrame = actual.frameStack[3]
52+
t.deepEqual({ type: actualFrame.className, location: actualFrame.fileName, lineNumber: actualFrame.lineNumber, functionName: actualFrame.methodName }, {
5053
location: '/Users/workspace/pinpoint/pinpoint-node-agent/node_modules/express/lib/router/route.js',
51-
fileName: 'route.js',
5254
lineNumber: 119,
5355
type: 'Route',
5456
functionName: 'dispatch'
5557
}, 'at Route.dispatch (/Users/workspace/pinpoint/pinpoint-node-agent/node_modules/express/lib/router/route.js:119:3)')
56-
t.deepEqual(actual.frameStack[4], {
58+
59+
actualFrame = actual.frameStack[4]
60+
t.deepEqual({ type: actualFrame.className, location: actualFrame.fileName, lineNumber: actualFrame.lineNumber, functionName: actualFrame.methodName }, {
5761
location: '/Users/workspace/pinpoint/pinpoint-node-agent/lib/instrumentation/interceptor-runner.js',
58-
fileName: 'interceptor-runner.js',
5962
lineNumber: 59,
6063
type: 'InterceptorRunner',
6164
functionName: 'run'
6265
}, 'at InterceptorRunner.run (/Users/workspace/pinpoint/pinpoint-node-agent/lib/instrumentation/interceptor-runner.js:59:38)')
63-
t.deepEqual(actual.frameStack[5], {
66+
67+
actualFrame = actual.frameStack[5]
68+
t.deepEqual({ location: actualFrame.fileName, lineNumber: actualFrame.lineNumber, functionName: actualFrame.methodName }, {
6469
location: '/Users/workspace/pinpoint/pinpoint-node-agent/lib/instrumentation/module/express/express-layer-interceptor.js',
65-
fileName: 'express-layer-interceptor.js',
6670
lineNumber: 41,
6771
functionName: 'wrapped'
6872
}, 'at wrapped (/Users/workspace/pinpoint/pinpoint-node-agent/lib/instrumentation/module/express/express-layer-interceptor.js:41:87)')
69-
t.deepEqual(actual.frameStack[6], {
73+
74+
actualFrame = actual.frameStack[6]
75+
t.deepEqual({ type: actualFrame.className, location: actualFrame.fileName, lineNumber: actualFrame.lineNumber, functionName: actualFrame.methodName }, {
7076
location: '/Users/workspace/pinpoint/pinpoint-node-agent/node_modules/express/lib/router/layer.js',
71-
fileName: 'layer.js',
7277
lineNumber: 95,
7378
type: 'Layer',
74-
functionName: 'handle',
75-
methodName: 'handle_request'
79+
functionName: 'handle [as handle_request]',
7680
}, 'at Layer.handle [as handle_request] (/Users/workspace/pinpoint/pinpoint-node-agent/node_modules/express/lib/router/layer.js:95:5)')
77-
t.deepEqual(actual.frameStack[7], {
81+
82+
actualFrame = actual.frameStack[7]
83+
t.deepEqual({ location: actualFrame.fileName, lineNumber: actualFrame.lineNumber}, {
7884
location: '/Users/workspace/pinpoint/pinpoint-node-agent/node_modules/express/lib/router/index.js',
79-
fileName: 'index.js',
8085
lineNumber: 284,
8186
}, 'at /Users/workspace/pinpoint/pinpoint-node-agent/node_modules/express/lib/router/index.js:284:15')
82-
t.deepEqual(actual.frameStack[8], {
87+
88+
actualFrame = actual.frameStack[8]
89+
t.deepEqual({ type: actualFrame.className, location: actualFrame.fileName, lineNumber: actualFrame.lineNumber, functionName: actualFrame.methodName }, {
8390
location: '/Users/workspace/pinpoint/pinpoint-node-agent/node_modules/express/lib/router/index.js',
84-
fileName: 'index.js',
8591
lineNumber: 346,
8692
functionName: 'process_params',
8793
type: 'Function',
8894
}, 'at Function.process_params (/Users/workspace/pinpoint/pinpoint-node-agent/node_modules/express/lib/router/index.js:346:12)')
89-
t.deepEqual(actual.frameStack[9], {
95+
96+
actualFrame = actual.frameStack[9]
97+
t.deepEqual({ location: actualFrame.fileName, lineNumber: actualFrame.lineNumber, functionName: actualFrame.methodName }, {
9098
location: '/Users/workspace/pinpoint/pinpoint-node-agent/node_modules/express/lib/router/index.js',
91-
fileName: 'index.js',
9299
lineNumber: 280,
93100
functionName: 'next'
94101
}, 'at next (/Users/workspace/pinpoint/pinpoint-node-agent/node_modules/express/lib/router/index.js:280:10)')

0 commit comments

Comments
 (0)