Skip to content

Commit c40b38d

Browse files
committed
Refactor PR to make matcher optional in makeMultiplexedTransport instead of
exposing new extra api
1 parent 9e956b4 commit c40b38d

File tree

5 files changed

+99
-46
lines changed

5 files changed

+99
-46
lines changed

CHANGELOG.md

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

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

7+
### Important Changes
8+
9+
- **feat(core): Make `matcher` parameter optional in `makeMultiplexedTransport` ([#10798](https://github.com/getsentry/sentry-javascript/pull/10798))** .
10+
11+
The `matcher` parameter in `makeMultiplexedTransport` is now optional with a sensible default. This makes it much easier to use the multiplexed transport for sending events to multiple DSNs based on runtime configuration.
12+
13+
**Before:**
14+
15+
```javascript
16+
import { makeFetchTransport, makeMultiplexedTransport } from '@sentry/browser';
17+
18+
const EXTRA_KEY = 'ROUTE_TO';
19+
20+
const transport = makeMultiplexedTransport(makeFetchTransport, args => {
21+
const event = args.getEvent();
22+
if (event?.extra?.[EXTRA_KEY] && Array.isArray(event.extra[EXTRA_KEY])) {
23+
return event.extra[EXTRA_KEY];
24+
}
25+
return [];
26+
});
27+
28+
Sentry.init({
29+
transport,
30+
// ... other options
31+
});
32+
33+
// Capture events with routing info
34+
Sentry.captureException(error, {
35+
extra: {
36+
[EXTRA_KEY]: [
37+
{ dsn: 'https://[email protected]/project1', release: 'v1.0.0' },
38+
{ dsn: 'https://[email protected]/project2' },
39+
],
40+
},
41+
});
42+
```
43+
44+
**After:**
45+
46+
```javascript
47+
import { makeFetchTransport, makeMultiplexedTransport, MULTIPLEXED_TRANSPORT_EXTRA_KEY } from '@sentry/browser';
48+
49+
// Just pass the transport generator - the default matcher handles the rest!
50+
Sentry.init({
51+
transport: makeMultiplexedTransport(makeFetchTransport),
52+
// ... other options
53+
});
54+
55+
// Capture events with routing info using the exported constant
56+
Sentry.captureException(error, {
57+
extra: {
58+
[MULTIPLEXED_TRANSPORT_EXTRA_KEY]: [
59+
{ dsn: 'https://[email protected]/project1', release: 'v1.0.0' },
60+
{ dsn: 'https://[email protected]/project2' },
61+
],
62+
},
63+
});
64+
```
65+
66+
The default matcher looks for routing information in `event.extra[MULTIPLEXED_TRANSPORT_EXTRA_KEY]`. You can still provide a custom matcher function for advanced use cases.
67+
768
- **feat(nextjs): Support cacheComponents on turbopack ([#18304](https://github.com/getsentry/sentry-javascript/pull/18304))**
869
970
This release adds support for `cacheComponents` on turbopack builds. We are working on adding support for this feature in webpack builds as well.

packages/browser/src/index.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,7 @@ export {
5757
getSpanStatusFromHttpCode,
5858
setHttpStatus,
5959
makeMultiplexedTransport,
60-
makeSimpleMultiplexedTransport,
61-
SIMPLE_MULTIPLEXED_TRANSPORT_EXTRA_ROUTING_KEY,
60+
MULTIPLEXED_TRANSPORT_EXTRA_KEY,
6261
moduleMetadataIntegration,
6362
supabaseIntegration,
6463
instrumentSupabaseClient,

packages/core/src/index.ts

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -54,11 +54,7 @@ export { ServerRuntimeClient } from './server-runtime-client';
5454
export { initAndBind, setCurrentClient } from './sdk';
5555
export { createTransport } from './transports/base';
5656
export { makeOfflineTransport } from './transports/offline';
57-
export {
58-
makeMultiplexedTransport,
59-
makeSimpleMultiplexedTransport,
60-
SIMPLE_MULTIPLEXED_TRANSPORT_EXTRA_ROUTING_KEY,
61-
} from './transports/multiplexed';
57+
export { makeMultiplexedTransport, MULTIPLEXED_TRANSPORT_EXTRA_KEY } from './transports/multiplexed';
6258
export { getIntegrationsToSetup, addIntegration, defineIntegration, installedIntegrations } from './integration';
6359
export {
6460
_INTERNAL_skipAiProviderWrapping,

packages/core/src/transports/multiplexed.ts

Lines changed: 26 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,12 @@ interface MatchParam {
2121
type RouteTo = { dsn: string; release: string };
2222
type Matcher = (param: MatchParam) => (string | RouteTo)[];
2323

24+
/**
25+
* Key used in event.extra to provide routing information for the multiplexed transport.
26+
* Should contain an array of `{ dsn: string, release?: string }` objects.
27+
*/
28+
export const MULTIPLEXED_TRANSPORT_EXTRA_KEY = 'MULTIPLEXED_TRANSPORT_EXTRA_KEY';
29+
2430
/**
2531
* Gets an event from an envelope.
2632
*
@@ -79,15 +85,33 @@ function overrideDsn(envelope: Envelope, dsn: string): Envelope {
7985

8086
/**
8187
* Creates a transport that can send events to different DSNs depending on the envelope contents.
88+
*
89+
* If no matcher is provided, the transport will look for routing information in
90+
* `event.extra[MULTIPLEXED_TRANSPORT_EXTRA_KEY]`, which should contain
91+
* an array of `{ dsn: string, release?: string }` objects.
8292
*/
8393
export function makeMultiplexedTransport<TO extends BaseTransportOptions>(
8494
createTransport: (options: TO) => Transport,
85-
matcher: Matcher,
95+
matcher?: Matcher,
8696
): (options: TO) => Transport {
8797
return options => {
8898
const fallbackTransport = createTransport(options);
8999
const otherTransports: Map<string, Transport> = new Map();
90100

101+
// Use provided matcher or default to simple multiplexed transport behavior
102+
const actualMatcher: Matcher =
103+
matcher ||
104+
(args => {
105+
const event = args.getEvent();
106+
if (
107+
event?.extra?.[MULTIPLEXED_TRANSPORT_EXTRA_KEY] &&
108+
Array.isArray(event.extra[MULTIPLEXED_TRANSPORT_EXTRA_KEY])
109+
) {
110+
return event.extra[MULTIPLEXED_TRANSPORT_EXTRA_KEY];
111+
}
112+
return [];
113+
});
114+
91115
function getTransport(dsn: string, release: string | undefined): [string, Transport] | undefined {
92116
// We create a transport for every unique dsn/release combination as there may be code from multiple releases in
93117
// use at the same time
@@ -118,7 +142,7 @@ export function makeMultiplexedTransport<TO extends BaseTransportOptions>(
118142
return eventFromEnvelope(envelope, eventTypes);
119143
}
120144

121-
const transports = matcher({ envelope, getEvent })
145+
const transports = actualMatcher({ envelope, getEvent })
122146
.map(result => {
123147
if (typeof result === 'string') {
124148
return getTransport(result, undefined);
@@ -151,26 +175,3 @@ export function makeMultiplexedTransport<TO extends BaseTransportOptions>(
151175
};
152176
};
153177
}
154-
155-
export const SIMPLE_MULTIPLEXED_TRANSPORT_EXTRA_ROUTING_KEY = 'SIMPLE_MULTIPLEXED_TRANSPORT_ROUTE_TO';
156-
157-
/**
158-
* Creates a transport that will send events to all DSNs provided in `event.extra[SIMPLE_MULTIPLEXED_TRANSPORT_EXTRA_ROUTING_KEY]`,
159-
* which should contain values in the format of `Array<{ dsn: string;, release: string; }>`.
160-
*
161-
* If the value is `undefined` or `[]`, the event will be sent to the `dsn` value provided in your Sentry SDK initialization options as a fallback mechanism.
162-
*/
163-
export function makeSimpleMultiplexedTransport<TO extends BaseTransportOptions>(
164-
transportGenerator: (options: TO) => Transport,
165-
): (options: TO) => Transport {
166-
return makeMultiplexedTransport(transportGenerator, args => {
167-
const event = args.getEvent();
168-
if (
169-
event?.extra?.[SIMPLE_MULTIPLEXED_TRANSPORT_EXTRA_ROUTING_KEY] &&
170-
Array.isArray(event.extra[SIMPLE_MULTIPLEXED_TRANSPORT_EXTRA_ROUTING_KEY])
171-
) {
172-
return event.extra[SIMPLE_MULTIPLEXED_TRANSPORT_EXTRA_ROUTING_KEY];
173-
}
174-
return [];
175-
});
176-
}

packages/core/test/lib/transports/multiplexed.test.ts

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,7 @@ import {
88
makeMultiplexedTransport,
99
parseEnvelope,
1010
} from '../../../src';
11-
import {
12-
eventFromEnvelope,
13-
makeSimpleMultiplexedTransport,
14-
SIMPLE_MULTIPLEXED_TRANSPORT_EXTRA_ROUTING_KEY,
15-
} from '../../../src/transports/multiplexed';
11+
import { eventFromEnvelope, MULTIPLEXED_TRANSPORT_EXTRA_KEY } from '../../../src/transports/multiplexed';
1612
import type { ClientReport } from '../../../src/types-hoist/clientreport';
1713
import type { Envelope, EventEnvelope, EventItem } from '../../../src/types-hoist/envelope';
1814
import type { TransactionEvent } from '../../../src/types-hoist/event';
@@ -247,11 +243,11 @@ describe('makeMultiplexedTransport', () => {
247243
});
248244
});
249245

250-
describe('makeSimpleMultiplexedTransport()', () => {
251-
it('sends events to targets provided in event.extra[SIMPLE_MULTIPLEXED_TRANSPORT_EXTRA_ROUTING_KEY]', async () => {
246+
describe('makeMultiplexedTransport() with default matcher', () => {
247+
it('sends events to targets provided in event.extra[MULTIPLEXED_TRANSPORT_EXTRA_KEY]', async () => {
252248
expect.assertions(2);
253249

254-
const makeTransport = makeSimpleMultiplexedTransport(
250+
const makeTransport = makeMultiplexedTransport(
255251
createTestTransport(
256252
url => {
257253
expect(url).toBe(DSN1_URL);
@@ -268,7 +264,7 @@ describe('makeSimpleMultiplexedTransport()', () => {
268264
{
269265
event_id: 'aa3ff046696b4bc6b609ce6d28fde9e2',
270266
extra: {
271-
[SIMPLE_MULTIPLEXED_TRANSPORT_EXTRA_ROUTING_KEY]: [DSN1, DSN2],
267+
[MULTIPLEXED_TRANSPORT_EXTRA_KEY]: [DSN1, DSN2],
272268
},
273269
},
274270
] as EventItem,
@@ -278,10 +274,10 @@ describe('makeSimpleMultiplexedTransport()', () => {
278274
await transport.send(envelope);
279275
});
280276

281-
it('sends events to default DSN if event.extra[SIMPLE_MULTIPLEXED_TRANSPORT_EXTRA_ROUTING_KEY] is not set', async () => {
277+
it('sends events to default DSN if event.extra[MULTIPLEXED_TRANSPORT_EXTRA_KEY] is not set', async () => {
282278
expect.assertions(1);
283279

284-
const makeTransport = makeSimpleMultiplexedTransport(
280+
const makeTransport = makeMultiplexedTransport(
285281
createTestTransport(url => {
286282
expect(url).toBe(DSN1_URL);
287283
}),
@@ -300,10 +296,10 @@ describe('makeSimpleMultiplexedTransport()', () => {
300296
await transport.send(envelope);
301297
});
302298

303-
it('sends events to default DSN if event.extra[SIMPLE_MULTIPLEXED_TRANSPORT_EXTRA_ROUTING_KEY] is an empty array', async () => {
299+
it('sends events to default DSN if event.extra[MULTIPLEXED_TRANSPORT_EXTRA_KEY] is an empty array', async () => {
304300
expect.assertions(1);
305301

306-
const makeTransport = makeSimpleMultiplexedTransport(
302+
const makeTransport = makeMultiplexedTransport(
307303
createTestTransport(url => {
308304
expect(url).toBe(DSN1_URL);
309305
}),
@@ -315,7 +311,7 @@ describe('makeSimpleMultiplexedTransport()', () => {
315311
{
316312
event_id: 'aa3ff046696b4bc6b609ce6d28fde9e2',
317313
extra: {
318-
[SIMPLE_MULTIPLEXED_TRANSPORT_EXTRA_ROUTING_KEY]: [],
314+
[MULTIPLEXED_TRANSPORT_EXTRA_KEY]: [],
319315
},
320316
},
321317
] as EventItem,

0 commit comments

Comments
 (0)