Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions .size-limit.js
Original file line number Diff line number Diff line change
Expand Up @@ -221,7 +221,7 @@ module.exports = [
name: 'CDN Bundle (incl. Tracing, Replay, Logs, Metrics)',
path: createCDNPath('bundle.tracing.replay.logs.metrics.min.js'),
gzip: true,
limit: '83 KB',
limit: '83.5 KB',
},
{
name: 'CDN Bundle (incl. Tracing, Replay, Feedback)',
Expand Down Expand Up @@ -283,7 +283,7 @@ module.exports = [
path: createCDNPath('bundle.tracing.replay.logs.metrics.min.js'),
gzip: false,
brotli: false,
limit: '255 KB',
limit: '255.5 KB',
},
{
name: 'CDN Bundle (incl. Tracing, Replay, Feedback) - uncompressed',
Expand All @@ -297,7 +297,7 @@ module.exports = [
path: createCDNPath('bundle.tracing.replay.feedback.logs.metrics.min.js'),
gzip: false,
brotli: false,
limit: '268 KB',
limit: '268.5 KB',
},
// Next.js SDK (ESM)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,8 @@ sentryTest(
[
{ content_type: 'application/vnd.sentry.items.span.v2+json', item_count: 4, type: 'span' },
{
version: 2,
ingest_settings: { infer_ip: 'never', infer_useragent: 'never' },
items: expect.any(Array),
},
],
Expand Down
16 changes: 13 additions & 3 deletions packages/core/src/tracing/spans/envelope.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import type { DynamicSamplingContext, SpanContainerItem, StreamedSpanEnvelope }
import type { SerializedStreamedSpan } from '../../types-hoist/span';
import { dsnToString } from '../../utils/dsn';
import { createEnvelope, getSdkMetadataForEnvelopeHeader } from '../../utils/envelope';
import { isBrowser } from '../../utils/isBrowser';

/**
* Creates a span v2 span streaming envelope
Expand All @@ -12,9 +13,10 @@ export function createStreamedSpanEnvelope(
dsc: Partial<DynamicSamplingContext>,
client: Client,
): StreamedSpanEnvelope {
const options = client.getOptions();
const dsn = client.getDsn();
const tunnel = client.getOptions().tunnel;
const sdk = getSdkMetadataForEnvelopeHeader(client.getOptions()._metadata);
const tunnel = options.tunnel;
const sdk = getSdkMetadataForEnvelopeHeader(options._metadata);

const headers: StreamedSpanEnvelope[0] = {
sent_at: new Date().toISOString(),
Expand All @@ -23,9 +25,17 @@ export function createStreamedSpanEnvelope(
...(!!tunnel && dsn && { dsn: dsnToString(dsn) }),
};

const inferSetting = options.sendDefaultPii ? 'auto' : 'never';

const spanContainer: SpanContainerItem = [
{ type: 'span', item_count: serializedSpans.length, content_type: 'application/vnd.sentry.items.span.v2+json' },
{ items: serializedSpans },
{
version: 2,
...(isBrowser() && {
ingest_settings: { infer_ip: inferSetting, infer_useragent: inferSetting },
}),
items: serializedSpans,
},
];

return createEnvelope<StreamedSpanEnvelope>(headers, [spanContainer]);
Expand Down
5 changes: 5 additions & 0 deletions packages/core/src/types-hoist/span.ts
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,11 @@ export type SerializedStreamedSpan = Omit<StreamedSpanJSON, 'attributes' | 'link
* Envelope span item container.
*/
export type SerializedStreamedSpanContainer = {
version?: number;
ingest_settings?: {
infer_ip?: 'auto' | 'never';
infer_useragent?: 'auto' | 'never';
};
items: Array<SerializedStreamedSpan>;
};

Expand Down
75 changes: 73 additions & 2 deletions packages/core/test/lib/tracing/spans/envelope.test.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,18 @@
import { describe, expect, it } from 'vitest';
import { afterEach, describe, expect, it, vi } from 'vitest';
import { createStreamedSpanEnvelope } from '../../../../src/tracing/spans/envelope';
import type { DynamicSamplingContext } from '../../../../src/types-hoist/envelope';
import type { SerializedStreamedSpan } from '../../../../src/types-hoist/span';
import { isBrowser } from '../../../../src/utils/isBrowser';
import { getDefaultTestClientOptions, TestClient } from '../../../mocks/client';

vi.mock('../../../../src/utils/isBrowser', () => ({
isBrowser: vi.fn(() => false),
}));

afterEach(() => {
vi.mocked(isBrowser).mockReturnValue(false);
});

function createMockSerializedSpan(overrides: Partial<SerializedStreamedSpan> = {}): SerializedStreamedSpan {
return {
trace_id: 'abc123',
Expand Down Expand Up @@ -181,6 +190,7 @@ describe('createStreamedSpanEnvelope', () => {
type: 'span',
},
{
version: 2,
items: [mockSpan],
},
],
Expand All @@ -199,7 +209,7 @@ describe('createStreamedSpanEnvelope', () => {
expect(envelopeItems).toEqual([
[
{ type: 'span', item_count: 3, content_type: 'application/vnd.sentry.items.span.v2+json' },
{ items: [mockSpan1, mockSpan2, mockSpan3] },
{ version: 2, items: [mockSpan1, mockSpan2, mockSpan3] },
],
]);
});
Expand All @@ -222,11 +232,72 @@ describe('createStreamedSpanEnvelope', () => {
type: 'span',
},
{
version: 2,
items: [],
},
],
],
]);
});

