Skip to content
Open
Show file tree
Hide file tree
Changes from 7 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
2 changes: 2 additions & 0 deletions packages/browser/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,8 @@ export {
getSpanStatusFromHttpCode,
setHttpStatus,
makeMultiplexedTransport,
makeSimpleMultiplexedTransport,
SIMPLE_MULTIPLEXED_TRANSPORT_EXTRA_ROUTING_KEY,
moduleMetadataIntegration,
} from '@sentry/core';
export type { Span } from '@sentry/types';
Expand Down
6 changes: 5 additions & 1 deletion packages/core/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,11 @@ export { ServerRuntimeClient } from './server-runtime-client';
export { initAndBind, setCurrentClient } from './sdk';
export { createTransport } from './transports/base';
export { makeOfflineTransport } from './transports/offline';
export { makeMultiplexedTransport } from './transports/multiplexed';
export {
makeMultiplexedTransport,
SIMPLE_MULTIPLEXED_TRANSPORT_EXTRA_ROUTING_KEY,
makeSimpleMultiplexedTransport,
} from './transports/multiplexed';
export { SDK_VERSION } from './version';
export {
getIntegrationsToSetup,
Expand Down
25 changes: 25 additions & 0 deletions packages/core/src/transports/multiplexed.ts
Original file line number Diff line number Diff line change
Expand Up @@ -139,3 +139,28 @@ export function makeMultiplexedTransport<TO extends BaseTransportOptions>(
};
};
}

export const SIMPLE_MULTIPLEXED_TRANSPORT_EXTRA_ROUTING_KEY = 'SIMPLE_MULTIPLEXED_TRANSPORT_ROUTE_TO';

/**
* Creates a transport that will send events to all DSNs provided in `event.extra[SIMPLE_MULTIPLEXED_TRANSPORT_EXTRA_ROUTING_KEY]`,
* which should contain values in the format of `Array<{ dsn: string;, release: string; }>`.
*
* 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.
*/
export function makeSimpleMultiplexedTransport<TO extends BaseTransportOptions>(
transportGenerator: (options: TO) => Transport,
): (options: TO) => Transport {
return makeMultiplexedTransport(transportGenerator, args => {
const event = args.getEvent();
if (
event &&
event.extra &&
SIMPLE_MULTIPLEXED_TRANSPORT_EXTRA_ROUTING_KEY in event.extra &&
Array.isArray(event.extra[SIMPLE_MULTIPLEXED_TRANSPORT_EXTRA_ROUTING_KEY])
) {
return event.extra[SIMPLE_MULTIPLEXED_TRANSPORT_EXTRA_ROUTING_KEY];
}
return [];
});
}
85 changes: 84 additions & 1 deletion packages/core/test/lib/transports/multiplexed.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,11 @@ import type {
import { createClientReportEnvelope, createEnvelope, dsnFromString, parseEnvelope } from '@sentry/utils';

import { createTransport, getEnvelopeEndpointWithUrlEncodedAuth, makeMultiplexedTransport } from '../../../src';
import { eventFromEnvelope } from '../../../src/transports/multiplexed';
import {
SIMPLE_MULTIPLEXED_TRANSPORT_EXTRA_ROUTING_KEY,
eventFromEnvelope,
makeSimpleMultiplexedTransport,
} from '../../../src/transports/multiplexed';

const DSN1 = 'https://[email protected]/4321';
const DSN1_URL = getEnvelopeEndpointWithUrlEncodedAuth(dsnFromString(DSN1)!);
Expand Down Expand Up @@ -221,3 +225,82 @@ describe('makeMultiplexedTransport', () => {
await transport.send(TRANSACTION_ENVELOPE);
});
});

describe('makeSimpleMultiplexedTransport()', () => {
it('sends events to targets provided in event.extra[SIMPLE_MULTIPLEXED_TRANSPORT_EXTRA_ROUTING_KEY]', async () => {
expect.assertions(2);

const makeTransport = makeSimpleMultiplexedTransport(
createTestTransport(
url => {
expect(url).toBe(DSN1_URL);
},
url => {
expect(url).toBe(DSN2_URL);
},
),
);

const envelope = createEnvelope<EventEnvelope>({ event_id: 'aa3ff046696b4bc6b609ce6d28fde9e2', sent_at: '123' }, [
[
{ type: 'event' },
{
event_id: 'aa3ff046696b4bc6b609ce6d28fde9e2',
extra: {
[SIMPLE_MULTIPLEXED_TRANSPORT_EXTRA_ROUTING_KEY]: [DSN1, DSN2],
},
},
] as EventItem,
]);

const transport = makeTransport({ url: DSN1_URL, ...transportOptions });
await transport.send(envelope);
});

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

const makeTransport = makeSimpleMultiplexedTransport(
createTestTransport(url => {
expect(url).toBe(DSN1_URL);
}),
);

const envelope = createEnvelope<EventEnvelope>({ event_id: 'aa3ff046696b4bc6b609ce6d28fde9e2', sent_at: '123' }, [
[
{ type: 'event' },
{
event_id: 'aa3ff046696b4bc6b609ce6d28fde9e2',
},
] as EventItem,
]);

const transport = makeTransport({ url: DSN1_URL, ...transportOptions });
await transport.send(envelope);
});

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

const makeTransport = makeSimpleMultiplexedTransport(
createTestTransport(url => {
expect(url).toBe(DSN1_URL);
}),
);

const envelope = createEnvelope<EventEnvelope>({ event_id: 'aa3ff046696b4bc6b609ce6d28fde9e2', sent_at: '123' }, [
[
{ type: 'event' },
{
event_id: 'aa3ff046696b4bc6b609ce6d28fde9e2',
extra: {
[SIMPLE_MULTIPLEXED_TRANSPORT_EXTRA_ROUTING_KEY]: [],
},
},
] as EventItem,
]);

const transport = makeTransport({ url: DSN1_URL, ...transportOptions });
await transport.send(envelope);
});
});