Skip to content

Commit 76fd010

Browse files
committed
Adjust @sentry/opentelemetry unit tests for v2
1 parent 4fa56db commit 76fd010

14 files changed

+66
-68
lines changed

packages/opentelemetry/test/asyncContextStrategy.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ describe('asyncContextStrategy', () => {
2323

2424
const options = getDefaultTestClientOptions();
2525
const client = new TestClient(options);
26-
provider = setupOtel(client);
26+
[provider] = setupOtel(client);
2727
setOpenTelemetryContextAsyncContextStrategy();
2828
});
2929

packages/opentelemetry/test/helpers/initOtel.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,12 +45,14 @@ export function initOtel(): void {
4545
setupEventContextTrace(client);
4646
enhanceDscWithOpenTelemetryRootSpanName(client);
4747

48-
const provider = setupOtel(client);
48+
const [provider, spanProcessor] = setupOtel(client);
4949
client.traceProvider = provider;
50+
client.spanProcessor = spanProcessor;
5051
}
5152

5253
/** Just exported for tests. */
53-
export function setupOtel(client: TestClientInterface): BasicTracerProvider {
54+
export function setupOtel(client: TestClientInterface): [BasicTracerProvider, SentrySpanProcessor] {
55+
const spanProcessor = new SentrySpanProcessor();
5456
// Create and configure NodeTracerProvider
5557
const provider = new BasicTracerProvider({
5658
sampler: new SentrySampler(client),
@@ -63,7 +65,7 @@ export function setupOtel(client: TestClientInterface): BasicTracerProvider {
6365
}),
6466
),
6567
forceFlushTimeoutMillis: 500,
66-
spanProcessors: [new SentrySpanProcessor()],
68+
spanProcessors: [spanProcessor],
6769
});
6870

6971
// We use a custom context manager to keep context in sync with sentry scope
@@ -73,5 +75,5 @@ export function setupOtel(client: TestClientInterface): BasicTracerProvider {
7375
propagation.setGlobalPropagator(new SentryPropagator());
7476
context.setGlobalContextManager(new SentryContextManager());
7577

76-
return provider;
78+
return [provider, spanProcessor];
7779
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import type { Span } from '@opentelemetry/api';
2+
import { type SpanContext, INVALID_SPANID, INVALID_TRACEID } from '@opentelemetry/api';
3+
4+
export const isSpan = (value: unknown): value is Span => {
5+
return (
6+
typeof value === 'object' &&
7+
value !== null &&
8+
'spanContext' in value &&
9+
(value.spanContext as () => SpanContext)().traceId !== INVALID_TRACEID &&
10+
(value.spanContext as () => SpanContext)().spanId !== INVALID_SPANID
11+
);
12+
};

packages/opentelemetry/test/helpers/mockSdkInit.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { BasicTracerProvider } from '@opentelemetry/sdk-trace-base';
33
import type { ClientOptions, Options } from '@sentry/core';
44
import { flush, getClient, getCurrentScope, getGlobalScope, getIsolationScope } from '@sentry/core';
55
import { setOpenTelemetryContextAsyncContextStrategy } from '../../src/asyncContextStrategy';
6+
import { SentrySpanProcessor } from '../../src/spanProcessor';
67
import type { OpenTelemetryClient } from '../../src/types';
78
import { clearOpenTelemetrySetupCheck } from '../../src/utils/setupCheck';
89
import { initOtel } from './initOtel';
@@ -51,6 +52,20 @@ export async function cleanupOtel(_provider?: BasicTracerProvider): Promise<void
5152
await flush();
5253
}
5354

