diff --git a/packages/core/package.json b/packages/core/package.json index ccc5695f13..f2bf463a60 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -149,6 +149,7 @@ } }, "dependencies": { + "@opentelemetry/api": "^1.9.0", "@opentelemetry/semantic-conventions": "^1.39.0", "@standard-schema/spec": "^1.1.0", "zod": "^4.3.6" @@ -169,7 +170,6 @@ "peerDependencies": { "@better-auth/utils": "catalog:", "@better-fetch/fetch": "catalog:", - "@opentelemetry/api": "^1.9.0", "better-call": "catalog:", "@cloudflare/workers-types": ">=4", "jose": "^6.1.0", diff --git a/packages/core/src/instrumentation/instrumentation.test.ts b/packages/core/src/instrumentation/instrumentation.test.ts index cc7e40f98a..283a739081 100644 --- a/packages/core/src/instrumentation/instrumentation.test.ts +++ b/packages/core/src/instrumentation/instrumentation.test.ts @@ -8,6 +8,41 @@ import { afterAll, beforeAll, beforeEach, describe, expect, it } from "vitest"; import { withSpan } from "."; import { ATTR_DB_COLLECTION_NAME, ATTR_DB_OPERATION_NAME } from "./attributes"; +/** + * @see https://github.com/better-auth/better-auth/issues/8765 + */ +describe("withSpan no-op behavior (no SDK registered)", () => { + it("returns the value of a synchronous function", () => { + const result = withSpan("noop.sync", { attr: "value" }, () => 42); + expect(result).toBe(42); + }); + + it("returns the resolved value of an async function", async () => { + const result = await withSpan("noop.async", { attr: "value" }, async () => { + await new Promise((r) => setTimeout(r, 0)); + return "async-noop"; + }); + expect(result).toBe("async-noop"); + }); + + it("re-throws synchronous errors", () => { + expect(() => + withSpan("noop.sync.throw", {}, () => { + throw new Error("noop-sync-error"); + }), + ).toThrow("noop-sync-error"); + }); + + it("re-throws asynchronous errors", async () => { + await expect( + withSpan("noop.async.throw", {}, async () => { + await Promise.resolve(); + throw new Error("noop-async-error"); + }), + ).rejects.toThrow("noop-async-error"); + }); +}); + describe("instrumentation", () => { let provider: NodeTracerProvider; let exporter: InMemorySpanExporter; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1531294cfb..af0e5842d2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -693,7 +693,7 @@ importers: devDependencies: '@cloudflare/vitest-pool-workers': specifier: ^0.12.18 - version: 0.12.18(@cloudflare/workers-types@4.20260226.1)(@vitest/runner@4.1.3)(@vitest/snapshot@4.1.3)(vitest@4.1.3(@opentelemetry/api@1.9.0)(@types/node@25.5.2)(@vitest/coverage-istanbul@4.0.18(vitest@4.0.18))(@vitest/ui@4.0.18)(happy-dom@20.8.9)(msw@2.12.10(@types/node@25.5.2)(typescript@5.9.3))(vite@7.3.2(@types/node@25.5.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))) + version: 0.12.18(@cloudflare/workers-types@4.20260226.1)(@vitest/runner@4.1.3)(@vitest/snapshot@4.1.3)(vitest@4.1.3(@opentelemetry/api@1.9.0)(@types/node@25.5.2)(@vitest/coverage-istanbul@4.0.18(vitest@4.0.18))(@vitest/ui@4.0.18(vitest@4.0.18))(happy-dom@20.8.9)(msw@2.12.10(@types/node@25.5.2)(typescript@5.9.3))(vite@7.3.2(@types/node@25.5.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))) '@cloudflare/workers-types': specifier: ^4.20260226.1 version: 4.20260226.1 @@ -1056,6 +1056,9 @@ importers: packages/core: dependencies: + '@opentelemetry/api': + specifier: ^1.9.0 + version: 1.9.0 '@opentelemetry/semantic-conventions': specifier: ^1.39.0 version: 1.39.0 @@ -1075,9 +1078,6 @@ importers: '@cloudflare/workers-types': specifier: ^4.20250121.0 version: 4.20260226.1 - '@opentelemetry/api': - specifier: ^1.9.0 - version: 1.9.0 '@opentelemetry/sdk-trace-base': specifier: ^1.30.0 version: 1.30.1(@opentelemetry/api@1.9.0) @@ -16544,14 +16544,14 @@ snapshots: optionalDependencies: workerd: 1.20260305.0 - '@cloudflare/vitest-pool-workers@0.12.18(@cloudflare/workers-types@4.20260226.1)(@vitest/runner@4.1.3)(@vitest/snapshot@4.1.3)(vitest@4.1.3(@opentelemetry/api@1.9.0)(@types/node@25.5.2)(@vitest/coverage-istanbul@4.0.18(vitest@4.0.18))(@vitest/ui@4.0.18)(happy-dom@20.8.9)(msw@2.12.10(@types/node@25.5.2)(typescript@5.9.3))(vite@7.3.2(@types/node@25.5.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)))': + '@cloudflare/vitest-pool-workers@0.12.18(@cloudflare/workers-types@4.20260226.1)(@vitest/runner@4.1.3)(@vitest/snapshot@4.1.3)(vitest@4.1.3(@opentelemetry/api@1.9.0)(@types/node@25.5.2)(@vitest/coverage-istanbul@4.0.18(vitest@4.0.18))(@vitest/ui@4.0.18(vitest@4.0.18))(happy-dom@20.8.9)(msw@2.12.10(@types/node@25.5.2)(typescript@5.9.3))(vite@7.3.2(@types/node@25.5.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)))': dependencies: '@vitest/runner': 4.1.3 '@vitest/snapshot': 4.1.3 cjs-module-lexer: 1.4.3 esbuild: 0.27.3 miniflare: 4.20260305.0 - vitest: 4.1.3(@opentelemetry/api@1.9.0)(@types/node@25.5.2)(@vitest/coverage-istanbul@4.0.18(vitest@4.0.18))(@vitest/ui@4.0.18)(happy-dom@20.8.9)(msw@2.12.10(@types/node@25.5.2)(typescript@5.9.3))(vite@7.3.2(@types/node@25.5.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) + vitest: 4.1.3(@opentelemetry/api@1.9.0)(@types/node@25.5.2)(@vitest/coverage-istanbul@4.0.18(vitest@4.0.18))(@vitest/ui@4.0.18(vitest@4.0.18))(happy-dom@20.8.9)(msw@2.12.10(@types/node@25.5.2)(typescript@5.9.3))(vite@7.3.2(@types/node@25.5.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)) wrangler: 4.69.0(@cloudflare/workers-types@4.20260226.1) transitivePeerDependencies: - '@cloudflare/workers-types' @@ -21958,7 +21958,7 @@ snapshots: sirv: 3.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.5.2)(@vitest/ui@4.0.18)(happy-dom@20.8.9)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(msw@2.12.10(@types/node@25.5.2)(typescript@5.9.3))(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) + vitest: 4.0.18(@opentelemetry/api@1.9.0)(@types/node@25.3.2)(@vitest/ui@4.0.18)(happy-dom@20.8.9)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(msw@2.12.10(@types/node@25.3.2)(typescript@5.9.3))(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3) '@vitest/utils@4.0.18': dependencies: @@ -31300,7 +31300,7 @@ snapshots: - tsx - yaml - vitest@4.1.3(@opentelemetry/api@1.9.0)(@types/node@25.5.2)(@vitest/coverage-istanbul@4.0.18(vitest@4.0.18))(@vitest/ui@4.0.18)(happy-dom@20.8.9)(msw@2.12.10(@types/node@25.5.2)(typescript@5.9.3))(vite@7.3.2(@types/node@25.5.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)): + vitest@4.1.3(@opentelemetry/api@1.9.0)(@types/node@25.5.2)(@vitest/coverage-istanbul@4.0.18(vitest@4.0.18))(@vitest/ui@4.0.18(vitest@4.0.18))(happy-dom@20.8.9)(msw@2.12.10(@types/node@25.5.2)(typescript@5.9.3))(vite@7.3.2(@types/node@25.5.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)): dependencies: '@vitest/expect': 4.1.3 '@vitest/mocker': 4.1.3(msw@2.12.10(@types/node@25.5.2)(typescript@5.9.3))(vite@7.3.2(@types/node@25.5.2)(jiti@2.6.1)(less@4.5.1)(lightningcss@1.32.0)(sass@1.97.1)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))