Skip to content

Commit fdf769c

Browse files
authored
Merge pull request #368 from backtrace-labs/bugfix/in-memory-attribute-support
sdk-core, node: In memory proper attribute filtering
2 parents bc27a22 + 19babc4 commit fdf769c

2 files changed

Lines changed: 45 additions & 42 deletions

File tree

‎packages/node/src/breadcrumbs/FileBreadcrumbsStorage.ts‎

Lines changed: 1 addition & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import {
2-
AttributeType,
32
BacktraceAttachment,
43
BacktraceAttachmentProvider,
54
Breadcrumb,
@@ -108,7 +107,7 @@ export class FileBreadcrumbsStorage implements BreadcrumbsStorage {
108107
timestamp: TimeHelper.now(),
109108
type: BreadcrumbType[rawBreadcrumb.type].toLowerCase(),
110109
level: BreadcrumbLogLevel[rawBreadcrumb.level].toLowerCase(),
111-
attributes: this.prepareAttributes(rawBreadcrumb.attributes),
110+
attributes: rawBreadcrumb.attributes,
112111
};
113112
const breadcrumbJson = JSON.stringify(breadcrumb, jsonEscaper());
114113
const jsonLength = breadcrumbJson.length + 1; // newline
@@ -123,46 +122,6 @@ export class FileBreadcrumbsStorage implements BreadcrumbsStorage {
123122
return id;
124123
}
125124

126-
private prepareAttributes(attributes?: Record<string, AttributeType>): Record<string, AttributeType> | undefined {
127-
const result: Record<string, AttributeType> = {};
128-
if (!attributes) {
129-
return undefined;
130-
}
131-
for (const key in attributes) {
132-
const value = attributes[key];
133-
switch (typeof value) {
134-
case 'number':
135-
case 'boolean':
136-
case 'string':
137-
case 'undefined':
138-
result[key] = value;
139-
break;
140-
case 'bigint':
141-
result[key] = (value as bigint).toString();
142-
break;
143-
case 'object': {
144-
if (!value) {
145-
result[key] = value;
146-
break;
147-
}
148-
const unknownValue = value as unknown;
149-
try {
150-
if (unknownValue instanceof Date) {
151-
result[key] = unknownValue.toISOString();
152-
} else if (unknownValue instanceof URL) {
153-
result[key] = unknownValue.toString();
154-
}
155-
} catch {
156-
// revoked proxy or broken object — drop it
157-
}
158-
// drop all other objects
159-
break;
160-
}
161-
}
162-
}
163-
return result;
164-
}
165-
166125
private static getFileName(index: number) {
167126
return `${FILE_PREFIX}-${index}`;
168127
}

‎packages/sdk-core/src/modules/breadcrumbs/BreadcrumbsManager.ts‎

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,13 @@ export class BreadcrumbsManager implements BacktraceBreadcrumbs, BacktraceModule
185185
rawBreadcrumb.message = rawBreadcrumb.message.substring(0, this._limits.maximumBreadcrumbMessageLength);
186186
}
187187

188+
if (rawBreadcrumb.attributes) {
189+
rawBreadcrumb = {
190+
...rawBreadcrumb,
191+
attributes: this.prepareAttributes(rawBreadcrumb.attributes),
192+
};
193+
}
194+
188195
let limitedBreadcrumb: RawBreadcrumb | LimitedRawBreadcrumb;
189196
if (this._limits.maximumAttributesDepth !== undefined && rawBreadcrumb.attributes) {
190197
limitedBreadcrumb = {
@@ -207,6 +214,43 @@ export class BreadcrumbsManager implements BacktraceBreadcrumbs, BacktraceModule
207214
return id !== undefined;
208215
}
209216

217+
private prepareAttributes(attributes: Record<string, AttributeType>): Record<string, AttributeType> {
218+
const result: Record<string, AttributeType> = {};
219+
for (const key in attributes) {
220+
const value = attributes[key];
221+
switch (typeof value) {
222+
case 'number':
223+
case 'boolean':
224+
case 'string':
225+
case 'undefined':
226+
result[key] = value;
227+
break;
228+
case 'bigint':
229+
result[key] = (value as bigint).toString();
230+
break;
231+
case 'object': {
232+
if (!value) {
233+
result[key] = value;
234+
break;
235+
}
236+
const unknownValue = value as unknown;
237+
try {
238+
if (unknownValue instanceof Date) {
239+
result[key] = unknownValue.toISOString();
240+
} else if (unknownValue instanceof URL) {
241+
result[key] = unknownValue.toString();
242+
}
243+
} catch {
244+
// revoked proxy or broken object — drop it
245+
}
246+
// drop all other objects
247+
break;
248+
}
249+
}
250+
}
251+
return result;
252+
}
253+
210254
/**
211255
* The expectation is, message should always be defined and passed as string.
212256
* However, logger can pass as a message an object or any other unknown type.

0 commit comments

Comments
 (0)