Skip to content

Commit 8c9e03f

Browse files
committed
fix: Handle async closures in createSpan correctly
1 parent 14c6ab2 commit 8c9e03f

File tree

2 files changed

+34
-14
lines changed

2 files changed

+34
-14
lines changed

node/packages/sdk/index.js

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -67,26 +67,27 @@ serverlessSdk.setEndpoint = (endpoint) => {
6767
serverlessSdk.createSpan = (name, closure) => {
6868
const span = serverlessSdk._createTraceSpan(name);
6969

70-
if (closure && isThenable(closure)) {
71-
return closure.then(
72-
(result) => {
73-
span.close();
74-
return result;
75-
},
76-
(error) => {
77-
span.close();
78-
throw error;
79-
}
80-
);
81-
}
82-
8370
if (closure && isFunction(closure)) {
8471
let result;
8572
try {
8673
result = closure();
87-
} finally {
74+
} catch (e) {
8875
span.close();
76+
throw e;
77+
}
78+
if (isThenable(result)) {
79+
return result.then(
80+
(resolution) => {
81+
span.close();
82+
return resolution;
83+
},
84+
(error) => {
85+
span.close();
86+
throw error;
87+
}
88+
);
8989
}
90+
span.close();
9091
return result;
9192
}
9293
return span;

node/packages/sdk/test/unit/index.test.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,4 +114,23 @@ describe('.createSpan', () => {
114114
expect(spans[0].endTime).to.not.be.undefined;
115115
expect(result).to.equal('test');
116116
});
117+
118+
it('should create nested spans using async context .createSpan', async () => {
119+
const spans = [];
120+
serverlessSdk._eventEmitter.on('trace-span-close', (traceSpan) => spans.push(traceSpan));
121+
const result = await serverlessSdk.createSpan('test.test1', async () => {
122+
await new Promise((resolve) => setTimeout(resolve, 500));
123+
await serverlessSdk.createSpan('test.test2', async () => {
124+
await new Promise((resolve) => setTimeout(resolve, 500));
125+
});
126+
return new Promise((resolve) => resolve('test'));
127+
});
128+
129+
expect(spans.length).to.equal(2);
130+
expect(spans[0].name).to.equal('test.test2');
131+
expect(spans[1].parentSpan).to.equal(rootSpan);
132+
expect(spans[1].name).to.equal('test.test1');
133+
expect(spans[0].parentSpan).to.equal(spans[1]);
134+
expect(result).to.equal('test');
135+
});
117136
});

0 commit comments

Comments
 (0)