Skip to content

Commit 9cb267f

Browse files
JPeer264claude
andcommitted
test(e2e): Port cloudflare-workersentrypoint to span streaming
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
1 parent 16e2bf2 commit 9cb267f

2 files changed

Lines changed: 30 additions & 11 deletions

File tree

‎dev-packages/e2e-tests/test-applications/cloudflare-workersentrypoint/src/index.ts‎

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,6 @@ class MyDurableObjectBase extends DurableObject<Env> {
6363

6464
export const MyDurableObject = Sentry.instrumentDurableObjectWithSentry(
6565
(env: Env) => ({
66-
traceLifecycle: 'static',
6766
dsn: env.E2E_TEST_DSN,
6867
environment: 'qa', // dynamic sampling bias to keep transactions
6968
tunnel: `http://localhost:3031/`, // proxy server
@@ -108,7 +107,6 @@ class MyWorker extends WorkerEntrypoint {
108107

109108
export default Sentry.withSentry(
110109
env => ({
111-
traceLifecycle: 'static',
112110
dsn: env.E2E_TEST_DSN,
113111
environment: 'qa', // dynamic sampling bias to keep transactions
114112
tunnel: `http://localhost:3031/`, // proxy server

‎dev-packages/e2e-tests/test-applications/cloudflare-workersentrypoint/tests/index.test.ts‎

Lines changed: 30 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
import { expect, test } from '@playwright/test';
2-
import { waitForError, waitForRequest, waitForTransaction } from '@sentry-internal/test-utils';
2+
import {
3+
getSpanOp,
4+
waitForError,
5+
waitForRequest,
6+
waitForStreamedSpan,
7+
waitForStreamedSpans,
8+
} from '@sentry-internal/test-utils';
39
import { SDK_VERSION } from '@sentry/cloudflare';
410
import { WebSocket } from 'ws';
511

@@ -9,6 +15,22 @@ test('Index page', async ({ baseURL }) => {
915
await expect(result.text()).resolves.toBe('Hello World!');
1016
});
1117

18+
test('Sends a streamed span for a basic request', async ({ baseURL }) => {
19+
const spanPromise = waitForStreamedSpan('cloudflare-workersentrypoint', span => {
20+
return getSpanOp(span) === 'http.server' && span.is_segment;
21+
});
22+
23+
await fetch(baseURL!);
24+
25+
const span = await spanPromise;
26+
27+
// The root path is a low-cardinality route, so the span keeps the full `GET /` name under streaming.
28+
expect(span.name).toBe('GET /');
29+
expect(span.trace_id).toMatch(/[a-f0-9]{32}/);
30+
expect(span.status).toBe('ok');
31+
expect(span.attributes['sentry.segment.name.source']?.value).toBe('route');
32+
});
33+
1234
test("worker's withSentry", async ({ baseURL }) => {
1335
const eventWaiter = waitForError('cloudflare-workersentrypoint', event => {
1436
return event.exception?.values?.[0]?.mechanism?.type === 'auto.http.cloudflare';
@@ -83,19 +105,18 @@ test('sends user-agent header with SDK name and version in envelope requests', a
83105
});
84106
});
85107

86-
test('Storage operations create spans in Durable Object transactions', async ({ baseURL }) => {
87-
const transactionWaiter = waitForTransaction('cloudflare-workersentrypoint', event => {
88-
return event.spans?.some(span => span.op === 'db' && span.description === 'durable_object_storage_put') ?? false;
108+
test('Storage operations create spans in Durable Object', async ({ baseURL }) => {
109+
const spansPromise = waitForStreamedSpans('cloudflare-workersentrypoint', spans => {
110+
return spans.some(span => span.name === 'durable_object_storage_put' && getSpanOp(span) === 'db');
89111
});
90112

91113
const response = await fetch(`${baseURL}/pass-to-object/storage/put`);
92114
expect(response.status).toBe(200);
93115

94-
const transaction = await transactionWaiter;
95-
const putSpan = transaction.spans?.find(span => span.description === 'durable_object_storage_put');
116+
const spans = await spansPromise;
117+
const putSpan = spans.find(span => span.name === 'durable_object_storage_put' && getSpanOp(span) === 'db');
96118

97119
expect(putSpan).toBeDefined();
98-
expect(putSpan?.op).toBe('db');
99-
expect(putSpan?.data?.['db.system.name']).toBe('cloudflare.durable_object.storage');
100-
expect(putSpan?.data?.['db.operation.name']).toBe('put');
120+
expect(putSpan?.attributes['db.system.name']?.value).toBe('cloudflare.durable_object.storage');
121+
expect(putSpan?.attributes['db.operation.name']?.value).toBe('put');
101122
});

0 commit comments

Comments
 (0)