55+
export function getSpanProcessor(): SentrySpanProcessor | undefined {
56+
const client = getClient<OpenTelemetryClient>();
57+
if (!client) {
58+
return undefined;
59+
}
60+
61+
const spanProcessor = client.spanProcessor;
62+
if (spanProcessor instanceof SentrySpanProcessor) {
63+
return spanProcessor;
64+
}
65+
66+
return undefined;
67+
}
68+
5469
export function getProvider(_provider?: BasicTracerProvider): BasicTracerProvider | undefined {
5570
let provider = _provider || getClient<OpenTelemetryClient>()?.traceProvider || trace.getTracerProvider();
5671

packages/opentelemetry/test/integration/transactions.test.ts

Lines changed: 6 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import type { SpanContext } from '@opentelemetry/api';
22
import { context, ROOT_CONTEXT, trace, TraceFlags } from '@opentelemetry/api';
33
import { TraceState } from '@opentelemetry/core';
4-
import type { SpanProcessor } from '@opentelemetry/sdk-trace-base';
54
import type { Event, TransactionEvent } from '@sentry/core';
65
import {
76
addBreadcrumb,
@@ -15,10 +14,9 @@ import {
1514
} from '@sentry/core';
1615
import { afterEach, describe, expect, it, vi } from 'vitest';
1716
import { SENTRY_TRACE_STATE_DSC } from '../../src/constants';
18-
import { SentrySpanProcessor } from '../../src/spanProcessor';
1917
import { startInactiveSpan, startSpan } from '../../src/trace';
2018
import { makeTraceState } from '../../src/utils/makeTraceState';
21-
import { cleanupOtel, getProvider, mockSdkInit } from '../helpers/mockSdkInit';
19+
import { cleanupOtel, getSpanProcessor, mockSdkInit } from '../helpers/mockSdkInit';
2220
import type { TestClientInterface } from '../helpers/TestClient';
2321

2422
describe('Integration | Transactions', () => {
@@ -444,13 +442,7 @@ describe('Integration | Transactions', () => {
444442

445443
mockSdkInit({ tracesSampleRate: 1, beforeSendTransaction });
446444

447-
const provider = getProvider();
448-
const multiSpanProcessor = provider?.activeSpanProcessor as
449-
| (SpanProcessor & { _spanProcessors?: SpanProcessor[] })
450-
| undefined;
451-
const spanProcessor = multiSpanProcessor?.['_spanProcessors']?.find(
452-
spanProcessor => spanProcessor instanceof SentrySpanProcessor,
453-
) as SentrySpanProcessor | undefined;
445+
const spanProcessor = getSpanProcessor();
454446

455447
const exporter = spanProcessor ? spanProcessor['_exporter'] : undefined;
456448

@@ -522,13 +514,7 @@ describe('Integration | Transactions', () => {
522514
},
523515
});
524516

525-
const provider = getProvider();
526-
const multiSpanProcessor = provider?.activeSpanProcessor as
527-
| (SpanProcessor & { _spanProcessors?: SpanProcessor[] })
528-
| undefined;
529-
const spanProcessor = multiSpanProcessor?.['_spanProcessors']?.find(
530-
spanProcessor => spanProcessor instanceof SentrySpanProcessor,
531-
) as SentrySpanProcessor | undefined;
517+
const spanProcessor = getSpanProcessor();
532518

533519
const exporter = spanProcessor ? spanProcessor['_exporter'] : undefined;
534520

@@ -580,13 +566,7 @@ describe('Integration | Transactions', () => {
580566
},
581567
});
582568

583-
const provider = getProvider();
584-
const multiSpanProcessor = provider?.activeSpanProcessor as
585-
| (SpanProcessor & { _spanProcessors?: SpanProcessor[] })
586-
| undefined;
587-
const spanProcessor = multiSpanProcessor?.['_spanProcessors']?.find(
588-
spanProcessor => spanProcessor instanceof SentrySpanProcessor,
589-
) as SentrySpanProcessor | undefined;
569+
const spanProcessor = getSpanProcessor();
590570

591571
const exporter = spanProcessor ? spanProcessor['_exporter'] : undefined;
592572

@@ -637,13 +617,7 @@ describe('Integration | Transactions', () => {
637617
},
638618
});
639619

640-
const provider = getProvider();
641-
const multiSpanProcessor = provider?.activeSpanProcessor as
642-
| (SpanProcessor & { _spanProcessors?: SpanProcessor[] })
643-
| undefined;
644-
const spanProcessor = multiSpanProcessor?.['_spanProcessors']?.find(
645-
spanProcessor => spanProcessor instanceof SentrySpanProcessor,
646-
) as SentrySpanProcessor | undefined;
620+
const spanProcessor = getSpanProcessor();
647621

648622
const exporter = spanProcessor ? spanProcessor['_exporter'] : undefined;
649623

@@ -699,13 +673,7 @@ describe('Integration | Transactions', () => {
699673
},
700674
});
701675

702-
const provider = getProvider();
703-
const multiSpanProcessor = provider?.activeSpanProcessor as
704-
| (SpanProcessor & { _spanProcessors?: SpanProcessor[] })
705-
| undefined;
706-
const spanProcessor = multiSpanProcessor?.['_spanProcessors']?.find(
707-
spanProcessor => spanProcessor instanceof SentrySpanProcessor,
708-
) as SentrySpanProcessor | undefined;
676+
const spanProcessor = getSpanProcessor();
709677

710678
const exporter = spanProcessor ? spanProcessor['_exporter'] : undefined;
711679

packages/opentelemetry/test/sampler.test.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -81,11 +81,13 @@ describe('SentrySampler', () => {
8181
const links = undefined;
8282

8383
const actual = sampler.shouldSample(ctx, traceId, spanName, spanKind, spanAttributes, links);
84-
expect(actual).toEqual({
85-
decision: SamplingDecision.RECORD_AND_SAMPLED,
86-
attributes: { 'sentry.sample_rate': 1 },
87-
traceState: expect.any(TraceState),
88-
});
84+
expect(actual).toEqual(
85+
expect.objectContaining({
86+
decision: SamplingDecision.RECORD_AND_SAMPLED,
87+
attributes: { 'sentry.sample_rate': 1 },
88+
}),
89+
);
90+
expect(actual.traceState?.constructor.name).toBe('TraceState');
8991
expect(spyOnDroppedEvent).toHaveBeenCalledTimes(0);
9092

9193
spyOnDroppedEvent.mockReset();

packages/opentelemetry/test/trace.test.ts

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
import type { Span, TimeInput } from '@opentelemetry/api';
33
import { context, ROOT_CONTEXT, SpanKind, trace, TraceFlags } from '@opentelemetry/api';
44
import type { ReadableSpan } from '@opentelemetry/sdk-trace-base';
5-
import { Span as SpanClass } from '@opentelemetry/sdk-trace-base';
65
import { SEMATTRS_HTTP_METHOD } from '@opentelemetry/semantic-conventions';
76
import type { Event, Scope } from '@sentry/core';
87
import {
@@ -29,6 +28,8 @@ import { getSpanKind } from '../src/utils/getSpanKind';
2928
import { makeTraceState } from '../src/utils/makeTraceState';
3029
import { spanHasAttributes, spanHasName } from '../src/utils/spanTypes';
3130
import { cleanupOtel, mockSdkInit } from './helpers/mockSdkInit';
31+
import { isSpan } from './helpers/isSpan';
32+
import { getParentSpanId } from '../../../packages/opentelemetry/src/utils/getParentSpanId';
3233

3334
describe('trace', () => {
3435
beforeEach(() => {
@@ -534,7 +535,7 @@ describe('trace', () => {
534535
return span;
535536
});
536537

537-
expect(span).not.toBeInstanceOf(SpanClass);
538+
expect(isSpan(span)).toBe(false);
538539
});
539540

540541
it('creates a span if there is a parent', () => {
@@ -546,7 +547,7 @@ describe('trace', () => {
546547
return span;
547548
});
548549

549-
expect(span).toBeInstanceOf(SpanClass);
550+
expect(isSpan(span)).toBe(true);
550551
});
551552
});
552553
});
@@ -826,7 +827,7 @@ describe('trace', () => {
826827
it('does not create a span if there is no parent', () => {
827828
const span = startInactiveSpan({ name: 'test span', onlyIfParent: true });
828829

829-
expect(span).not.toBeInstanceOf(SpanClass);
830+
expect(isSpan(span)).toBe(false);
830831
});
831832

832833
it('creates a span if there is a parent', () => {
@@ -836,7 +837,7 @@ describe('trace', () => {
836837
return span;
837838
});
838839

839-
expect(span).toBeInstanceOf(SpanClass);
840+
expect(isSpan(span)).toBe(true);
840841
});
841842
});
842843

@@ -1196,7 +1197,7 @@ describe('trace', () => {
11961197
return span;
11971198
});
11981199

1199-
expect(span).not.toBeInstanceOf(SpanClass);
1200+
expect(isSpan(span)).toBe(false);
12001201
});
12011202

12021203
it('creates a span if there is a parent', () => {
@@ -1208,7 +1209,7 @@ describe('trace', () => {
12081209
return span;
12091210
});
12101211

1211-
expect(span).toBeInstanceOf(SpanClass);
1212+
expect(isSpan(span)).toBe(true);
12121213
});
12131214
});
12141215
});
@@ -1972,5 +1973,5 @@ function getSpanAttributes(span: AbstractSpan): Record<string, unknown> | undefi
19721973
}
19731974

