Skip to content

Commit 930bbf5

Browse files
committed
feat(effect): Use client options to check if metrics are enabled
1 parent d10643e commit 930bbf5

4 files changed

Lines changed: 51 additions & 22 deletions

File tree

packages/core/src/client.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -256,10 +256,10 @@ export abstract class Client<O extends ClientOptions = ClientOptions> {
256256

257257
// todo(v11): Remove the experimental flag
258258
// eslint-disable-next-line deprecation/deprecation
259-
const enableMetrics = this._options.enableMetrics ?? this._options._experiments?.enableMetrics ?? true;
259+
this._options.enableMetrics = this._options.enableMetrics ?? this._options._experiments?.enableMetrics ?? true;
260260

261261
// Setup metric flushing with weight and timeout tracking
262-
if (enableMetrics) {
262+
if (this._options.enableMetrics) {
263263
setupWeightBasedFlushing(
264264
this,
265265
'afterCaptureMetric',

packages/effect/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ const MainLive = HttpLive.pipe(
2222
Layer.provide(
2323
Sentry.effectLayer({
2424
dsn: '__DSN__',
25+
enableLogs: true,
2526
enableEffectLogs: true,
2627
enableEffectMetrics: true,
2728
}),

packages/effect/src/utils/buildEffectLayer.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import type { Client } from '@sentry/core';
12
import type * as EffectLayer from 'effect/Layer';
23
import { empty as emptyLayer, provideMerge } from 'effect/Layer';
34
import { defaultLogger, replace as replaceLogger } from 'effect/Logger';
@@ -19,21 +20,22 @@ export interface EffectLayerBaseOptions {
1920
*/
2021
export function buildEffectLayer<T extends EffectLayerBaseOptions>(
2122
options: T,
22-
client: unknown,
23+
client: Client | undefined,
2324
): EffectLayer.Layer<never, never, never> {
2425
if (!client) {
2526
return emptyLayer;
2627
}
2728

29+
const clientOptions = client.getOptions();
2830
const { enableEffectLogs = false, enableEffectMetrics = false } = options;
2931
let layer: EffectLayer.Layer<never, never, never> = SentryEffectTracerLayer;
3032

31-
if (enableEffectLogs) {
33+
if (enableEffectLogs && clientOptions.enableLogs) {
3234
const effectLogger = replaceLogger(defaultLogger, SentryEffectLogger);
3335
layer = layer.pipe(provideMerge(effectLogger));
3436
}
3537

36-
if (enableEffectMetrics) {
38+
if (enableEffectMetrics && clientOptions.enableMetrics) {
3739
layer = layer.pipe(provideMerge(SentryEffectMetricsLayer));
3840
}
3941

packages/effect/test/buildEffectLayer.test.ts

Lines changed: 43 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,31 @@
11
import { describe, expect, it, vi } from '@effect/vitest';
22
import * as sentryCore from '@sentry/core';
33
import { logger as sentryLogger } from '@sentry/core';
4+
import type { NodeOptions } from '@sentry/node-core';
45
import { Effect, Layer } from 'effect';
56
import { empty as emptyLayer } from 'effect/Layer';
7+
import { init } from '../src/index.server';
68
import { buildEffectLayer } from '../src/utils/buildEffectLayer';
79

10+
function getMockTransport() {
11+
return () => ({
12+
send: vi.fn().mockResolvedValue({}),
13+
flush: vi.fn().mockResolvedValue(true),
14+
});
15+
}
16+
17+
function createClient(options: NodeOptions = {}) {
18+
return init({
19+
dsn: 'https://username@domain/123',
20+
transport: getMockTransport(),
21+
...options,
22+
});
23+
}
24+
825
describe('buildEffectLayer', () => {
926
describe('when client is falsy', () => {
1027
it('returns empty layer when client is null', () => {
11-
const layer = buildEffectLayer({}, null);
28+
const layer = buildEffectLayer({}, undefined);
1229

1330
expect(layer).toBeDefined();
1431
expect(Layer.isLayer(layer)).toBe(true);
@@ -25,45 +42,49 @@ describe('buildEffectLayer', () => {
2542
});
2643

2744
describe('when client is truthy', () => {
28-
const mockClient = { mock: true };
29-
3045
it('returns a valid layer with default options', () => {
31-
const layer = buildEffectLayer({}, mockClient);
46+
const client = createClient();
47+
const layer = buildEffectLayer({}, client);
3248

3349
expect(layer).toBeDefined();
3450
expect(Layer.isLayer(layer)).toBe(true);
3551
});
3652

3753
it('returns a valid layer with enableEffectLogs: false', () => {
38-
const layer = buildEffectLayer({ enableEffectLogs: false }, mockClient);
54+
const client = createClient();
55+
const layer = buildEffectLayer({ enableEffectLogs: false }, client);
3956

4057
expect(layer).toBeDefined();
4158
expect(Layer.isLayer(layer)).toBe(true);
4259
});
4360

4461
it('returns a valid layer with enableEffectLogs: true', () => {
45-
const layer = buildEffectLayer({ enableEffectLogs: true }, mockClient);
62+
const client = createClient();
63+
const layer = buildEffectLayer({ enableEffectLogs: true }, client);
4664

4765
expect(layer).toBeDefined();
4866
expect(Layer.isLayer(layer)).toBe(true);
4967
});
5068

5169
it('returns a valid layer with enableEffectMetrics: false', () => {
52-
const layer = buildEffectLayer({ enableEffectMetrics: false }, mockClient);
70+
const client = createClient();
71+
const layer = buildEffectLayer({ enableEffectMetrics: false }, client);
5372

5473
expect(layer).toBeDefined();
5574
expect(Layer.isLayer(layer)).toBe(true);
5675
});
5776

5877
it('returns a valid layer with enableEffectMetrics: true', () => {
59-
const layer = buildEffectLayer({ enableEffectMetrics: true }, mockClient);
78+
const client = createClient();
79+
const layer = buildEffectLayer({ enableEffectMetrics: true }, client);
6080

6181
expect(layer).toBeDefined();
6282
expect(Layer.isLayer(layer)).toBe(true);
6383
});
6484

6585
it('returns a valid layer with all features enabled', () => {
66-
const layer = buildEffectLayer({ enableEffectLogs: true, enableEffectMetrics: true }, mockClient);
86+
const client = createClient();
87+
const layer = buildEffectLayer({ enableEffectLogs: true, enableEffectMetrics: true }, client);
6788

6889
expect(layer).toBeDefined();
6990
expect(Layer.isLayer(layer)).toBe(true);
@@ -73,7 +94,7 @@ describe('buildEffectLayer', () => {
7394
Effect.gen(function* () {
7495
const result = yield* Effect.succeed('test-result');
7596
expect(result).toBe('test-result');
76-
}).pipe(Effect.provide(buildEffectLayer({}, mockClient))),
97+
}).pipe(Effect.provide(buildEffectLayer({}, createClient()))),
7798
);
7899

79100
it.effect('layer with logs enabled routes Effect logs to Sentry logger', () =>
@@ -82,12 +103,13 @@ describe('buildEffectLayer', () => {
82103
yield* Effect.log('test log message');
83104
expect(infoSpy).toHaveBeenCalledWith('test log message');
84105
infoSpy.mockRestore();
85-
}).pipe(Effect.provide(buildEffectLayer({ enableEffectLogs: true }, mockClient))),
106+
}).pipe(Effect.provide(buildEffectLayer({ enableEffectLogs: true }, createClient({ enableLogs: true })))),
86107
);
87108

88109
it('returns different layer when enableEffectMetrics is true vs false', () => {
89-
const layerWithMetrics = buildEffectLayer({ enableEffectMetrics: true }, mockClient);
90-
const layerWithoutMetrics = buildEffectLayer({ enableEffectMetrics: false }, mockClient);
110+
const client = createClient();
111+
const layerWithMetrics = buildEffectLayer({ enableEffectMetrics: true }, client);
112+
const layerWithoutMetrics = buildEffectLayer({ enableEffectMetrics: false }, client);
91113

92114
expect(layerWithMetrics).not.toBe(layerWithoutMetrics);
93115
});
@@ -96,7 +118,11 @@ describe('buildEffectLayer', () => {
96118
Effect.gen(function* () {
97119
const result = yield* Effect.succeed('all-features');
98120
expect(result).toBe('all-features');
99-
}).pipe(Effect.provide(buildEffectLayer({ enableEffectLogs: true, enableEffectMetrics: true }, mockClient))),
121+
}).pipe(
122+
Effect.provide(
123+
buildEffectLayer({ enableEffectLogs: true, enableEffectMetrics: true }, createClient({ enableLogs: true })),
124+
),
125+
),
100126
);
101127

102128
it.effect('layer enables tracing for Effect spans via Sentry tracer', () =>
@@ -110,12 +136,12 @@ describe('buildEffectLayer', () => {
110136
}),
111137
);
112138
startInactiveSpanSpy.mockRestore();
113-
}).pipe(Effect.provide(buildEffectLayer({}, mockClient))),
139+
}).pipe(Effect.provide(buildEffectLayer({}, createClient()))),
114140
);
115141
});
116142

117143
describe('with additional options', () => {
118-
const mockClient = { mock: true };
144+
const client = createClient({ enableLogs: true });
119145

120146
it('accepts options with additional properties', () => {
121147
const layer = buildEffectLayer(
@@ -125,7 +151,7 @@ describe('buildEffectLayer', () => {
125151
dsn: 'https://test@sentry.io/123',
126152
debug: true,
127153
} as { enableEffectLogs?: boolean; enableEffectMetrics?: boolean; dsn?: string; debug?: boolean },
128-
mockClient,
154+
client,
129155
);
130156

131157
expect(layer).toBeDefined();

0 commit comments

Comments
 (0)