Skip to content

Commit ce04dba

Browse files
committed
feat: expose ns-stack
1 parent a21a310 commit ce04dba

File tree

4 files changed

+65
-2
lines changed

4 files changed

+65
-2
lines changed

src/main/global/InvokeHandler.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { config } from 'mesh-config';
1010
import { dep } from 'mesh-ioc';
1111

1212
import { PreconditionFailedError } from '../errors.js';
13+
import { parseStack } from '../util/stack.js';
1314
import { ModuleResolver } from './ModuleResolver.js';
1415

1516
const EXTENDED_LATENCY_BUCKETS = [
@@ -101,9 +102,17 @@ export class InvokeHandler implements HttpHandler {
101102
try {
102103
const result = await computeFn(params, ctx);
103104
return resultToResponse(result);
104-
} catch (error) {
105+
} catch (error: any) {
105106
this.logger.warn('Graph error', { error });
106-
return errorToResponse(error);
107+
const res = errorToResponse(error);
108+
const stack = parseStack(error?.stack ?? '');
109+
// TODO observe if this is enough
110+
const nodeUids = stack
111+
.map(item => item.symbol)
112+
.filter(symbol => symbol.startsWith('root:'))
113+
.slice(0, 20);
114+
res.headers['ns-stack'] = [nodeUids.join(',')];
115+
return res;
107116
} finally {
108117
ctx.finalize();
109118
}

src/main/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,4 @@ export * from './global/MainHttpServer.js';
55
export * from './global/ModuleResolver.js';
66
export * from './global/UptimeChecker.js';
77
export * from './sandbox.js';
8+
export * from './util/stack.js';

src/main/util/stack.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
export interface StackItem {
2+
symbol: string;
3+
source: string;
4+
}
5+
6+
export function parseStack(stack: string): StackItem[] {
7+
const lines = stack.split('\n').filter(line => line.trim().startsWith('at'));
8+
const result: StackItem[] = [];
9+
for (const line of lines) {
10+
const match = /^\s*at(?:\s+async)?\s+(\S+)\s+\((.*)\)$/.exec(line);
11+
if (!match) {
12+
continue;
13+
}
14+
result.push({
15+
symbol: match[1] ?? '',
16+
source: match[2] ?? '',
17+
});
18+
}
19+
return result;
20+
}

src/test/util.test.ts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import assert from 'assert';
2+
3+
import { parseStack } from '../main/util/stack.js';
4+
5+
describe('parseStack', () => {
6+
it('parses error stack', () => {
7+
const stack = `
8+
error: Error [BoomError]: Something bad happened
9+
at compute (data:text/javascript;base64,...:1:340)
10+
at root:Hvok7Y1K:SHpmQ5Wn (data:text/javascript;base64,...:1:936)
11+
at root:Hvok7Y1K:result (data:text/javascript;base64,...:1:816)
12+
at data:text/javascript;base64,...:1:686
13+
at compute (data:text/javascript;base64,...:1:209)
14+
at root:Hvok7Y1K (data:text/javascript;base64,...:1:664)
15+
at async Promise.all (index 0)
16+
at async root:result (data:text/javascript;base64,...:1:486)
17+
at async compute (data:text/javascript;base64,...:1:1434)
18+
at async derived.computeResponse (file:///foo/bar/baz/InvokeHandler.js:90:28)
19+
`;
20+
const parsed = parseStack(stack);
21+
assert.deepStrictEqual(parsed, [
22+
{ symbol: 'compute', source: 'data:text/javascript;base64,...:1:340' },
23+
{ symbol: 'root:Hvok7Y1K:SHpmQ5Wn', source: 'data:text/javascript;base64,...:1:936' },
24+
{ symbol: 'root:Hvok7Y1K:result', source: 'data:text/javascript;base64,...:1:816' },
25+
{ symbol: 'compute', source: 'data:text/javascript;base64,...:1:209' },
26+
{ symbol: 'root:Hvok7Y1K', source: 'data:text/javascript;base64,...:1:664' },
27+
{ symbol: 'Promise.all', source: 'index 0' },
28+
{ symbol: 'root:result', source: 'data:text/javascript;base64,...:1:486' },
29+
{ symbol: 'compute', source: 'data:text/javascript;base64,...:1:1434' },
30+
{ symbol: 'derived.computeResponse', source: 'file:///foo/bar/baz/InvokeHandler.js:90:28' },
31+
]);
32+
});
33+
});

0 commit comments

Comments
 (0)