From 1f8ed69f126cec32c3cbc05619cf260634c0949a Mon Sep 17 00:00:00 2001 From: Andrei Borza Date: Wed, 6 Aug 2025 10:32:20 +0200 Subject: [PATCH 1/7] feat(cloudflare,vercel-edge): Add support for OpenAI instrumentation To instrument the OpenAI client, wrap it with `Sentry.instrumentOpenAiClient`. ```js import * as Sentry from '@sentry/cloudflare'; import OpenAI from 'openai'; const openai = new OpenAI(); const client = Sentry.instrumentOpenAiClient(openai, { recordInputs: true, recordOutputs: true }); // use the wrapped client ``` --- .../cloudflare-integration-tests/package.json | 1 + .../suites/tracing/openai/index.ts | 34 +++ .../suites/tracing/openai/mocks.ts | 245 ++++++++++++++++++ .../suites/tracing/openai/test.ts | 37 +++ .../suites/tracing/openai/wrangler.jsonc | 6 + .../vite.config.mts | 6 + packages/cloudflare/src/index.ts | 1 + packages/vercel-edge/src/index.ts | 1 + 8 files changed, 331 insertions(+) create mode 100644 dev-packages/cloudflare-integration-tests/suites/tracing/openai/index.ts create mode 100644 dev-packages/cloudflare-integration-tests/suites/tracing/openai/mocks.ts create mode 100644 dev-packages/cloudflare-integration-tests/suites/tracing/openai/test.ts create mode 100644 dev-packages/cloudflare-integration-tests/suites/tracing/openai/wrangler.jsonc diff --git a/dev-packages/cloudflare-integration-tests/package.json b/dev-packages/cloudflare-integration-tests/package.json index 696bd852cc9b..29b6bf795b67 100644 --- a/dev-packages/cloudflare-integration-tests/package.json +++ b/dev-packages/cloudflare-integration-tests/package.json @@ -16,6 +16,7 @@ "@sentry/cloudflare": "10.1.0" }, "devDependencies": { + "@sentry/core": "10.0.0", "@cloudflare/workers-types": "^4.20250708.0", "@sentry-internal/test-utils": "link:../test-utils", "vitest": "^3.2.4", diff --git a/dev-packages/cloudflare-integration-tests/suites/tracing/openai/index.ts b/dev-packages/cloudflare-integration-tests/suites/tracing/openai/index.ts new file mode 100644 index 000000000000..8b21b479ce80 --- /dev/null +++ b/dev-packages/cloudflare-integration-tests/suites/tracing/openai/index.ts @@ -0,0 +1,34 @@ +import * as Sentry from '@sentry/cloudflare'; +import { MockOpenAi } from './mocks'; + +interface Env { + SENTRY_DSN: string; +} + +const mockClient = new MockOpenAi({ + apiKey: 'mock-api-key', +}); + +const client = Sentry.instrumentOpenAiClient(mockClient); + +export default Sentry.withSentry( + (env: Env) => ({ + dsn: env.SENTRY_DSN, + tracesSampleRate: 1.0, + }), + { + async fetch(_request, _env, _ctx) { + const response = await client.chat?.completions?.create({ + model: 'gpt-3.5-turbo', + messages: [ + { role: 'system', content: 'You are a helpful assistant.' }, + { role: 'user', content: 'What is the capital of France?' }, + ], + temperature: 0.7, + max_tokens: 100, + }); + + return new Response(JSON.stringify(response)); + }, + }, +); diff --git a/dev-packages/cloudflare-integration-tests/suites/tracing/openai/mocks.ts b/dev-packages/cloudflare-integration-tests/suites/tracing/openai/mocks.ts new file mode 100644 index 000000000000..4415b11e9f61 --- /dev/null +++ b/dev-packages/cloudflare-integration-tests/suites/tracing/openai/mocks.ts @@ -0,0 +1,245 @@ +import type { OpenAiClient } from '@sentry/core'; + +export class MockOpenAi implements OpenAiClient { + public chat?: Record | undefined; + public responses?: { + create: (...args: unknown[]) => Promise; + }; + + public apiKey: string; + + public constructor(config: { apiKey: string }) { + this.apiKey = config.apiKey; + + this.chat = { + completions: { + create: async (...args: unknown[]) => { + const params = args[0] as { model: string; stream?: boolean }; + // Simulate processing time + await new Promise(resolve => setTimeout(resolve, 10)); + + if (params.model === 'error-model') { + const error = new Error('Model not found'); + (error as unknown as { status: number }).status = 404; + (error as unknown as { headers: Record }).headers = { 'x-request-id': 'mock-request-123' }; + throw error; + } + + // If stream is requested, return an async generator + if (params.stream) { + return this.createChatCompletionStream(params); + } + + return { + id: 'chatcmpl-mock123', + object: 'chat.completion', + created: 1677652288, + model: params.model, + system_fingerprint: 'fp_44709d6fcb', + choices: [ + { + index: 0, + message: { + role: 'assistant', + content: 'Hello from OpenAI mock!', + }, + finish_reason: 'stop', + }, + ], + usage: { + prompt_tokens: 10, + completion_tokens: 15, + total_tokens: 25, + }, + }; + }, + }, + }; + + this.responses = { + create: async (...args: unknown[]) => { + const params = args[0] as { model: string; input: string; instructions: string; stream?: boolean }; + await new Promise(resolve => setTimeout(resolve, 10)); + + // If stream is requested, return an async generator + if (params.stream) { + return this.createResponsesApiStream(params); + } + + return { + id: 'resp_mock456', + object: 'response', + created_at: 1677652290, + model: params.model, + input_text: params.input, + output_text: `Response to: ${params.input}`, + status: 'completed', + usage: { + input_tokens: 5, + output_tokens: 8, + total_tokens: 13, + }, + }; + }, + }; + } + + // Create a mock streaming response for chat completions + public async *createChatCompletionStream(params: { model: string }): AsyncGenerator { + // First chunk with basic info + yield { + id: 'chatcmpl-stream-123', + object: 'chat.completion.chunk', + created: 1677652300, + model: params.model, + system_fingerprint: 'fp_stream_123', + choices: [ + { + index: 0, + delta: { + role: 'assistant', + content: 'Hello', + }, + finish_reason: null, + }, + ], + }; + + // Second chunk with more content + yield { + id: 'chatcmpl-stream-123', + object: 'chat.completion.chunk', + created: 1677652300, + model: params.model, + system_fingerprint: 'fp_stream_123', + choices: [ + { + index: 0, + delta: { + content: ' from OpenAI streaming!', + }, + finish_reason: 'stop', + }, + ], + usage: { + prompt_tokens: 12, + completion_tokens: 18, + total_tokens: 30, + completion_tokens_details: { + accepted_prediction_tokens: 0, + audio_tokens: 0, + reasoning_tokens: 0, + rejected_prediction_tokens: 0, + }, + prompt_tokens_details: { + audio_tokens: 0, + cached_tokens: 0, + }, + }, + }; + } + + // Create a mock streaming response for responses API + public async *createResponsesApiStream(params: { + model: string; + input: string; + instructions: string; + }): AsyncGenerator { + // Response created event + yield { + type: 'response.created', + response: { + id: 'resp_stream_456', + object: 'response', + created_at: 1677652310, + model: params.model, + status: 'in_progress', + error: null, + incomplete_details: null, + instructions: params.instructions, + max_output_tokens: 1000, + parallel_tool_calls: false, + previous_response_id: null, + reasoning: { + effort: null, + summary: null, + }, + store: false, + temperature: 0.7, + text: { + format: { + type: 'text', + }, + }, + tool_choice: 'auto', + top_p: 1.0, + truncation: 'disabled', + user: null, + metadata: {}, + output: [], + output_text: '', + usage: { + input_tokens: 0, + output_tokens: 0, + total_tokens: 0, + }, + }, + sequence_number: 1, + }; + + // Response in progress with output text delta + yield { + type: 'response.output_text.delta', + delta: 'Streaming response to: ', + sequence_number: 2, + }; + + yield { + type: 'response.output_text.delta', + delta: params.input, + sequence_number: 3, + }; + + // Response completed event + yield { + type: 'response.completed', + response: { + id: 'resp_stream_456', + object: 'response', + created_at: 1677652310, + model: params.model, + status: 'completed', + error: null, + incomplete_details: null, + instructions: params.instructions, + max_output_tokens: 1000, + parallel_tool_calls: false, + previous_response_id: null, + reasoning: { + effort: null, + summary: null, + }, + store: false, + temperature: 0.7, + text: { + format: { + type: 'text', + }, + }, + tool_choice: 'auto', + top_p: 1.0, + truncation: 'disabled', + user: null, + metadata: {}, + output: [], + output_text: params.input, + usage: { + input_tokens: 6, + output_tokens: 10, + total_tokens: 16, + }, + }, + sequence_number: 4, + }; + } +} diff --git a/dev-packages/cloudflare-integration-tests/suites/tracing/openai/test.ts b/dev-packages/cloudflare-integration-tests/suites/tracing/openai/test.ts new file mode 100644 index 000000000000..c77e2a95b7fe --- /dev/null +++ b/dev-packages/cloudflare-integration-tests/suites/tracing/openai/test.ts @@ -0,0 +1,37 @@ +import { expect, it } from 'vitest'; +import { createRunner } from '../../../runner'; + +it('traces a basic chat completion request', async () => { + const runner = createRunner(__dirname) + .ignore('event') + .expect(envelope => { + const transactionEvent = envelope[1]?.[0]?.[1]; + + expect(transactionEvent.transaction).toBe('GET /'); + expect(transactionEvent.spans).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + data: expect.objectContaining({ + 'gen_ai.operation.name': 'chat', + 'sentry.op': 'gen_ai.chat', + 'gen_ai.system': 'openai', + 'gen_ai.request.model': 'gpt-3.5-turbo', + 'gen_ai.request.temperature': 0.7, + 'gen_ai.response.model': 'gpt-3.5-turbo', + 'gen_ai.response.id': 'chatcmpl-mock123', + 'gen_ai.usage.input_tokens': 10, + 'gen_ai.usage.output_tokens': 15, + 'gen_ai.usage.total_tokens': 25, + 'gen_ai.response.finish_reasons': '["stop"]', + }), + description: 'chat gpt-3.5-turbo', + op: 'gen_ai.chat', + origin: 'manual', + }), + ]), + ); + }) + .start(); + await runner.makeRequest('get', '/'); + await runner.completed(); +}); diff --git a/dev-packages/cloudflare-integration-tests/suites/tracing/openai/wrangler.jsonc b/dev-packages/cloudflare-integration-tests/suites/tracing/openai/wrangler.jsonc new file mode 100644 index 000000000000..24fb2861023d --- /dev/null +++ b/dev-packages/cloudflare-integration-tests/suites/tracing/openai/wrangler.jsonc @@ -0,0 +1,6 @@ +{ + "name": "worker-name", + "compatibility_date": "2025-06-17", + "main": "index.ts", + "compatibility_flags": ["nodejs_compat"] +} diff --git a/dev-packages/cloudflare-integration-tests/vite.config.mts b/dev-packages/cloudflare-integration-tests/vite.config.mts index cfa15b12c3f1..a80bbbf63f32 100644 --- a/dev-packages/cloudflare-integration-tests/vite.config.mts +++ b/dev-packages/cloudflare-integration-tests/vite.config.mts @@ -22,6 +22,12 @@ export default defineConfig({ // already run in their own processes. We use threads instead because the // overhead is significantly less. pool: 'threads', + // Run tests sequentially to avoid port conflicts with wrangler dev processes + poolOptions: { + threads: { + singleThread: true, + }, + }, reporters: process.env.DEBUG ? ['default', { summary: false }] : process.env.GITHUB_ACTIONS diff --git a/packages/cloudflare/src/index.ts b/packages/cloudflare/src/index.ts index a5bb99d40818..23e902c4dc2e 100644 --- a/packages/cloudflare/src/index.ts +++ b/packages/cloudflare/src/index.ts @@ -69,6 +69,7 @@ export { functionToStringIntegration, // eslint-disable-next-line deprecation/deprecation inboundFiltersIntegration, + instrumentOpenAiClient, eventFiltersIntegration, linkedErrorsIntegration, requestDataIntegration, diff --git a/packages/vercel-edge/src/index.ts b/packages/vercel-edge/src/index.ts index 5325d1e62391..e2fd90eda5b7 100644 --- a/packages/vercel-edge/src/index.ts +++ b/packages/vercel-edge/src/index.ts @@ -69,6 +69,7 @@ export { functionToStringIntegration, // eslint-disable-next-line deprecation/deprecation inboundFiltersIntegration, + instrumentOpenAiClient, eventFiltersIntegration, linkedErrorsIntegration, requestDataIntegration, From bb8db23c9beb16cd975734d61d526e60dcb368cf Mon Sep 17 00:00:00 2001 From: Andrei Borza Date: Wed, 6 Aug 2025 14:17:11 +0200 Subject: [PATCH 2/7] Improve typing so we don't walk over openai's types when using the instrumentation directly in cloudflare/vercel-edge --- .../suites/tracing/openai/mocks.ts | 4 ++-- .../suites/tracing/openai/test.ts | 5 +++++ packages/core/src/utils/openai/index.ts | 7 +++---- packages/core/src/utils/openai/types.ts | 8 ++++---- 4 files changed, 14 insertions(+), 10 deletions(-) diff --git a/dev-packages/cloudflare-integration-tests/suites/tracing/openai/mocks.ts b/dev-packages/cloudflare-integration-tests/suites/tracing/openai/mocks.ts index 4415b11e9f61..2363277f4cf4 100644 --- a/dev-packages/cloudflare-integration-tests/suites/tracing/openai/mocks.ts +++ b/dev-packages/cloudflare-integration-tests/suites/tracing/openai/mocks.ts @@ -1,8 +1,8 @@ import type { OpenAiClient } from '@sentry/core'; export class MockOpenAi implements OpenAiClient { - public chat?: Record | undefined; - public responses?: { + public chat: Record; + public responses: { create: (...args: unknown[]) => Promise; }; diff --git a/dev-packages/cloudflare-integration-tests/suites/tracing/openai/test.ts b/dev-packages/cloudflare-integration-tests/suites/tracing/openai/test.ts index c77e2a95b7fe..1dc4ca077665 100644 --- a/dev-packages/cloudflare-integration-tests/suites/tracing/openai/test.ts +++ b/dev-packages/cloudflare-integration-tests/suites/tracing/openai/test.ts @@ -1,6 +1,11 @@ import { expect, it } from 'vitest'; import { createRunner } from '../../../runner'; +// These tests are not exhaustive because the instrumentation is +// already tested in the node integration tests and we merely +// want to test that the instrumentation does not break in our +// cloudflare SDK. + it('traces a basic chat completion request', async () => { const runner = createRunner(__dirname) .ignore('event') diff --git a/packages/core/src/utils/openai/index.ts b/packages/core/src/utils/openai/index.ts index 8bd1c3625782..3fb4f0d16fce 100644 --- a/packages/core/src/utils/openai/index.ts +++ b/packages/core/src/utils/openai/index.ts @@ -24,7 +24,6 @@ import type { ChatCompletionChunk, InstrumentedMethod, OpenAiChatCompletionObject, - OpenAiClient, OpenAiIntegration, OpenAiOptions, OpenAiResponse, @@ -294,7 +293,7 @@ function instrumentMethod( /** * Create a deep proxy for OpenAI client instrumentation */ -function createDeepProxy(target: object, currentPath = '', options?: OpenAiOptions): OpenAiClient { +function createDeepProxy(target: T, currentPath = '', options?: OpenAiOptions): T { return new Proxy(target, { get(obj: object, prop: string): unknown { const value = (obj as Record)[prop]; @@ -316,13 +315,13 @@ function createDeepProxy(target: object, currentPath = '', options?: OpenAiOptio return value; }, - }); + }) as T; } /** * Instrument an OpenAI client with Sentry tracing * Can be used across Node.js, Cloudflare Workers, and Vercel Edge */ -export function instrumentOpenAiClient(client: OpenAiClient, options?: OpenAiOptions): OpenAiClient { +export function instrumentOpenAiClient(client: T, options?: OpenAiOptions): T { return createDeepProxy(client, '', options); } diff --git a/packages/core/src/utils/openai/types.ts b/packages/core/src/utils/openai/types.ts index 7ac8fb8d7b91..70f00c1bf97a 100644 --- a/packages/core/src/utils/openai/types.ts +++ b/packages/core/src/utils/openai/types.ts @@ -15,20 +15,20 @@ export type AttributeValue = export interface OpenAiOptions { /** - * Enable or disable input recording. Enabled if `sendDefaultPii` is `true` + * Enable or disable input recording. */ recordInputs?: boolean; /** - * Enable or disable output recording. Enabled if `sendDefaultPii` is `true` + * Enable or disable output recording. */ recordOutputs?: boolean; } export interface OpenAiClient { - responses?: { + responses: { create: (...args: unknown[]) => Promise; }; - chat?: { + chat: { completions?: { create: (...args: unknown[]) => Promise; }; From 34a64bdb372207b62c2b184ab889f38c55be2fbd Mon Sep 17 00:00:00 2001 From: Andrei Borza Date: Wed, 6 Aug 2025 14:23:44 +0200 Subject: [PATCH 3/7] Add changelog entry --- CHANGELOG.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 10d2467b0c9d..950e60c1191c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,22 @@ Sentry.init({ Spans matching the filter criteria will not be recorded. Potential child spans of filtered spans will be re-parented, if possible. +- **feat(cloudflare,vercel-edge): Add support for OpenAI instrumentation ([#17338](https://github.com/getsentry/sentry-javascript/pull/17338))** + +Adds support for OpenAI manual instrumentation in `@sentry/cloudflare` and `@sentry/vercel-edge`. + +To instrument the OpenAI client, wrap it with `Sentry.instrumentOpenAiClient` and set recording settings. + +```js +import * as Sentry from '@sentry/cloudflare'; +import OpenAI from 'openai'; + +const openai = new OpenAI(); +const client = Sentry.instrumentOpenAiClient(openai, { recordInputs: true, recordOutputs: true }); + +// use the wrapped client +``` + ## 10.1.0 - feat(nuxt): Align build-time options to follow bundler plugins structure ([#17255](https://github.com/getsentry/sentry-javascript/pull/17255)) From eda780710d080edde2cd2c8a251680433376ccc7 Mon Sep 17 00:00:00 2001 From: Andrei Borza Date: Wed, 6 Aug 2025 14:28:31 +0200 Subject: [PATCH 4/7] Revert OpenAiClient type changes --- packages/core/src/utils/openai/types.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/core/src/utils/openai/types.ts b/packages/core/src/utils/openai/types.ts index 70f00c1bf97a..daa478db4ba6 100644 --- a/packages/core/src/utils/openai/types.ts +++ b/packages/core/src/utils/openai/types.ts @@ -25,10 +25,10 @@ export interface OpenAiOptions { } export interface OpenAiClient { - responses: { + responses?: { create: (...args: unknown[]) => Promise; }; - chat: { + chat?: { completions?: { create: (...args: unknown[]) => Promise; }; From 888e1071cf1622411cb3fa70a8c95b825f15e480 Mon Sep 17 00:00:00 2001 From: Andrei Borza Date: Wed, 6 Aug 2025 14:51:20 +0200 Subject: [PATCH 5/7] Simplify openai mock for cloudflare --- .../suites/tracing/openai/mocks.ts | 197 +----------------- 1 file changed, 1 insertion(+), 196 deletions(-) diff --git a/dev-packages/cloudflare-integration-tests/suites/tracing/openai/mocks.ts b/dev-packages/cloudflare-integration-tests/suites/tracing/openai/mocks.ts index 2363277f4cf4..cca72d5bd37d 100644 --- a/dev-packages/cloudflare-integration-tests/suites/tracing/openai/mocks.ts +++ b/dev-packages/cloudflare-integration-tests/suites/tracing/openai/mocks.ts @@ -1,11 +1,7 @@ import type { OpenAiClient } from '@sentry/core'; export class MockOpenAi implements OpenAiClient { - public chat: Record; - public responses: { - create: (...args: unknown[]) => Promise; - }; - + public chat?: Record; public apiKey: string; public constructor(config: { apiKey: string }) { @@ -25,11 +21,6 @@ export class MockOpenAi implements OpenAiClient { throw error; } - // If stream is requested, return an async generator - if (params.stream) { - return this.createChatCompletionStream(params); - } - return { id: 'chatcmpl-mock123', object: 'chat.completion', @@ -55,191 +46,5 @@ export class MockOpenAi implements OpenAiClient { }, }, }; - - this.responses = { - create: async (...args: unknown[]) => { - const params = args[0] as { model: string; input: string; instructions: string; stream?: boolean }; - await new Promise(resolve => setTimeout(resolve, 10)); - - // If stream is requested, return an async generator - if (params.stream) { - return this.createResponsesApiStream(params); - } - - return { - id: 'resp_mock456', - object: 'response', - created_at: 1677652290, - model: params.model, - input_text: params.input, - output_text: `Response to: ${params.input}`, - status: 'completed', - usage: { - input_tokens: 5, - output_tokens: 8, - total_tokens: 13, - }, - }; - }, - }; - } - - // Create a mock streaming response for chat completions - public async *createChatCompletionStream(params: { model: string }): AsyncGenerator { - // First chunk with basic info - yield { - id: 'chatcmpl-stream-123', - object: 'chat.completion.chunk', - created: 1677652300, - model: params.model, - system_fingerprint: 'fp_stream_123', - choices: [ - { - index: 0, - delta: { - role: 'assistant', - content: 'Hello', - }, - finish_reason: null, - }, - ], - }; - - // Second chunk with more content - yield { - id: 'chatcmpl-stream-123', - object: 'chat.completion.chunk', - created: 1677652300, - model: params.model, - system_fingerprint: 'fp_stream_123', - choices: [ - { - index: 0, - delta: { - content: ' from OpenAI streaming!', - }, - finish_reason: 'stop', - }, - ], - usage: { - prompt_tokens: 12, - completion_tokens: 18, - total_tokens: 30, - completion_tokens_details: { - accepted_prediction_tokens: 0, - audio_tokens: 0, - reasoning_tokens: 0, - rejected_prediction_tokens: 0, - }, - prompt_tokens_details: { - audio_tokens: 0, - cached_tokens: 0, - }, - }, - }; - } - - // Create a mock streaming response for responses API - public async *createResponsesApiStream(params: { - model: string; - input: string; - instructions: string; - }): AsyncGenerator { - // Response created event - yield { - type: 'response.created', - response: { - id: 'resp_stream_456', - object: 'response', - created_at: 1677652310, - model: params.model, - status: 'in_progress', - error: null, - incomplete_details: null, - instructions: params.instructions, - max_output_tokens: 1000, - parallel_tool_calls: false, - previous_response_id: null, - reasoning: { - effort: null, - summary: null, - }, - store: false, - temperature: 0.7, - text: { - format: { - type: 'text', - }, - }, - tool_choice: 'auto', - top_p: 1.0, - truncation: 'disabled', - user: null, - metadata: {}, - output: [], - output_text: '', - usage: { - input_tokens: 0, - output_tokens: 0, - total_tokens: 0, - }, - }, - sequence_number: 1, - }; - - // Response in progress with output text delta - yield { - type: 'response.output_text.delta', - delta: 'Streaming response to: ', - sequence_number: 2, - }; - - yield { - type: 'response.output_text.delta', - delta: params.input, - sequence_number: 3, - }; - - // Response completed event - yield { - type: 'response.completed', - response: { - id: 'resp_stream_456', - object: 'response', - created_at: 1677652310, - model: params.model, - status: 'completed', - error: null, - incomplete_details: null, - instructions: params.instructions, - max_output_tokens: 1000, - parallel_tool_calls: false, - previous_response_id: null, - reasoning: { - effort: null, - summary: null, - }, - store: false, - temperature: 0.7, - text: { - format: { - type: 'text', - }, - }, - tool_choice: 'auto', - top_p: 1.0, - truncation: 'disabled', - user: null, - metadata: {}, - output: [], - output_text: params.input, - usage: { - input_tokens: 6, - output_tokens: 10, - total_tokens: 16, - }, - }, - sequence_number: 4, - }; } } From 4ad3bed9697110652c04ff0405e010a5329c641c Mon Sep 17 00:00:00 2001 From: Andrei Borza Date: Wed, 6 Aug 2025 14:57:21 +0200 Subject: [PATCH 6/7] Update sentry/core dep in integration tests --- dev-packages/cloudflare-integration-tests/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-packages/cloudflare-integration-tests/package.json b/dev-packages/cloudflare-integration-tests/package.json index 29b6bf795b67..891288b8bdf9 100644 --- a/dev-packages/cloudflare-integration-tests/package.json +++ b/dev-packages/cloudflare-integration-tests/package.json @@ -16,7 +16,7 @@ "@sentry/cloudflare": "10.1.0" }, "devDependencies": { - "@sentry/core": "10.0.0", + "@sentry/core": "10.1.0", "@cloudflare/workers-types": "^4.20250708.0", "@sentry-internal/test-utils": "link:../test-utils", "vitest": "^3.2.4", From 3f5fc648d02c64d7122c57470353165009d2819b Mon Sep 17 00:00:00 2001 From: Andrei Borza Date: Wed, 6 Aug 2025 16:06:57 +0200 Subject: [PATCH 7/7] Remove sentry/core import from devdeps --- dev-packages/cloudflare-integration-tests/package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/dev-packages/cloudflare-integration-tests/package.json b/dev-packages/cloudflare-integration-tests/package.json index 891288b8bdf9..696bd852cc9b 100644 --- a/dev-packages/cloudflare-integration-tests/package.json +++ b/dev-packages/cloudflare-integration-tests/package.json @@ -16,7 +16,6 @@ "@sentry/cloudflare": "10.1.0" }, "devDependencies": { - "@sentry/core": "10.1.0", "@cloudflare/workers-types": "^4.20250708.0", "@sentry-internal/test-utils": "link:../test-utils", "vitest": "^3.2.4",