Skip to content

Commit fec485f

Browse files
authored
Add debug IDs support to sdk-core, node and browser packages (#33)
* sdk-core: add DebugIdProvider and DebugIdMapProvider * sdk-core: add appending debugId to frames * browser, node: use VariableDebugIdMapProvider * sdk-core: change debugId to debug_identifier * sdk-core: fix unit tests, add test for debug_identifier set * sdk core: load debugIds on DebugIdProvider construction --------- Co-authored-by: Sebastian Alex <sebastian.alex@saucelabs.com>
1 parent 45ac71d commit fec485f

File tree

11 files changed

+142
-10
lines changed

11 files changed

+142
-10
lines changed

packages/browser/src/BacktraceClient.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@ import {
33
BacktraceCoreClient,
44
BacktraceRequestHandler,
55
BacktraceStackTraceConverter,
6+
DebugIdContainer,
7+
VariableDebugIdMapProvider,
68
} from '@backtrace/sdk-core';
7-
import { AGENT } from './agentDefinition';
89
import { BacktraceBrowserSessionProvider } from './BacktraceBrowserSessionProvider';
910
import { BacktraceConfiguration } from './BacktraceConfiguration';
11+
import { AGENT } from './agentDefinition';
1012
import { BacktraceClientBuilder } from './builder/BacktraceClientBuilder';
1113

1214
export class BacktraceClient extends BacktraceCoreClient {
@@ -16,7 +18,15 @@ export class BacktraceClient extends BacktraceCoreClient {
1618
attributeProviders: BacktraceAttributeProvider[],
1719
stackTraceConverter: BacktraceStackTraceConverter,
1820
) {
19-
super(options, AGENT, handler, attributeProviders, stackTraceConverter, new BacktraceBrowserSessionProvider());
21+
super(
22+
options,
23+
AGENT,
24+
handler,
25+
attributeProviders,
26+
stackTraceConverter,
27+
new BacktraceBrowserSessionProvider(),
28+
new VariableDebugIdMapProvider(window as DebugIdContainer),
29+
);
2030
}
2131

2232
public static builder(options: BacktraceConfiguration): BacktraceClientBuilder {

packages/node/src/BacktraceClient.ts

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
import {
22
BacktraceAttributeProvider,
3-
BacktraceConfiguration as CoreConfiguration,
43
BacktraceCoreClient,
54
BacktraceRequestHandler,
5+
BacktraceConfiguration as CoreConfiguration,
6+
DebugIdContainer,
7+
VariableDebugIdMapProvider,
68
} from '@backtrace/sdk-core';
7-
import { AGENT } from './agentDefinition';
89
import { BacktraceConfiguration } from './BacktraceConfiguration';
10+
import { AGENT } from './agentDefinition';
911
import { BacktraceClientBuilder } from './builder/BacktraceClientBuilder';
1012

1113
export class BacktraceClient extends BacktraceCoreClient {
@@ -14,7 +16,15 @@ export class BacktraceClient extends BacktraceCoreClient {
1416
handler: BacktraceRequestHandler,
1517
attributeProviders: BacktraceAttributeProvider[],
1618
) {
17-
super(options, AGENT, handler, attributeProviders);
19+
super(
20+
options,
21+
AGENT,
22+
handler,
23+
attributeProviders,
24+
undefined,
25+
undefined,
26+
new VariableDebugIdMapProvider(global as DebugIdContainer),
27+
);
1828
}
1929

2030
public static builder(options: BacktraceConfiguration): BacktraceClientBuilder {

packages/sdk-core/src/BacktraceCoreClient.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ import {
33
BacktraceAttributeProvider,
44
BacktraceSessionProvider,
55
BacktraceStackTraceConverter,
6+
DebugIdMapProvider,
7+
DebugIdProvider,
68
} from '.';
79
import { SdkOptions } from './builder/SdkOptions';
810
import { BacktraceConfiguration } from './model/configuration/BacktraceConfiguration';
@@ -75,8 +77,14 @@ export abstract class BacktraceCoreClient {
7577
attributeProviders: BacktraceAttributeProvider[] = [],
7678
stackTraceConverter: BacktraceStackTraceConverter = new V8StackTraceConverter(),
7779
private readonly _sessionProvider: BacktraceSessionProvider = new SingleSessionProvider(),
80+
debugIdMapProvider?: DebugIdMapProvider,
7881
) {
79-
this._dataBuilder = new BacktraceDataBuilder(this._sdkOptions, stackTraceConverter);
82+
this._dataBuilder = new BacktraceDataBuilder(
83+
this._sdkOptions,
84+
stackTraceConverter,
85+
new DebugIdProvider(stackTraceConverter, debugIdMapProvider),
86+
);
87+
8088
this._reportSubmission = new BacktraceReportSubmission(options, requestHandler);
8189
this._rateLimitWatcher = new RateLimitWatcher(options.rateLimit);
8290
this._attributeProvider = new AttributeManager([

packages/sdk-core/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,4 @@ export * from './model/report/BacktraceReport';
1111
export * from './modules/attribute/BacktraceAttributeProvider';
1212
export * from './modules/converter';
1313
export * from './modules/metrics/BacktraceSessionProvider';
14+
export * from './sourcemaps/index';

packages/sdk-core/src/model/data/BacktraceStackTrace.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ export interface BacktraceStackFrame {
44
column?: number;
55
sourceCode?: string;
66
library: string;
7+
debug_identifier?: string;
78
}
89

910
/**

packages/sdk-core/src/modules/data/BacktraceDataBuilder.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { BacktraceStackTraceConverter } from '../..';
1+
import { BacktraceStackTraceConverter, DebugIdProvider } from '../..';
22
import { SdkOptions } from '../../builder/SdkOptions';
33
import { IdGenerator } from '../../common/IdGenerator';
44
import { TimeHelper } from '../../common/TimeHelper';
@@ -12,6 +12,7 @@ export class BacktraceDataBuilder {
1212
constructor(
1313
private readonly _sdkOptions: SdkOptions,
1414
private readonly _stackTraceConverter: BacktraceStackTraceConverter,
15+
private readonly _debugIdProvider: DebugIdProvider,
1516
) {}
1617

1718
public build(
@@ -21,6 +22,12 @@ export class BacktraceDataBuilder {
2122
): BacktraceData {
2223
const reportData = ReportDataBuilder.build(report.attributes);
2324

25+
const stackTrace = this._stackTraceConverter.convert(report.stackTrace, report.message);
26+
27+
for (const frame of stackTrace) {
28+
frame.debug_identifier = this._debugIdProvider.getDebugId(frame.library);
29+
}
30+
2431
return {
2532
uuid: IdGenerator.uuid(),
2633
timestamp: TimeHelper.toTimestampInSec(report.timestamp),
@@ -34,7 +41,7 @@ export class BacktraceDataBuilder {
3441
[this.MAIN_THREAD_NAME]: {
3542
fault: true,
3643
name: this.MAIN_THREAD_NAME,
37-
stack: this._stackTraceConverter.convert(report.stackTrace, report.message),
44+
stack: stackTrace,
3845
},
3946
},
4047
annotations: {
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import { BacktraceStackTraceConverter } from '../modules/converter';
2+
import { DebugIdMapProvider } from './interfaces/DebugIdMapProvider';
3+
4+
export const SOURCE_DEBUG_ID_VARIABLE = '_btDebugIds';
5+
6+
export class DebugIdProvider {
7+
private readonly _fileDebugIds: Record<string, string>;
8+
9+
constructor(
10+
private readonly _stackTraceConverter: BacktraceStackTraceConverter,
11+
private readonly _debugIdMapProvider?: DebugIdMapProvider,
12+
) {
13+
this._fileDebugIds = this.loadDebugIds();
14+
}
15+
16+
public getDebugId(file: string): string | undefined {
17+
return this._fileDebugIds[file];
18+
}
19+
20+
private loadDebugIds() {
21+
const debugIdMap = this._debugIdMapProvider?.getDebugIdMap();
22+
if (!debugIdMap) {
23+
return {};
24+
}
25+
26+
const message = new Error().message;
27+
const result: Record<string, string> = {};
28+
for (const [rawStack, debugId] of Object.entries(debugIdMap)) {
29+
const frames = this._stackTraceConverter.convert(rawStack, message);
30+
if (!frames.length) {
31+
continue;
32+
}
33+
34+
// The first frame will have the file's path
35+
const frame = frames[0];
36+
result[frame.library] = debugId;
37+
}
38+
39+
return result;
40+
}
41+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { SOURCE_DEBUG_ID_VARIABLE } from './DebugIdProvider';
2+
import { DebugIdMapProvider } from './interfaces/DebugIdMapProvider';
3+
4+
export interface DebugIdContainer {
5+
[SOURCE_DEBUG_ID_VARIABLE]?: Record<string, string>;
6+
}
7+
8+
export class VariableDebugIdMapProvider implements DebugIdMapProvider {
9+
constructor(private readonly _variable: DebugIdContainer) {}
10+
11+
public getDebugIdMap(): Record<string, string> {
12+
return this._variable[SOURCE_DEBUG_ID_VARIABLE] ?? {};
13+
}
14+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export * from './DebugIdProvider';
2+
export * from './VariableDebugIdMapProvider';
3+
export * from './interfaces/DebugIdMapProvider';
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export interface DebugIdMapProvider {
2+
getDebugIdMap(): Record<string, string>;
3+
}

0 commit comments

Comments
 (0)