Skip to content

Commit 73b091d

Browse files
authored
fix: Report SDK user error for invalid span name (#879)
1 parent cb7a5ea commit 73b091d

File tree

2 files changed

+61
-6
lines changed

2 files changed

+61
-6
lines changed

node/packages/sdk/index.js

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -65,32 +65,55 @@ serverlessSdk.setEndpoint = (endpoint) => {
6565
serverlessSdk._userDefinedEndpoint = endpoint;
6666
};
6767
serverlessSdk.createSpan = (name, closure) => {
68-
const span = serverlessSdk._createTraceSpan(name);
68+
let span;
69+
70+
try {
71+
span = serverlessSdk._createTraceSpan(name);
72+
} catch (error) {
73+
try {
74+
reportError(error, { type: 'USER' });
75+
} catch (err) {
76+
// ignore
77+
}
78+
}
6979

7080
if (closure && isFunction(closure)) {
7181
let result;
7282
try {
7383
result = closure();
7484
} catch (e) {
75-
span.close();
85+
if (span) {
86+
span.close();
87+
}
7688
throw e;
7789
}
7890
if (isThenable(result)) {
7991
return result.then(
8092
(resolution) => {
81-
span.close();
93+
if (span) {
94+
span.close();
95+
}
8296
return resolution;
8397
},
8498
(error) => {
85-
span.close();
99+
if (span) {
100+
span.close();
101+
}
86102
throw error;
87103
}
88104
);
89105
}
90-
span.close();
106+
if (span) {
107+
span.close();
108+
}
91109
return result;
92110
}
93-
return span;
111+
112+
if (span) {
113+
return span;
114+
}
115+
116+
return { close: () => {} };
94117
};
95118

96119
// Private

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

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,4 +133,36 @@ describe('.createSpan', () => {
133133
expect(spans[0].parentSpan).to.equal(spans[1]);
134134
expect(result).to.equal('test');
135135
});
136+
137+
it('should not create a span if span name is invalid with a single argument', async () => {
138+
const spans = [];
139+
serverlessSdk._settings.disableCapturedEventsStdout = true;
140+
serverlessSdk._eventEmitter.on('trace-span-close', (traceSpan) => spans.push(traceSpan));
141+
const span = serverlessSdk.createSpan('testspan-1');
142+
span.close();
143+
expect(spans.length).to.equal(0);
144+
});
145+
146+
it('should not create a span if span name is invalid with a encaspulated context', async () => {
147+
const spans = [];
148+
serverlessSdk._settings.disableCapturedEventsStdout = true;
149+
serverlessSdk._eventEmitter.on('trace-span-close', (traceSpan) => spans.push(traceSpan));
150+
const result = serverlessSdk.createSpan('testspan-1', () => {
151+
return 'test';
152+
});
153+
expect(spans.length).to.equal(0);
154+
expect(result).to.equal('test');
155+
});
156+
157+
it('should not create a span if span name is invalid with an async encaspulated context', async () => {
158+
const spans = [];
159+
serverlessSdk._settings.disableCapturedEventsStdout = true;
160+
serverlessSdk._eventEmitter.on('trace-span-close', (traceSpan) => spans.push(traceSpan));
161+
const result = await serverlessSdk.createSpan('testspan-1', async () => {
162+
await new Promise((resolve) => setTimeout(resolve, 500));
163+
return 'test';
164+
});
165+
expect(spans.length).to.equal(0);
166+
expect(result).to.equal('test');
167+
});
136168
});

0 commit comments

Comments
 (0)