19741975
function getSpanParentSpanId(span: AbstractSpan): string | undefined {
1975-
return (span as ReadableSpan).parentSpanId;
1976+
return getParentSpanId(span as ReadableSpan);
19761977
}

packages/opentelemetry/test/utils/getActiveSpan.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ describe('getActiveSpan', () => {
1212

1313
beforeEach(() => {
1414
const client = new TestClient(getDefaultTestClientOptions());
15-
provider = setupOtel(client);
15+
[provider] = setupOtel(client);
1616
});
1717

1818
afterEach(() => {
@@ -97,7 +97,7 @@ describe('getRootSpan', () => {
9797

9898
beforeEach(() => {
9999
const client = new TestClient(getDefaultTestClientOptions({ tracesSampleRate: 1 }));
100-
provider = setupOtel(client);
100+
[provider] = setupOtel(client);
101101
});
102102

103103
afterEach(async () => {

packages/opentelemetry/test/utils/getRequestSpanData.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ describe('getRequestSpanData', () => {
1414

1515
beforeEach(() => {
1616
const client = new TestClient(getDefaultTestClientOptions({ tracesSampleRate: 1 }));
17-
provider = setupOtel(client);
17+
[provider] = setupOtel(client);
1818
});
1919

2020
afterEach(() => {

packages/opentelemetry/test/utils/groupSpansWithParents.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ describe('groupSpansWithParents', () => {
1313

1414
beforeEach(() => {
1515
const client = new TestClient(getDefaultTestClientOptions({ tracesSampleRate: 1 }));
16-
provider = setupOtel(client);
16+
[provider] = setupOtel(client);
1717
});
1818

1919
afterEach(() => {

0 commit comments

Comments
 (0)