Skip to content

Commit 25115c5

Browse files
committed
add ingest settings to log envelope payload
1 parent ff23846 commit 25115c5

5 files changed

Lines changed: 86 additions & 5 deletions

File tree

dev-packages/browser-integration-tests/suites/public-api/logger/simple/test.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ sentryTest('should capture all logging methods', async ({ getLocalTestUrl, page
2323
content_type: 'application/vnd.sentry.items.log+json',
2424
},
2525
{
26+
version: 2,
27+
ingest_settings: { infer_ip: 'never', infer_useragent: 'never' },
2628
items: [
2729
{
2830
timestamp: expect.any(Number),

packages/core/src/logs/envelope.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,28 @@ import type { SerializedLog } from '../types-hoist/log';
44
import type { SdkMetadata } from '../types-hoist/sdkmetadata';
55
import { dsnToString } from '../utils/dsn';
66
import { createEnvelope } from '../utils/envelope';
7+
import { isBrowser } from '../utils/isBrowser';
78

89
/**
910
* Creates a log container envelope item for a list of logs.
1011
*
1112
* @param items - The logs to include in the envelope.
13+
* @param inferUserData - If true, tells Relay to infer the end-user IP and User-Agent from the incoming request.
1214
* @returns The created log container envelope item.
1315
*/
14-
export function createLogContainerEnvelopeItem(items: Array<SerializedLog>): LogContainerItem {
16+
export function createLogContainerEnvelopeItem(items: Array<SerializedLog>, inferUserData?: boolean): LogContainerItem {
17+
const inferSetting = inferUserData ? 'auto' : 'never';
1518
return [
1619
{
1720
type: 'log',
1821
item_count: items.length,
1922
content_type: 'application/vnd.sentry.items.log+json',
2023
},
2124
{
25+
version: 2,
26+
...(isBrowser() && {
27+
ingest_settings: { infer_ip: inferSetting, infer_useragent: inferSetting },
28+
}),
2229
items,
2330
},
2431
];
@@ -33,13 +40,15 @@ export function createLogContainerEnvelopeItem(items: Array<SerializedLog>): Log
3340
* @param metadata - The metadata to include in the envelope.
3441
* @param tunnel - The tunnel to include in the envelope.
3542
* @param dsn - The DSN to include in the envelope.
43+
* @param inferUserData - If true, tells Relay to infer the end-user IP and User-Agent from the incoming request.
3644
* @returns The created envelope.
3745
*/
3846
export function createLogEnvelope(
3947
logs: Array<SerializedLog>,
4048
metadata?: SdkMetadata,
4149
tunnel?: string,
4250
dsn?: DsnComponents,
51+
inferUserData?: boolean,
4352
): LogEnvelope {
4453
const headers: LogEnvelope[0] = {};
4554

@@ -54,5 +63,5 @@ export function createLogEnvelope(
5463
headers.dsn = dsnToString(dsn);
5564
}
5665

57-
return createEnvelope<LogEnvelope>(headers, [createLogContainerEnvelopeItem(logs)]);
66+
return createEnvelope<LogEnvelope>(headers, [createLogContainerEnvelopeItem(logs, inferUserData)]);
5867
}

packages/core/src/logs/internal.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,13 @@ export function _INTERNAL_flushLogsBuffer(client: Client, maybeLogBuffer?: Array
192192
}
193193

194194
const clientOptions = client.getOptions();
195-
const envelope = createLogEnvelope(logBuffer, clientOptions._metadata, clientOptions.tunnel, client.getDsn());
195+
const envelope = createLogEnvelope(
196+
logBuffer,
197+
clientOptions._metadata,
198+
clientOptions.tunnel,
199+
client.getDsn(),
200+
clientOptions.sendDefaultPii,
201+
);
196202

197203
// Clear the log buffer after envelopes have been constructed.
198204
_getBufferMap().set(client, []);

packages/core/src/types-hoist/log.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,5 +64,10 @@ export interface SerializedLog {
6464
}
6565

6666
export type SerializedLogContainer = {
67+
version?: number;
68+
ingest_settings?: {
69+
infer_ip?: 'auto' | 'never';
70+
infer_useragent?: 'auto' | 'never';
71+
};
6772
items: Array<SerializedLog>;
6873
};

packages/core/test/lib/logs/envelope.test.ts

Lines changed: 61 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import type { SerializedLog } from '../../../src/types-hoist/log';
55
import type { SdkMetadata } from '../../../src/types-hoist/sdkmetadata';
66
import * as utilsDsn from '../../../src/utils/dsn';
77
import * as utilsEnvelope from '../../../src/utils/envelope';
8+
import { isBrowser } from '../../../src/utils/isBrowser';
89

910
// Mock utils functions
1011
vi.mock('../../../src/utils/dsn', () => ({
@@ -13,6 +14,13 @@ vi.mock('../../../src/utils/dsn', () => ({
1314
vi.mock('../../../src/utils/envelope', () => ({
1415
createEnvelope: vi.fn((_headers, items) => [_headers, items]),
1516
}));
17+
vi.mock('../../../src/utils/isBrowser', () => ({
18+
isBrowser: vi.fn(() => false),
19+
}));
20+
21+
afterEach(() => {
22+
vi.mocked(isBrowser).mockReturnValue(false);
23+
});
1624

1725
describe('createLogContainerEnvelopeItem', () => {
1826
it('creates an envelope item with correct structure', () => {
@@ -26,7 +34,58 @@ describe('createLogContainerEnvelopeItem', () => {
2634

2735
expect(result).toHaveLength(2);
2836
expect(result[0]).toEqual({ type: 'log', item_count: 2, content_type: 'application/vnd.sentry.items.log+json' });
29-
expect(result[1]).toEqual({ items: [mockLog, mockLog] });
37+
expect(result[1]).toEqual({ version: 2, items: [mockLog, mockLog] });
38+
});
39+
40+
it("includes ingest_settings with 'auto' values when in browser and sendDefaultPii is true", () => {
41+
vi.mocked(isBrowser).mockReturnValue(true);
42+
43+
const mockLog: SerializedLog = {
44+
timestamp: 1713859200,
45+
level: 'info',
46+
body: 'Test log message',
47+
};
48+
49+
const result = createLogContainerEnvelopeItem([mockLog], true);
50+
51+
expect(result[1]).toEqual({
52+
version: 2,
53+
ingest_settings: { infer_ip: 'auto', infer_useragent: 'auto' },
54+
items: [mockLog],
55+
});
56+
});
57+
58+
it("includes ingest_settings with 'never' values when in browser and sendDefaultPii is false", () => {
59+
vi.mocked(isBrowser).mockReturnValue(true);
60+
61+
const mockLog: SerializedLog = {
62+
timestamp: 1713859200,
63+
level: 'info',
64+
body: 'Test log message',
65+
};
66+
67+
const result = createLogContainerEnvelopeItem([mockLog], false);
68+
69+
expect(result[1]).toEqual({
70+
version: 2,
71+
ingest_settings: { infer_ip: 'never', infer_useragent: 'never' },
72+
items: [mockLog],
73+
});
74+
});
75+
76+
it('omits ingest_settings when not in browser', () => {
77+
const mockLog: SerializedLog = {
78+
timestamp: 1713859200,
79+
level: 'info',
80+
body: 'Test log message',
81+
};
82+
83+
const result = createLogContainerEnvelopeItem([mockLog], true);
84+
85+
expect(result[1]).toEqual({
86+
version: 2,
87+
items: [mockLog],
88+
});
3089
});
3190
});
3291

@@ -133,7 +192,7 @@ describe('createLogEnvelope', () => {
133192
expect.arrayContaining([
134193
expect.arrayContaining([
135194
{ type: 'log', item_count: 2, content_type: 'application/vnd.sentry.items.log+json' },
136-
{ items: mockLogs },
195+
{ version: 2, items: mockLogs },
137196
]),
138197
]),
139198
);

0 commit comments

Comments
 (0)