Skip to content

Commit 267c9ed

Browse files
authored
fix(browser): Add ingest_settings to v2 log envelope payload (#20453)
Adds `version: 2` and `ingest_settings` to the log envelope payload so Relay can infer the end-user IP address and User-Agent from the incoming request ([link to spec](https://develop.sentry.dev/sdk/telemetry/logs/#wire-format)). This is only emitted by the browser SDK. Both settings are currently gated behind `sendDefaultPii` (modeled after how `event.sdk.settings.infer_ip`). This slightly changes behavior in this case because we were always inferring some user data on logs before (e.g. `browser.name/version`). This data will not be there anymore after this change, unless `sendDefaultPii` is enabled. Closes #20277
1 parent a15173f commit 267c9ed

11 files changed

Lines changed: 91 additions & 11 deletions

File tree

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@
44

55
- "You miss 100 percent of the chances you don't take. — Wayne Gretzky" — Michael Scott
66

7+
- **feat(browser): Add `ingest_settings` to v2 log envelope payload ([#20453](https://github.com/getsentry/sentry-javascript/pull/20453))**
8+
9+
Inference of user data (e.g. IP address, browser name/version) on log events is now gated behind the `sendDefaultPii` option. Previously, this data was always inferred by default.
10+
711
## 10.51.0
812

913
### Important Changes

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

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

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ sentryTest('captures logs with scope attributes', async ({ getLocalTestUrl, page
2222
content_type: 'application/vnd.sentry.items.log+json',
2323
},
2424
{
25+
version: 2,
26+
ingest_settings: { infer_ip: 'never', infer_user_agent: 'never' },
2527
items: [
2628
{
2729
timestamp: expect.any(Number),

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_user_agent: 'never' },
2628
items: [
2729
{
2830
timestamp: expect.any(Number),

dev-packages/node-core-integration-tests/suites/light-mode/logs/test.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ describe('light mode logs', () => {
1111
.expect({
1212
log: logsContainer => {
1313
expect(logsContainer).toEqual({
14+
version: 2,
1415
items: [
1516
{
1617
attributes: {

dev-packages/node-core-integration-tests/suites/public-api/logs/test.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ describe('logger public API', () => {
1111
.expect({
1212
log: logsContainer => {
1313
expect(logsContainer).toEqual({
14+
version: 2,
1415
items: [
1516
{
1617
attributes: {

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ describe('logs', () => {
3939
.expect({
4040
log: logsContainer => {
4141
expect(logsContainer).toEqual({
42+
version: 2,
4243
items: [
4344
{
4445
timestamp: expect.any(Number),

packages/core/src/logs/envelope.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,29 @@ 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.
14+
* Only emitted as `ingest_settings` in browser environments.
1215
* @returns The created log container envelope item.
1316
*/
14-
export function createLogContainerEnvelopeItem(items: Array<SerializedLog>): LogContainerItem {
17+
export function createLogContainerEnvelopeItem(items: Array<SerializedLog>, inferUserData?: boolean): LogContainerItem {
18+
const inferSetting = inferUserData ? 'auto' : 'never';
1519
return [
1620
{
1721
type: 'log',
1822
item_count: items.length,
1923
content_type: 'application/vnd.sentry.items.log+json',
2024
},
2125
{
26+
version: 2,
27+
...(isBrowser() && {
28+
ingest_settings: { infer_ip: inferSetting, infer_user_agent: inferSetting },
29+
}),
2230
items,
2331
},
2432
];
@@ -33,13 +41,15 @@ export function createLogContainerEnvelopeItem(items: Array<SerializedLog>): Log
3341
* @param metadata - The metadata to include in the envelope.
3442
* @param tunnel - The tunnel to include in the envelope.
3543
* @param dsn - The DSN to include in the envelope.
44+
* @param inferUserData - If true, tells Relay to infer the end-user IP and User-Agent from the incoming request.
3645
* @returns The created envelope.
3746
*/
3847
export function createLogEnvelope(
3948
logs: Array<SerializedLog>,
4049
metadata?: SdkMetadata,
4150
tunnel?: string,
4251
dsn?: DsnComponents,
52+
inferUserData?: boolean,
4353
): LogEnvelope {
4454
const headers: LogEnvelope[0] = {};
4555

@@ -54,5 +64,5 @@ export function createLogEnvelope(
5464
headers.dsn = dsnToString(dsn);
5565
}
5666

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

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_user_agent?: 'auto' | 'never';
71+
};
6772
items: Array<SerializedLog>;
6873
};

0 commit comments

Comments
 (0)