it("includes ingest_settings with 'auto' values when in browser and sendDefaultPii is true", () => {
vi.mocked(isBrowser).mockReturnValue(true);

const mockSpan = createMockSerializedSpan();
const mockClient = new TestClient(getDefaultTestClientOptions({ sendDefaultPii: true }));
const dsc: Partial<DynamicSamplingContext> = {};

const envelopeItems = createStreamedSpanEnvelope([mockSpan], dsc, mockClient)[1];

expect(envelopeItems).toEqual([
[
{ type: 'span', item_count: 1, content_type: 'application/vnd.sentry.items.span.v2+json' },
{
version: 2,
ingest_settings: { infer_ip: 'auto', infer_useragent: 'auto' },
items: [mockSpan],
},
],
]);
});

it("includes ingest_settings with 'never' values when in browser and sendDefaultPii is false", () => {
vi.mocked(isBrowser).mockReturnValue(true);

const mockSpan = createMockSerializedSpan();
const mockClient = new TestClient(getDefaultTestClientOptions({ sendDefaultPii: false }));
const dsc: Partial<DynamicSamplingContext> = {};

const envelopeItems = createStreamedSpanEnvelope([mockSpan], dsc, mockClient)[1];

expect(envelopeItems).toEqual([
[
{ type: 'span', item_count: 1, content_type: 'application/vnd.sentry.items.span.v2+json' },
{
version: 2,
ingest_settings: { infer_ip: 'never', infer_useragent: 'never' },
items: [mockSpan],
},
],
]);
});

it('omits ingest_settings when not in browser', () => {
const mockSpan = createMockSerializedSpan();
const mockClient = new TestClient(getDefaultTestClientOptions({ sendDefaultPii: true }));
const dsc: Partial<DynamicSamplingContext> = {};

const envelopeItems = createStreamedSpanEnvelope([mockSpan], dsc, mockClient)[1];

expect(envelopeItems).toEqual([
[
{ type: 'span', item_count: 1, content_type: 'application/vnd.sentry.items.span.v2+json' },
{
version: 2,
items: [mockSpan],
},
],
]);
});
Comment thread
cursor[bot] marked this conversation as resolved.
});
});
Loading