@sentry/effect 11.0.0-alpha.1 → 11.0.0-alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/cjs/client/tracer.js +9 -0
- package/build/cjs/client/tracer.js.map +1 -0
- package/build/cjs/index.client.js +1 -1
- package/build/cjs/index.server.js +1 -1
- package/build/cjs/server/tracer.js +9 -0
- package/build/cjs/server/tracer.js.map +1 -0
- package/build/cjs/tracer.js +13 -10
- package/build/cjs/tracer.js.map +1 -1
- package/build/esm/client/tracer.js +7 -0
- package/build/esm/client/tracer.js.map +1 -0
- package/build/esm/index.client.js +1 -1
- package/build/esm/index.server.js +1 -1
- package/build/esm/package.json +1 -1
- package/build/esm/server/tracer.js +7 -0
- package/build/esm/server/tracer.js.map +1 -0
- package/build/esm/tracer.js +14 -11
- package/build/esm/tracer.js.map +1 -1
- package/build/types/client/tracer.d.ts +9 -0
- package/build/types/client/tracer.d.ts.map +1 -0
- package/build/types/index.client.d.ts +1 -1
- package/build/types/index.client.d.ts.map +1 -1
- package/build/types/index.server.d.ts +1 -1
- package/build/types/index.server.d.ts.map +1 -1
- package/build/types/index.types.d.ts +4 -0
- package/build/types/index.types.d.ts.map +1 -1
- package/build/types/server/tracer.d.ts +11 -0
- package/build/types/server/tracer.d.ts.map +1 -0
- package/build/types/tracer.d.ts +13 -2
- package/build/types/tracer.d.ts.map +1 -1
- package/package.json +6 -5
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
+
|
|
3
|
+
const browser = require('@sentry/core/browser');
|
|
4
|
+
const tracer = require('../tracer.js');
|
|
5
|
+
|
|
6
|
+
const SentryEffectTracer = tracer.makeSentryTracer((options) => browser.startInactiveSpan(options));
|
|
7
|
+
|
|
8
|
+
exports.SentryEffectTracer = SentryEffectTracer;
|
|
9
|
+
//# sourceMappingURL=tracer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tracer.js","sources":["../../../src/client/tracer.ts"],"sourcesContent":["import { startInactiveSpan } from '@sentry/core/browser';\nimport { makeSentryTracer } from '../tracer';\n\n/**\n * Effect `Tracer` that records Effect spans as Sentry spans in browser clients.\n *\n * Wrapped in an arrow rather than passed by reference so the import binding is read per span. That\n * keeps the browser variant substitutable (mocks, bundler interop) exactly as it was when the tracer\n * called it directly.\n */\nexport const SentryEffectTracer = makeSentryTracer(options => startInactiveSpan(options));\n"],"names":["makeSentryTracer","startInactiveSpan"],"mappings":";;;;;AAUO,MAAM,kBAAA,GAAqBA,uBAAA,CAAiB,CAAA,OAAA,KAAWC,yBAAA,CAAkB,OAAO,CAAC;;;;"}
|
|
@@ -2,7 +2,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
|
2
2
|
|
|
3
3
|
const browser = require('@sentry/browser');
|
|
4
4
|
const index = require('./client/index.js');
|
|
5
|
-
const tracer = require('./tracer.js');
|
|
5
|
+
const tracer = require('./client/tracer.js');
|
|
6
6
|
const logger = require('./logger.js');
|
|
7
7
|
const metrics = require('./metrics.js');
|
|
8
8
|
const sdk = require('./client/sdk.js');
|
|
@@ -2,7 +2,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
|
2
2
|
|
|
3
3
|
const node = require('@sentry/node');
|
|
4
4
|
const index = require('./server/index.js');
|
|
5
|
-
const tracer = require('./tracer.js');
|
|
5
|
+
const tracer = require('./server/tracer.js');
|
|
6
6
|
const logger = require('./logger.js');
|
|
7
7
|
const metrics = require('./metrics.js');
|
|
8
8
|
const sdk = require('./server/sdk.js');
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
+
|
|
3
|
+
const core = require('@sentry/core');
|
|
4
|
+
const tracer = require('../tracer.js');
|
|
5
|
+
|
|
6
|
+
const SentryEffectTracer = tracer.makeSentryTracer((options) => core.startInactiveSpan(options));
|
|
7
|
+
|
|
8
|
+
exports.SentryEffectTracer = SentryEffectTracer;
|
|
9
|
+
//# sourceMappingURL=tracer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tracer.js","sources":["../../../src/server/tracer.ts"],"sourcesContent":["import { startInactiveSpan } from '@sentry/core';\nimport { makeSentryTracer } from '../tracer';\n\n/**\n * Effect `Tracer` that records Effect spans as Sentry spans on the server.\n *\n * Deliberately the plain `@sentry/core` variant, not `@sentry/core/browser`: the browser one guards\n * every span start with a `getClient()` lookup to lazily install `spanStreamingIntegration`, which on\n * the server is pure overhead — `ServerRuntimeClient` already installs it eagerly.\n *\n * See `./client/tracer.ts` for why the call is wrapped in an arrow.\n */\nexport const SentryEffectTracer = makeSentryTracer(options => startInactiveSpan(options));\n"],"names":["makeSentryTracer","startInactiveSpan"],"mappings":";;;;;AAYO,MAAM,kBAAA,GAAqBA,uBAAA,CAAiB,CAAA,OAAA,KAAWC,sBAAA,CAAkB,OAAO,CAAC;;;;"}
|
package/build/cjs/tracer.js
CHANGED
|
@@ -15,12 +15,12 @@ function deriveOrigin(name) {
|
|
|
15
15
|
}
|
|
16
16
|
function deriveOp(name) {
|
|
17
17
|
if (name.startsWith("http.server")) {
|
|
18
|
-
return op.
|
|
18
|
+
return op.HTTP_SERVER;
|
|
19
19
|
}
|
|
20
20
|
if (name.startsWith("http.client")) {
|
|
21
|
-
return op.
|
|
21
|
+
return op.HTTP_CLIENT;
|
|
22
22
|
}
|
|
23
|
-
return op.
|
|
23
|
+
return op.FUNCTION;
|
|
24
24
|
}
|
|
25
25
|
const SENTRY_SPAN_SYMBOL = /* @__PURE__ */ Symbol.for("@sentry/effect.SentrySpan");
|
|
26
26
|
function nanosToHrTime(nanos) {
|
|
@@ -115,9 +115,9 @@ class SentrySpanWrapper {
|
|
|
115
115
|
this.sentrySpan.addEvent(name, attributes, nanosToHrTime(startTime));
|
|
116
116
|
}
|
|
117
117
|
}
|
|
118
|
-
function createSentrySpan(name, parent, context, links, startTime, kind) {
|
|
118
|
+
function createSentrySpan(startInactiveSpan, name, parent, context, links, startTime, kind) {
|
|
119
119
|
const parentSentrySpan = Option.isSome(parent) && isSentrySpan(parent.value) ? parent.value.sentrySpan : core.getActiveSpan() ?? null;
|
|
120
|
-
const newSpan =
|
|
120
|
+
const newSpan = startInactiveSpan({
|
|
121
121
|
name,
|
|
122
122
|
startTime: nanosToHrTime(startTime),
|
|
123
123
|
attributes: {
|
|
@@ -140,10 +140,10 @@ const isEffectV4 = (() => {
|
|
|
140
140
|
return false;
|
|
141
141
|
}
|
|
142
142
|
})();
|
|
143
|
-
const makeSentryTracerV3 = () => {
|
|
143
|
+
const makeSentryTracerV3 = (startInactiveSpan) => {
|
|
144
144
|
return EffectTracer.make({
|
|
145
145
|
span(name, parent, context, links, startTime, kind) {
|
|
146
|
-
return createSentrySpan(name, parent, context, links, startTime, kind);
|
|
146
|
+
return createSentrySpan(startInactiveSpan, name, parent, context, links, startTime, kind);
|
|
147
147
|
},
|
|
148
148
|
context(execution, fiber) {
|
|
149
149
|
const currentSpan = fiber.currentSpan;
|
|
@@ -154,11 +154,12 @@ const makeSentryTracerV3 = () => {
|
|
|
154
154
|
}
|
|
155
155
|
});
|
|
156
156
|
};
|
|
157
|
-
const makeSentryTracerV4 = () => {
|
|
157
|
+
const makeSentryTracerV4 = (startInactiveSpan) => {
|
|
158
158
|
const EFFECT_EVALUATE = "~effect/Effect/evaluate";
|
|
159
159
|
return EffectTracer.make({
|
|
160
160
|
span(options) {
|
|
161
161
|
return createSentrySpan(
|
|
162
|
+
startInactiveSpan,
|
|
162
163
|
options.name,
|
|
163
164
|
options.parent,
|
|
164
165
|
options.annotations,
|
|
@@ -176,7 +177,9 @@ const makeSentryTracerV4 = () => {
|
|
|
176
177
|
}
|
|
177
178
|
});
|
|
178
179
|
};
|
|
179
|
-
|
|
180
|
+
function makeSentryTracer(startInactiveSpan) {
|
|
181
|
+
return isEffectV4 ? makeSentryTracerV4(startInactiveSpan) : makeSentryTracerV3(startInactiveSpan);
|
|
182
|
+
}
|
|
180
183
|
|
|
181
|
-
exports.
|
|
184
|
+
exports.makeSentryTracer = makeSentryTracer;
|
|
182
185
|
//# sourceMappingURL=tracer.js.map
|
package/build/cjs/tracer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tracer.js","sources":["../../src/tracer.ts"],"sourcesContent":["import { SENTRY_OP } from '@sentry/conventions/attributes';\nimport {\n GENERAL_FUNCTION_SPAN_OP,\n WEB_SERVER_HTTP_CLIENT_SPAN_OP,\n WEB_SERVER_HTTP_SERVER_SPAN_OP,\n} from '@sentry/conventions/op';\nimport type { Span } from '@sentry/core';\nimport {\n isObjectLike,\n getActiveSpan,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n startInactiveSpan,\n withActiveSpan,\n} from '@sentry/core';\nimport type * as Context from 'effect/Context';\nimport * as Exit from 'effect/Exit';\nimport * as Option from 'effect/Option';\nimport * as EffectTracer from 'effect/Tracer';\n\nfunction deriveOrigin(name: string): string {\n if (name.startsWith('http.server') || name.startsWith('http.client')) {\n return 'auto.http.effect';\n }\n\n return 'auto.function.effect';\n}\n\n/**\n * Effect span names are chosen by user code, so the name is the only signal available. `@effect/platform`\n * names its HTTP spans `http.server`/`http.client`, which map onto the matching Sentry ops; everything\n * else is arbitrary user work and falls back to `function`.\n */\nfunction deriveOp(name: string): string {\n if (name.startsWith('http.server')) {\n return WEB_SERVER_HTTP_SERVER_SPAN_OP;\n }\n\n if (name.startsWith('http.client')) {\n return WEB_SERVER_HTTP_CLIENT_SPAN_OP;\n }\n\n return GENERAL_FUNCTION_SPAN_OP;\n}\n\ntype HrTime = [number, number];\n\nconst SENTRY_SPAN_SYMBOL = Symbol.for('@sentry/effect.SentrySpan');\n\nfunction nanosToHrTime(nanos: bigint): HrTime {\n const seconds = Number(nanos / BigInt(1_000_000_000));\n const remainingNanos = Number(nanos % BigInt(1_000_000_000));\n return [seconds, remainingNanos];\n}\n\ninterface SentrySpanLike extends EffectTracer.Span {\n readonly [SENTRY_SPAN_SYMBOL]: true;\n readonly sentrySpan: Span;\n}\n\nfunction isSentrySpan(span: EffectTracer.AnySpan): span is SentrySpanLike {\n return SENTRY_SPAN_SYMBOL in span;\n}\n\nfunction getErrorMessage(exit: Exit.Exit<unknown, unknown>): string | undefined {\n if (!Exit.isFailure(exit)) {\n return undefined;\n }\n\n const cause = exit.cause as unknown;\n\n // Effect v4: cause.reasons is an array of Reason objects\n if (isObjectLike(cause) && 'reasons' in cause && Array.isArray((cause as { reasons: unknown }).reasons)) {\n const reasons = (cause as { reasons: Array<{ _tag?: string; error?: unknown; defect?: unknown }> }).reasons;\n for (const reason of reasons) {\n if (reason._tag === 'Fail' && reason.error !== undefined) {\n return String(reason.error);\n }\n if (reason._tag === 'Die' && reason.defect !== undefined) {\n return String(reason.defect);\n }\n }\n return 'internal_error';\n }\n\n // Effect v3: cause has _tag directly\n if (isObjectLike(cause) && '_tag' in cause) {\n const v3Cause = cause as { _tag: string; error?: unknown; defect?: unknown };\n if (v3Cause._tag === 'Fail') {\n return String(v3Cause.error);\n }\n if (v3Cause._tag === 'Die') {\n return String(v3Cause.defect);\n }\n }\n\n return 'internal_error';\n}\n\nclass SentrySpanWrapper implements SentrySpanLike {\n public readonly [SENTRY_SPAN_SYMBOL]: true;\n public readonly _tag: 'Span';\n public readonly spanId: string;\n public readonly traceId: string;\n public readonly attributes: Map<string, unknown>;\n public readonly sampled: boolean;\n public readonly parent: Option.Option<EffectTracer.AnySpan>;\n public readonly links: Array<EffectTracer.SpanLink>;\n public status: EffectTracer.SpanStatus;\n public readonly sentrySpan: Span;\n public readonly annotations: Context.Context<never>;\n\n public constructor(\n public readonly name: string,\n parent: Option.Option<EffectTracer.AnySpan>,\n public readonly context: Context.Context<never>,\n links: ReadonlyArray<EffectTracer.SpanLink>,\n startTime: bigint,\n public readonly kind: EffectTracer.SpanKind,\n existingSpan: Span,\n ) {\n this[SENTRY_SPAN_SYMBOL] = true as const;\n this._tag = 'Span' as const;\n this.attributes = new Map<string, unknown>();\n this.parent = parent;\n this.links = [...links];\n this.sentrySpan = existingSpan;\n this.annotations = context;\n\n const spanContext = this.sentrySpan.spanContext();\n this.spanId = spanContext.spanId;\n this.traceId = spanContext.traceId;\n this.sampled = this.sentrySpan.isRecording();\n this.status = {\n _tag: 'Started',\n startTime,\n };\n }\n\n public attribute(key: string, value: unknown): void {\n if (!this.sentrySpan.isRecording()) {\n return;\n }\n\n this.sentrySpan.setAttribute(key, value as Parameters<Span['setAttribute']>[1]);\n this.attributes.set(key, value);\n }\n\n public addLinks(links: ReadonlyArray<EffectTracer.SpanLink>): void {\n this.links.push(...links);\n }\n\n public end(endTime: bigint, exit: Exit.Exit<unknown, unknown>): void {\n this.status = {\n _tag: 'Ended',\n endTime,\n exit,\n startTime: this.status.startTime,\n };\n\n if (!this.sentrySpan.isRecording()) {\n return;\n }\n\n if (Exit.isFailure(exit)) {\n const message = getErrorMessage(exit) ?? 'internal_error';\n this.sentrySpan.setStatus({ code: 2, message });\n } else {\n this.sentrySpan.setStatus({ code: 1 });\n }\n\n this.sentrySpan.end(nanosToHrTime(endTime));\n }\n\n public event(name: string, startTime: bigint, attributes?: Record<string, unknown>): void {\n if (!this.sentrySpan.isRecording()) {\n return;\n }\n\n this.sentrySpan.addEvent(name, attributes as Parameters<Span['addEvent']>[1], nanosToHrTime(startTime));\n }\n}\n\nfunction createSentrySpan(\n name: string,\n parent: Option.Option<EffectTracer.AnySpan>,\n context: Context.Context<never>,\n links: ReadonlyArray<EffectTracer.SpanLink>,\n startTime: bigint,\n kind: EffectTracer.SpanKind,\n): SentrySpanLike {\n const parentSentrySpan =\n Option.isSome(parent) && isSentrySpan(parent.value) ? parent.value.sentrySpan : (getActiveSpan() ?? null);\n\n const newSpan = startInactiveSpan({\n name,\n startTime: nanosToHrTime(startTime),\n attributes: {\n [SENTRY_OP]: deriveOp(name),\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: deriveOrigin(name),\n },\n ...(parentSentrySpan ? { parentSpan: parentSentrySpan } : {}),\n });\n\n return new SentrySpanWrapper(name, parent, context, links, startTime, kind, newSpan);\n}\n\n// Check if we're running Effect v4 by checking the Exit/Cause structure\n// In v4, causes have a 'reasons' array\n// In v3, causes have '_tag' directly on the cause object\nconst isEffectV4 = (() => {\n try {\n const testExit = Exit.fail('test') as unknown as { cause?: unknown };\n const cause = testExit.cause;\n // v4 causes have 'reasons' array, v3 causes have '_tag' directly\n if (isObjectLike(cause) && 'reasons' in cause) {\n return true;\n }\n return false;\n } catch {\n return false;\n }\n})();\n\nconst makeSentryTracerV3 = (): EffectTracer.Tracer => {\n // Effect v3 API: span(name, parent, context, links, startTime, kind)\n return EffectTracer.make({\n span(\n name: string,\n parent: Option.Option<EffectTracer.AnySpan>,\n context: Context.Context<never>,\n links: ReadonlyArray<EffectTracer.SpanLink>,\n startTime: bigint,\n kind: EffectTracer.SpanKind,\n ) {\n return createSentrySpan(name, parent, context, links, startTime, kind);\n },\n context(execution: () => unknown, fiber: { currentSpan?: EffectTracer.AnySpan }) {\n const currentSpan = fiber.currentSpan;\n if (currentSpan === undefined || !isSentrySpan(currentSpan)) {\n return execution();\n }\n return withActiveSpan(currentSpan.sentrySpan, execution);\n },\n } as unknown as EffectTracer.Tracer);\n};\n\nconst makeSentryTracerV4 = (): EffectTracer.Tracer => {\n const EFFECT_EVALUATE = '~effect/Effect/evaluate' as const;\n\n return EffectTracer.make({\n span(options) {\n return createSentrySpan(\n options.name,\n options.parent,\n options.annotations,\n options.links,\n options.startTime,\n options.kind,\n );\n },\n context(primitive, fiber) {\n const currentSpan = fiber.currentSpan;\n if (currentSpan === undefined || !isSentrySpan(currentSpan)) {\n return primitive[EFFECT_EVALUATE](fiber);\n }\n return withActiveSpan(currentSpan.sentrySpan, () => primitive[EFFECT_EVALUATE](fiber));\n },\n });\n};\n\n/**\n * Effect Layer that sets up the Sentry tracer for Effect spans.\n */\nexport const SentryEffectTracer = isEffectV4 ? makeSentryTracerV4() : makeSentryTracerV3();\n"],"names":["WEB_SERVER_HTTP_SERVER_SPAN_OP","WEB_SERVER_HTTP_CLIENT_SPAN_OP","GENERAL_FUNCTION_SPAN_OP","isObjectLike","getActiveSpan","startInactiveSpan","SENTRY_OP","SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN","withActiveSpan"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tracer.js","sources":["../../src/tracer.ts"],"sourcesContent":["import { SENTRY_OP } from '@sentry/conventions/attributes';\nimport { FUNCTION, HTTP_CLIENT, HTTP_SERVER } from '@sentry/conventions/op';\nimport type { Span, StartSpanOptions } from '@sentry/core';\nimport { isObjectLike, getActiveSpan, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, withActiveSpan } from '@sentry/core';\nimport type * as Context from 'effect/Context';\nimport * as Exit from 'effect/Exit';\nimport * as Option from 'effect/Option';\nimport * as EffectTracer from 'effect/Tracer';\n\nfunction deriveOrigin(name: string): string {\n if (name.startsWith('http.server') || name.startsWith('http.client')) {\n return 'auto.http.effect';\n }\n\n return 'auto.function.effect';\n}\n\n/**\n * Effect span names are chosen by user code, so the name is the only signal available. `@effect/platform`\n * names its HTTP spans `http.server`/`http.client`, which map onto the matching Sentry ops; everything\n * else is arbitrary user work and falls back to `function`.\n */\nfunction deriveOp(name: string): string {\n if (name.startsWith('http.server')) {\n return HTTP_SERVER;\n }\n\n if (name.startsWith('http.client')) {\n return HTTP_CLIENT;\n }\n\n return FUNCTION;\n}\n\ntype HrTime = [number, number];\n\nconst SENTRY_SPAN_SYMBOL = Symbol.for('@sentry/effect.SentrySpan');\n\nfunction nanosToHrTime(nanos: bigint): HrTime {\n const seconds = Number(nanos / BigInt(1_000_000_000));\n const remainingNanos = Number(nanos % BigInt(1_000_000_000));\n return [seconds, remainingNanos];\n}\n\ninterface SentrySpanLike extends EffectTracer.Span {\n readonly [SENTRY_SPAN_SYMBOL]: true;\n readonly sentrySpan: Span;\n}\n\nfunction isSentrySpan(span: EffectTracer.AnySpan): span is SentrySpanLike {\n return SENTRY_SPAN_SYMBOL in span;\n}\n\nfunction getErrorMessage(exit: Exit.Exit<unknown, unknown>): string | undefined {\n if (!Exit.isFailure(exit)) {\n return undefined;\n }\n\n const cause = exit.cause as unknown;\n\n // Effect v4: cause.reasons is an array of Reason objects\n if (isObjectLike(cause) && 'reasons' in cause && Array.isArray((cause as { reasons: unknown }).reasons)) {\n const reasons = (cause as { reasons: Array<{ _tag?: string; error?: unknown; defect?: unknown }> }).reasons;\n for (const reason of reasons) {\n if (reason._tag === 'Fail' && reason.error !== undefined) {\n return String(reason.error);\n }\n if (reason._tag === 'Die' && reason.defect !== undefined) {\n return String(reason.defect);\n }\n }\n return 'internal_error';\n }\n\n // Effect v3: cause has _tag directly\n if (isObjectLike(cause) && '_tag' in cause) {\n const v3Cause = cause as { _tag: string; error?: unknown; defect?: unknown };\n if (v3Cause._tag === 'Fail') {\n return String(v3Cause.error);\n }\n if (v3Cause._tag === 'Die') {\n return String(v3Cause.defect);\n }\n }\n\n return 'internal_error';\n}\n\nclass SentrySpanWrapper implements SentrySpanLike {\n public readonly [SENTRY_SPAN_SYMBOL]: true;\n public readonly _tag: 'Span';\n public readonly spanId: string;\n public readonly traceId: string;\n public readonly attributes: Map<string, unknown>;\n public readonly sampled: boolean;\n public readonly parent: Option.Option<EffectTracer.AnySpan>;\n public readonly links: Array<EffectTracer.SpanLink>;\n public status: EffectTracer.SpanStatus;\n public readonly sentrySpan: Span;\n public readonly annotations: Context.Context<never>;\n\n public constructor(\n public readonly name: string,\n parent: Option.Option<EffectTracer.AnySpan>,\n public readonly context: Context.Context<never>,\n links: ReadonlyArray<EffectTracer.SpanLink>,\n startTime: bigint,\n public readonly kind: EffectTracer.SpanKind,\n existingSpan: Span,\n ) {\n this[SENTRY_SPAN_SYMBOL] = true as const;\n this._tag = 'Span' as const;\n this.attributes = new Map<string, unknown>();\n this.parent = parent;\n this.links = [...links];\n this.sentrySpan = existingSpan;\n this.annotations = context;\n\n const spanContext = this.sentrySpan.spanContext();\n this.spanId = spanContext.spanId;\n this.traceId = spanContext.traceId;\n this.sampled = this.sentrySpan.isRecording();\n this.status = {\n _tag: 'Started',\n startTime,\n };\n }\n\n public attribute(key: string, value: unknown): void {\n if (!this.sentrySpan.isRecording()) {\n return;\n }\n\n this.sentrySpan.setAttribute(key, value as Parameters<Span['setAttribute']>[1]);\n this.attributes.set(key, value);\n }\n\n public addLinks(links: ReadonlyArray<EffectTracer.SpanLink>): void {\n this.links.push(...links);\n }\n\n public end(endTime: bigint, exit: Exit.Exit<unknown, unknown>): void {\n this.status = {\n _tag: 'Ended',\n endTime,\n exit,\n startTime: this.status.startTime,\n };\n\n if (!this.sentrySpan.isRecording()) {\n return;\n }\n\n if (Exit.isFailure(exit)) {\n const message = getErrorMessage(exit) ?? 'internal_error';\n this.sentrySpan.setStatus({ code: 2, message });\n } else {\n this.sentrySpan.setStatus({ code: 1 });\n }\n\n this.sentrySpan.end(nanosToHrTime(endTime));\n }\n\n public event(name: string, startTime: bigint, attributes?: Record<string, unknown>): void {\n if (!this.sentrySpan.isRecording()) {\n return;\n }\n\n this.sentrySpan.addEvent(name, attributes as Parameters<Span['addEvent']>[1], nanosToHrTime(startTime));\n }\n}\n\n/**\n * The client and the server entry differ only in which `startInactiveSpan` they hand to\n * {@link makeSentryTracer}: the browser one from `@sentry/core/browser`, which installs the span\n * streaming integration on first use, and the plain one from `@sentry/core`, which does not. Nothing\n * else about the tracer is platform-specific.\n */\nexport type StartInactiveSpan = (options: StartSpanOptions) => Span;\n\nfunction createSentrySpan(\n startInactiveSpan: StartInactiveSpan,\n name: string,\n parent: Option.Option<EffectTracer.AnySpan>,\n context: Context.Context<never>,\n links: ReadonlyArray<EffectTracer.SpanLink>,\n startTime: bigint,\n kind: EffectTracer.SpanKind,\n): SentrySpanLike {\n const parentSentrySpan =\n Option.isSome(parent) && isSentrySpan(parent.value) ? parent.value.sentrySpan : (getActiveSpan() ?? null);\n\n const newSpan = startInactiveSpan({\n name,\n startTime: nanosToHrTime(startTime),\n attributes: {\n [SENTRY_OP]: deriveOp(name),\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: deriveOrigin(name),\n },\n ...(parentSentrySpan ? { parentSpan: parentSentrySpan } : {}),\n });\n\n return new SentrySpanWrapper(name, parent, context, links, startTime, kind, newSpan);\n}\n\n// Check if we're running Effect v4 by checking the Exit/Cause structure\n// In v4, causes have a 'reasons' array\n// In v3, causes have '_tag' directly on the cause object\nconst isEffectV4 = (() => {\n try {\n const testExit = Exit.fail('test') as unknown as { cause?: unknown };\n const cause = testExit.cause;\n // v4 causes have 'reasons' array, v3 causes have '_tag' directly\n if (isObjectLike(cause) && 'reasons' in cause) {\n return true;\n }\n return false;\n } catch {\n return false;\n }\n})();\n\nconst makeSentryTracerV3 = (startInactiveSpan: StartInactiveSpan): EffectTracer.Tracer => {\n // Effect v3 API: span(name, parent, context, links, startTime, kind)\n return EffectTracer.make({\n span(\n name: string,\n parent: Option.Option<EffectTracer.AnySpan>,\n context: Context.Context<never>,\n links: ReadonlyArray<EffectTracer.SpanLink>,\n startTime: bigint,\n kind: EffectTracer.SpanKind,\n ) {\n return createSentrySpan(startInactiveSpan, name, parent, context, links, startTime, kind);\n },\n context(execution: () => unknown, fiber: { currentSpan?: EffectTracer.AnySpan }) {\n const currentSpan = fiber.currentSpan;\n if (currentSpan === undefined || !isSentrySpan(currentSpan)) {\n return execution();\n }\n return withActiveSpan(currentSpan.sentrySpan, execution);\n },\n } as unknown as EffectTracer.Tracer);\n};\n\nconst makeSentryTracerV4 = (startInactiveSpan: StartInactiveSpan): EffectTracer.Tracer => {\n const EFFECT_EVALUATE = '~effect/Effect/evaluate' as const;\n\n return EffectTracer.make({\n span(options) {\n return createSentrySpan(\n startInactiveSpan,\n options.name,\n options.parent,\n options.annotations,\n options.links,\n options.startTime,\n options.kind,\n );\n },\n context(primitive, fiber) {\n const currentSpan = fiber.currentSpan;\n if (currentSpan === undefined || !isSentrySpan(currentSpan)) {\n return primitive[EFFECT_EVALUATE](fiber);\n }\n return withActiveSpan(currentSpan.sentrySpan, () => primitive[EFFECT_EVALUATE](fiber));\n },\n });\n};\n\n/**\n * Creates an Effect `Tracer` that records Effect spans as Sentry spans.\n *\n * Use the `SentryEffectTracer` exported from `@sentry/effect` rather than calling this directly — the\n * client and server entries each bind the right `startInactiveSpan` for their platform.\n */\nexport function makeSentryTracer(startInactiveSpan: StartInactiveSpan): EffectTracer.Tracer {\n return isEffectV4 ? makeSentryTracerV4(startInactiveSpan) : makeSentryTracerV3(startInactiveSpan);\n}\n"],"names":["HTTP_SERVER","HTTP_CLIENT","FUNCTION","isObjectLike","getActiveSpan","SENTRY_OP","SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN","withActiveSpan"],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { startInactiveSpan } from '@sentry/core/browser';
|
|
2
|
+
import { makeSentryTracer } from '../tracer.js';
|
|
3
|
+
|
|
4
|
+
const SentryEffectTracer = makeSentryTracer((options) => startInactiveSpan(options));
|
|
5
|
+
|
|
6
|
+
export { SentryEffectTracer };
|
|
7
|
+
//# sourceMappingURL=tracer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tracer.js","sources":["../../../src/client/tracer.ts"],"sourcesContent":["import { startInactiveSpan } from '@sentry/core/browser';\nimport { makeSentryTracer } from '../tracer';\n\n/**\n * Effect `Tracer` that records Effect spans as Sentry spans in browser clients.\n *\n * Wrapped in an arrow rather than passed by reference so the import binding is read per span. That\n * keeps the browser variant substitutable (mocks, bundler interop) exactly as it was when the tracer\n * called it directly.\n */\nexport const SentryEffectTracer = makeSentryTracer(options => startInactiveSpan(options));\n"],"names":[],"mappings":";;;AAUO,MAAM,kBAAA,GAAqB,gBAAA,CAAiB,CAAA,OAAA,KAAW,iBAAA,CAAkB,OAAO,CAAC;;;;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export * from '@sentry/browser';
|
|
2
2
|
export { effectLayer } from './client/index.js';
|
|
3
|
-
export { SentryEffectTracer } from './tracer.js';
|
|
3
|
+
export { SentryEffectTracer } from './client/tracer.js';
|
|
4
4
|
export { SentryEffectLogger } from './logger.js';
|
|
5
5
|
export { SentryEffectMetricsLayer } from './metrics.js';
|
|
6
6
|
export { init } from './client/sdk.js';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export * from '@sentry/node';
|
|
2
2
|
export { effectLayer } from './server/index.js';
|
|
3
|
-
export { SentryEffectTracer } from './tracer.js';
|
|
3
|
+
export { SentryEffectTracer } from './server/tracer.js';
|
|
4
4
|
export { SentryEffectLogger } from './logger.js';
|
|
5
5
|
export { SentryEffectMetricsLayer } from './metrics.js';
|
|
6
6
|
export { init } from './server/sdk.js';
|
package/build/esm/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"type":"module","version":"11.0.0-alpha.
|
|
1
|
+
{"type":"module","version":"11.0.0-alpha.2","sideEffects":false}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tracer.js","sources":["../../../src/server/tracer.ts"],"sourcesContent":["import { startInactiveSpan } from '@sentry/core';\nimport { makeSentryTracer } from '../tracer';\n\n/**\n * Effect `Tracer` that records Effect spans as Sentry spans on the server.\n *\n * Deliberately the plain `@sentry/core` variant, not `@sentry/core/browser`: the browser one guards\n * every span start with a `getClient()` lookup to lazily install `spanStreamingIntegration`, which on\n * the server is pure overhead — `ServerRuntimeClient` already installs it eagerly.\n *\n * See `./client/tracer.ts` for why the call is wrapped in an arrow.\n */\nexport const SentryEffectTracer = makeSentryTracer(options => startInactiveSpan(options));\n"],"names":[],"mappings":";;;AAYO,MAAM,kBAAA,GAAqB,gBAAA,CAAiB,CAAA,OAAA,KAAW,iBAAA,CAAkB,OAAO,CAAC;;;;"}
|
package/build/esm/tracer.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { SENTRY_OP } from '@sentry/conventions/attributes';
|
|
2
|
-
import {
|
|
3
|
-
import { isObjectLike, withActiveSpan, getActiveSpan,
|
|
2
|
+
import { HTTP_SERVER, HTTP_CLIENT, FUNCTION } from '@sentry/conventions/op';
|
|
3
|
+
import { isObjectLike, withActiveSpan, getActiveSpan, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from '@sentry/core';
|
|
4
4
|
import * as Exit from 'effect/Exit';
|
|
5
5
|
import * as Option from 'effect/Option';
|
|
6
6
|
import * as EffectTracer from 'effect/Tracer';
|
|
@@ -13,12 +13,12 @@ function deriveOrigin(name) {
|
|
|
13
13
|
}
|
|
14
14
|
function deriveOp(name) {
|
|
15
15
|
if (name.startsWith("http.server")) {
|
|
16
|
-
return
|
|
16
|
+
return HTTP_SERVER;
|
|
17
17
|
}
|
|
18
18
|
if (name.startsWith("http.client")) {
|
|
19
|
-
return
|
|
19
|
+
return HTTP_CLIENT;
|
|
20
20
|
}
|
|
21
|
-
return
|
|
21
|
+
return FUNCTION;
|
|
22
22
|
}
|
|
23
23
|
const SENTRY_SPAN_SYMBOL = /* @__PURE__ */ Symbol.for("@sentry/effect.SentrySpan");
|
|
24
24
|
function nanosToHrTime(nanos) {
|
|
@@ -113,7 +113,7 @@ class SentrySpanWrapper {
|
|
|
113
113
|
this.sentrySpan.addEvent(name, attributes, nanosToHrTime(startTime));
|
|
114
114
|
}
|
|
115
115
|
}
|
|
116
|
-
function createSentrySpan(name, parent, context, links, startTime, kind) {
|
|
116
|
+
function createSentrySpan(startInactiveSpan, name, parent, context, links, startTime, kind) {
|
|
117
117
|
const parentSentrySpan = Option.isSome(parent) && isSentrySpan(parent.value) ? parent.value.sentrySpan : getActiveSpan() ?? null;
|
|
118
118
|
const newSpan = startInactiveSpan({
|
|
119
119
|
name,
|
|
@@ -138,10 +138,10 @@ const isEffectV4 = (() => {
|
|
|
138
138
|
return false;
|
|
139
139
|
}
|
|
140
140
|
})();
|
|
141
|
-
const makeSentryTracerV3 = () => {
|
|
141
|
+
const makeSentryTracerV3 = (startInactiveSpan) => {
|
|
142
142
|
return EffectTracer.make({
|
|
143
143
|
span(name, parent, context, links, startTime, kind) {
|
|
144
|
-
return createSentrySpan(name, parent, context, links, startTime, kind);
|
|
144
|
+
return createSentrySpan(startInactiveSpan, name, parent, context, links, startTime, kind);
|
|
145
145
|
},
|
|
146
146
|
context(execution, fiber) {
|
|
147
147
|
const currentSpan = fiber.currentSpan;
|
|
@@ -152,11 +152,12 @@ const makeSentryTracerV3 = () => {
|
|
|
152
152
|
}
|
|
153
153
|
});
|
|
154
154
|
};
|
|
155
|
-
const makeSentryTracerV4 = () => {
|
|
155
|
+
const makeSentryTracerV4 = (startInactiveSpan) => {
|
|
156
156
|
const EFFECT_EVALUATE = "~effect/Effect/evaluate";
|
|
157
157
|
return EffectTracer.make({
|
|
158
158
|
span(options) {
|
|
159
159
|
return createSentrySpan(
|
|
160
|
+
startInactiveSpan,
|
|
160
161
|
options.name,
|
|
161
162
|
options.parent,
|
|
162
163
|
options.annotations,
|
|
@@ -174,7 +175,9 @@ const makeSentryTracerV4 = () => {
|
|
|
174
175
|
}
|
|
175
176
|
});
|
|
176
177
|
};
|
|
177
|
-
|
|
178
|
+
function makeSentryTracer(startInactiveSpan) {
|
|
179
|
+
return isEffectV4 ? makeSentryTracerV4(startInactiveSpan) : makeSentryTracerV3(startInactiveSpan);
|
|
180
|
+
}
|
|
178
181
|
|
|
179
|
-
export {
|
|
182
|
+
export { makeSentryTracer };
|
|
180
183
|
//# sourceMappingURL=tracer.js.map
|
package/build/esm/tracer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tracer.js","sources":["../../src/tracer.ts"],"sourcesContent":["import { SENTRY_OP } from '@sentry/conventions/attributes';\nimport {\n GENERAL_FUNCTION_SPAN_OP,\n WEB_SERVER_HTTP_CLIENT_SPAN_OP,\n WEB_SERVER_HTTP_SERVER_SPAN_OP,\n} from '@sentry/conventions/op';\nimport type { Span } from '@sentry/core';\nimport {\n isObjectLike,\n getActiveSpan,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n startInactiveSpan,\n withActiveSpan,\n} from '@sentry/core';\nimport type * as Context from 'effect/Context';\nimport * as Exit from 'effect/Exit';\nimport * as Option from 'effect/Option';\nimport * as EffectTracer from 'effect/Tracer';\n\nfunction deriveOrigin(name: string): string {\n if (name.startsWith('http.server') || name.startsWith('http.client')) {\n return 'auto.http.effect';\n }\n\n return 'auto.function.effect';\n}\n\n/**\n * Effect span names are chosen by user code, so the name is the only signal available. `@effect/platform`\n * names its HTTP spans `http.server`/`http.client`, which map onto the matching Sentry ops; everything\n * else is arbitrary user work and falls back to `function`.\n */\nfunction deriveOp(name: string): string {\n if (name.startsWith('http.server')) {\n return WEB_SERVER_HTTP_SERVER_SPAN_OP;\n }\n\n if (name.startsWith('http.client')) {\n return WEB_SERVER_HTTP_CLIENT_SPAN_OP;\n }\n\n return GENERAL_FUNCTION_SPAN_OP;\n}\n\ntype HrTime = [number, number];\n\nconst SENTRY_SPAN_SYMBOL = Symbol.for('@sentry/effect.SentrySpan');\n\nfunction nanosToHrTime(nanos: bigint): HrTime {\n const seconds = Number(nanos / BigInt(1_000_000_000));\n const remainingNanos = Number(nanos % BigInt(1_000_000_000));\n return [seconds, remainingNanos];\n}\n\ninterface SentrySpanLike extends EffectTracer.Span {\n readonly [SENTRY_SPAN_SYMBOL]: true;\n readonly sentrySpan: Span;\n}\n\nfunction isSentrySpan(span: EffectTracer.AnySpan): span is SentrySpanLike {\n return SENTRY_SPAN_SYMBOL in span;\n}\n\nfunction getErrorMessage(exit: Exit.Exit<unknown, unknown>): string | undefined {\n if (!Exit.isFailure(exit)) {\n return undefined;\n }\n\n const cause = exit.cause as unknown;\n\n // Effect v4: cause.reasons is an array of Reason objects\n if (isObjectLike(cause) && 'reasons' in cause && Array.isArray((cause as { reasons: unknown }).reasons)) {\n const reasons = (cause as { reasons: Array<{ _tag?: string; error?: unknown; defect?: unknown }> }).reasons;\n for (const reason of reasons) {\n if (reason._tag === 'Fail' && reason.error !== undefined) {\n return String(reason.error);\n }\n if (reason._tag === 'Die' && reason.defect !== undefined) {\n return String(reason.defect);\n }\n }\n return 'internal_error';\n }\n\n // Effect v3: cause has _tag directly\n if (isObjectLike(cause) && '_tag' in cause) {\n const v3Cause = cause as { _tag: string; error?: unknown; defect?: unknown };\n if (v3Cause._tag === 'Fail') {\n return String(v3Cause.error);\n }\n if (v3Cause._tag === 'Die') {\n return String(v3Cause.defect);\n }\n }\n\n return 'internal_error';\n}\n\nclass SentrySpanWrapper implements SentrySpanLike {\n public readonly [SENTRY_SPAN_SYMBOL]: true;\n public readonly _tag: 'Span';\n public readonly spanId: string;\n public readonly traceId: string;\n public readonly attributes: Map<string, unknown>;\n public readonly sampled: boolean;\n public readonly parent: Option.Option<EffectTracer.AnySpan>;\n public readonly links: Array<EffectTracer.SpanLink>;\n public status: EffectTracer.SpanStatus;\n public readonly sentrySpan: Span;\n public readonly annotations: Context.Context<never>;\n\n public constructor(\n public readonly name: string,\n parent: Option.Option<EffectTracer.AnySpan>,\n public readonly context: Context.Context<never>,\n links: ReadonlyArray<EffectTracer.SpanLink>,\n startTime: bigint,\n public readonly kind: EffectTracer.SpanKind,\n existingSpan: Span,\n ) {\n this[SENTRY_SPAN_SYMBOL] = true as const;\n this._tag = 'Span' as const;\n this.attributes = new Map<string, unknown>();\n this.parent = parent;\n this.links = [...links];\n this.sentrySpan = existingSpan;\n this.annotations = context;\n\n const spanContext = this.sentrySpan.spanContext();\n this.spanId = spanContext.spanId;\n this.traceId = spanContext.traceId;\n this.sampled = this.sentrySpan.isRecording();\n this.status = {\n _tag: 'Started',\n startTime,\n };\n }\n\n public attribute(key: string, value: unknown): void {\n if (!this.sentrySpan.isRecording()) {\n return;\n }\n\n this.sentrySpan.setAttribute(key, value as Parameters<Span['setAttribute']>[1]);\n this.attributes.set(key, value);\n }\n\n public addLinks(links: ReadonlyArray<EffectTracer.SpanLink>): void {\n this.links.push(...links);\n }\n\n public end(endTime: bigint, exit: Exit.Exit<unknown, unknown>): void {\n this.status = {\n _tag: 'Ended',\n endTime,\n exit,\n startTime: this.status.startTime,\n };\n\n if (!this.sentrySpan.isRecording()) {\n return;\n }\n\n if (Exit.isFailure(exit)) {\n const message = getErrorMessage(exit) ?? 'internal_error';\n this.sentrySpan.setStatus({ code: 2, message });\n } else {\n this.sentrySpan.setStatus({ code: 1 });\n }\n\n this.sentrySpan.end(nanosToHrTime(endTime));\n }\n\n public event(name: string, startTime: bigint, attributes?: Record<string, unknown>): void {\n if (!this.sentrySpan.isRecording()) {\n return;\n }\n\n this.sentrySpan.addEvent(name, attributes as Parameters<Span['addEvent']>[1], nanosToHrTime(startTime));\n }\n}\n\nfunction createSentrySpan(\n name: string,\n parent: Option.Option<EffectTracer.AnySpan>,\n context: Context.Context<never>,\n links: ReadonlyArray<EffectTracer.SpanLink>,\n startTime: bigint,\n kind: EffectTracer.SpanKind,\n): SentrySpanLike {\n const parentSentrySpan =\n Option.isSome(parent) && isSentrySpan(parent.value) ? parent.value.sentrySpan : (getActiveSpan() ?? null);\n\n const newSpan = startInactiveSpan({\n name,\n startTime: nanosToHrTime(startTime),\n attributes: {\n [SENTRY_OP]: deriveOp(name),\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: deriveOrigin(name),\n },\n ...(parentSentrySpan ? { parentSpan: parentSentrySpan } : {}),\n });\n\n return new SentrySpanWrapper(name, parent, context, links, startTime, kind, newSpan);\n}\n\n// Check if we're running Effect v4 by checking the Exit/Cause structure\n// In v4, causes have a 'reasons' array\n// In v3, causes have '_tag' directly on the cause object\nconst isEffectV4 = (() => {\n try {\n const testExit = Exit.fail('test') as unknown as { cause?: unknown };\n const cause = testExit.cause;\n // v4 causes have 'reasons' array, v3 causes have '_tag' directly\n if (isObjectLike(cause) && 'reasons' in cause) {\n return true;\n }\n return false;\n } catch {\n return false;\n }\n})();\n\nconst makeSentryTracerV3 = (): EffectTracer.Tracer => {\n // Effect v3 API: span(name, parent, context, links, startTime, kind)\n return EffectTracer.make({\n span(\n name: string,\n parent: Option.Option<EffectTracer.AnySpan>,\n context: Context.Context<never>,\n links: ReadonlyArray<EffectTracer.SpanLink>,\n startTime: bigint,\n kind: EffectTracer.SpanKind,\n ) {\n return createSentrySpan(name, parent, context, links, startTime, kind);\n },\n context(execution: () => unknown, fiber: { currentSpan?: EffectTracer.AnySpan }) {\n const currentSpan = fiber.currentSpan;\n if (currentSpan === undefined || !isSentrySpan(currentSpan)) {\n return execution();\n }\n return withActiveSpan(currentSpan.sentrySpan, execution);\n },\n } as unknown as EffectTracer.Tracer);\n};\n\nconst makeSentryTracerV4 = (): EffectTracer.Tracer => {\n const EFFECT_EVALUATE = '~effect/Effect/evaluate' as const;\n\n return EffectTracer.make({\n span(options) {\n return createSentrySpan(\n options.name,\n options.parent,\n options.annotations,\n options.links,\n options.startTime,\n options.kind,\n );\n },\n context(primitive, fiber) {\n const currentSpan = fiber.currentSpan;\n if (currentSpan === undefined || !isSentrySpan(currentSpan)) {\n return primitive[EFFECT_EVALUATE](fiber);\n }\n return withActiveSpan(currentSpan.sentrySpan, () => primitive[EFFECT_EVALUATE](fiber));\n },\n });\n};\n\n/**\n * Effect Layer that sets up the Sentry tracer for Effect spans.\n */\nexport const SentryEffectTracer = isEffectV4 ? makeSentryTracerV4() : makeSentryTracerV3();\n"],"names":[],"mappings":";;;;;;;AAmBA,SAAS,aAAa,IAAA,EAAsB;AAC1C,EAAA,IAAI,KAAK,UAAA,CAAW,aAAa,KAAK,IAAA,CAAK,UAAA,CAAW,aAAa,CAAA,EAAG;AACpE,IAAA,OAAO,kBAAA;AAAA,EACT;AAEA,EAAA,OAAO,sBAAA;AACT;AAOA,SAAS,SAAS,IAAA,EAAsB;AACtC,EAAA,IAAI,IAAA,CAAK,UAAA,CAAW,aAAa,CAAA,EAAG;AAClC,IAAA,OAAO,8BAAA;AAAA,EACT;AAEA,EAAA,IAAI,IAAA,CAAK,UAAA,CAAW,aAAa,CAAA,EAAG;AAClC,IAAA,OAAO,8BAAA;AAAA,EACT;AAEA,EAAA,OAAO,wBAAA;AACT;AAIA,MAAM,kBAAA,mBAAqB,MAAA,CAAO,GAAA,CAAI,2BAA2B,CAAA;AAEjE,SAAS,cAAc,KAAA,EAAuB;AAC5C,EAAA,MAAM,OAAA,GAAU,MAAA,CAAO,KAAA,GAAQ,MAAA,CAAO,GAAa,CAAC,CAAA;AACpD,EAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,KAAA,GAAQ,MAAA,CAAO,GAAa,CAAC,CAAA;AAC3D,EAAA,OAAO,CAAC,SAAS,cAAc,CAAA;AACjC;AAOA,SAAS,aAAa,IAAA,EAAoD;AACxE,EAAA,OAAO,kBAAA,IAAsB,IAAA;AAC/B;AAEA,SAAS,gBAAgB,IAAA,EAAuD;AAC9E,EAAA,IAAI,CAAC,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA,EAAG;AACzB,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,QAAQ,IAAA,CAAK,KAAA;AAGnB,EAAA,IAAI,YAAA,CAAa,KAAK,CAAA,IAAK,SAAA,IAAa,SAAS,KAAA,CAAM,OAAA,CAAS,KAAA,CAA+B,OAAO,CAAA,EAAG;AACvG,IAAA,MAAM,UAAW,KAAA,CAAmF,OAAA;AACpG,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,IAAI,MAAA,CAAO,IAAA,KAAS,MAAA,IAAU,MAAA,CAAO,UAAU,MAAA,EAAW;AACxD,QAAA,OAAO,MAAA,CAAO,OAAO,KAAK,CAAA;AAAA,MAC5B;AACA,MAAA,IAAI,MAAA,CAAO,IAAA,KAAS,KAAA,IAAS,MAAA,CAAO,WAAW,MAAA,EAAW;AACxD,QAAA,OAAO,MAAA,CAAO,OAAO,MAAM,CAAA;AAAA,MAC7B;AAAA,IACF;AACA,IAAA,OAAO,gBAAA;AAAA,EACT;AAGA,EAAA,IAAI,YAAA,CAAa,KAAK,CAAA,IAAK,MAAA,IAAU,KAAA,EAAO;AAC1C,IAAA,MAAM,OAAA,GAAU,KAAA;AAChB,IAAA,IAAI,OAAA,CAAQ,SAAS,MAAA,EAAQ;AAC3B,MAAA,OAAO,MAAA,CAAO,QAAQ,KAAK,CAAA;AAAA,IAC7B;AACA,IAAA,IAAI,OAAA,CAAQ,SAAS,KAAA,EAAO;AAC1B,MAAA,OAAO,MAAA,CAAO,QAAQ,MAAM,CAAA;AAAA,IAC9B;AAAA,EACF;AAEA,EAAA,OAAO,gBAAA;AACT;AAEA,MAAM,iBAAA,CAA4C;AAAA,EAazC,YACW,IAAA,EAChB,MAAA,EACgB,SAChB,KAAA,EACA,SAAA,EACgB,MAChB,YAAA,EACA;AAPgB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAEA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAGA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAGhB,IAAA,IAAA,CAAK,kBAAkB,CAAA,GAAI,IAAA;AAC3B,IAAA,IAAA,CAAK,IAAA,GAAO,MAAA;AACZ,IAAA,IAAA,CAAK,UAAA,uBAAiB,GAAA,EAAqB;AAC3C,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,KAAA,GAAQ,CAAC,GAAG,KAAK,CAAA;AACtB,IAAA,IAAA,CAAK,UAAA,GAAa,YAAA;AAClB,IAAA,IAAA,CAAK,WAAA,GAAc,OAAA;AAEnB,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,UAAA,CAAW,WAAA,EAAY;AAChD,IAAA,IAAA,CAAK,SAAS,WAAA,CAAY,MAAA;AAC1B,IAAA,IAAA,CAAK,UAAU,WAAA,CAAY,OAAA;AAC3B,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA,CAAK,UAAA,CAAW,WAAA,EAAY;AAC3C,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,IAAA,EAAM,SAAA;AAAA,MACN;AAAA,KACF;AAAA,EACF;AAAA,EAEO,SAAA,CAAU,KAAa,KAAA,EAAsB;AAClD,IAAA,IAAI,CAAC,IAAA,CAAK,UAAA,CAAW,WAAA,EAAY,EAAG;AAClC,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,UAAA,CAAW,YAAA,CAAa,GAAA,EAAK,KAA4C,CAAA;AAC9E,IAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,GAAA,EAAK,KAAK,CAAA;AAAA,EAChC;AAAA,EAEO,SAAS,KAAA,EAAmD;AACjE,IAAA,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAG,KAAK,CAAA;AAAA,EAC1B;AAAA,EAEO,GAAA,CAAI,SAAiB,IAAA,EAAyC;AACnE,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,IAAA,EAAM,OAAA;AAAA,MACN,OAAA;AAAA,MACA,IAAA;AAAA,MACA,SAAA,EAAW,KAAK,MAAA,CAAO;AAAA,KACzB;AAEA,IAAA,IAAI,CAAC,IAAA,CAAK,UAAA,CAAW,WAAA,EAAY,EAAG;AAClC,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA,EAAG;AACxB,MAAA,MAAM,OAAA,GAAU,eAAA,CAAgB,IAAI,CAAA,IAAK,gBAAA;AACzC,MAAA,IAAA,CAAK,WAAW,SAAA,CAAU,EAAE,IAAA,EAAM,CAAA,EAAG,SAAS,CAAA;AAAA,IAChD,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,UAAA,CAAW,SAAA,CAAU,EAAE,IAAA,EAAM,GAAG,CAAA;AAAA,IACvC;AAEA,IAAA,IAAA,CAAK,UAAA,CAAW,GAAA,CAAI,aAAA,CAAc,OAAO,CAAC,CAAA;AAAA,EAC5C;AAAA,EAEO,KAAA,CAAM,IAAA,EAAc,SAAA,EAAmB,UAAA,EAA4C;AACxF,IAAA,IAAI,CAAC,IAAA,CAAK,UAAA,CAAW,WAAA,EAAY,EAAG;AAClC,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,CAAK,WAAW,QAAA,CAAS,IAAA,EAAM,UAAA,EAA+C,aAAA,CAAc,SAAS,CAAC,CAAA;AAAA,EACxG;AACF;AAEA,SAAS,iBACP,IAAA,EACA,MAAA,EACA,OAAA,EACA,KAAA,EACA,WACA,IAAA,EACgB;AAChB,EAAA,MAAM,gBAAA,GACJ,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA,IAAK,YAAA,CAAa,MAAA,CAAO,KAAK,CAAA,GAAI,MAAA,CAAO,KAAA,CAAM,UAAA,GAAc,eAAc,IAAK,IAAA;AAEtG,EAAA,MAAM,UAAU,iBAAA,CAAkB;AAAA,IAChC,IAAA;AAAA,IACA,SAAA,EAAW,cAAc,SAAS,CAAA;AAAA,IAClC,UAAA,EAAY;AAAA,MACV,CAAC,SAAS,GAAG,QAAA,CAAS,IAAI,CAAA;AAAA,MAC1B,CAAC,gCAAgC,GAAG,YAAA,CAAa,IAAI;AAAA,KACvD;AAAA,IACA,GAAI,gBAAA,GAAmB,EAAE,UAAA,EAAY,gBAAA,KAAqB;AAAC,GAC5D,CAAA;AAED,EAAA,OAAO,IAAI,kBAAkB,IAAA,EAAM,MAAA,EAAQ,SAAS,KAAA,EAAO,SAAA,EAAW,MAAM,OAAO,CAAA;AACrF;AAKA,MAAM,cAAc,MAAM;AACxB,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA;AACjC,IAAA,MAAM,QAAQ,QAAA,CAAS,KAAA;AAEvB,IAAA,IAAI,YAAA,CAAa,KAAK,CAAA,IAAK,SAAA,IAAa,KAAA,EAAO;AAC7C,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAO,KAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF,CAAA,GAAG;AAEH,MAAM,qBAAqB,MAA2B;AAEpD,EAAA,OAAO,aAAa,IAAA,CAAK;AAAA,IACvB,KACE,IAAA,EACA,MAAA,EACA,OAAA,EACA,KAAA,EACA,WACA,IAAA,EACA;AACA,MAAA,OAAO,iBAAiB,IAAA,EAAM,MAAA,EAAQ,OAAA,EAAS,KAAA,EAAO,WAAW,IAAI,CAAA;AAAA,IACvE,CAAA;AAAA,IACA,OAAA,CAAQ,WAA0B,KAAA,EAA+C;AAC/E,MAAA,MAAM,cAAc,KAAA,CAAM,WAAA;AAC1B,MAAA,IAAI,WAAA,KAAgB,MAAA,IAAa,CAAC,YAAA,CAAa,WAAW,CAAA,EAAG;AAC3D,QAAA,OAAO,SAAA,EAAU;AAAA,MACnB;AACA,MAAA,OAAO,cAAA,CAAe,WAAA,CAAY,UAAA,EAAY,SAAS,CAAA;AAAA,IACzD;AAAA,GACiC,CAAA;AACrC,CAAA;AAEA,MAAM,qBAAqB,MAA2B;AACpD,EAAA,MAAM,eAAA,GAAkB,yBAAA;AAExB,EAAA,OAAO,aAAa,IAAA,CAAK;AAAA,IACvB,KAAK,OAAA,EAAS;AACZ,MAAA,OAAO,gBAAA;AAAA,QACL,OAAA,CAAQ,IAAA;AAAA,QACR,OAAA,CAAQ,MAAA;AAAA,QACR,OAAA,CAAQ,WAAA;AAAA,QACR,OAAA,CAAQ,KAAA;AAAA,QACR,OAAA,CAAQ,SAAA;AAAA,QACR,OAAA,CAAQ;AAAA,OACV;AAAA,IACF,CAAA;AAAA,IACA,OAAA,CAAQ,WAAW,KAAA,EAAO;AACxB,MAAA,MAAM,cAAc,KAAA,CAAM,WAAA;AAC1B,MAAA,IAAI,WAAA,KAAgB,MAAA,IAAa,CAAC,YAAA,CAAa,WAAW,CAAA,EAAG;AAC3D,QAAA,OAAO,SAAA,CAAU,eAAe,CAAA,CAAE,KAAK,CAAA;AAAA,MACzC;AACA,MAAA,OAAO,cAAA,CAAe,YAAY,UAAA,EAAY,MAAM,UAAU,eAAe,CAAA,CAAE,KAAK,CAAC,CAAA;AAAA,IACvF;AAAA,GACD,CAAA;AACH,CAAA;AAKO,MAAM,kBAAA,GAAqB,UAAA,GAAa,kBAAA,EAAmB,GAAI,kBAAA;;;;"}
|
|
1
|
+
{"version":3,"file":"tracer.js","sources":["../../src/tracer.ts"],"sourcesContent":["import { SENTRY_OP } from '@sentry/conventions/attributes';\nimport { FUNCTION, HTTP_CLIENT, HTTP_SERVER } from '@sentry/conventions/op';\nimport type { Span, StartSpanOptions } from '@sentry/core';\nimport { isObjectLike, getActiveSpan, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN, withActiveSpan } from '@sentry/core';\nimport type * as Context from 'effect/Context';\nimport * as Exit from 'effect/Exit';\nimport * as Option from 'effect/Option';\nimport * as EffectTracer from 'effect/Tracer';\n\nfunction deriveOrigin(name: string): string {\n if (name.startsWith('http.server') || name.startsWith('http.client')) {\n return 'auto.http.effect';\n }\n\n return 'auto.function.effect';\n}\n\n/**\n * Effect span names are chosen by user code, so the name is the only signal available. `@effect/platform`\n * names its HTTP spans `http.server`/`http.client`, which map onto the matching Sentry ops; everything\n * else is arbitrary user work and falls back to `function`.\n */\nfunction deriveOp(name: string): string {\n if (name.startsWith('http.server')) {\n return HTTP_SERVER;\n }\n\n if (name.startsWith('http.client')) {\n return HTTP_CLIENT;\n }\n\n return FUNCTION;\n}\n\ntype HrTime = [number, number];\n\nconst SENTRY_SPAN_SYMBOL = Symbol.for('@sentry/effect.SentrySpan');\n\nfunction nanosToHrTime(nanos: bigint): HrTime {\n const seconds = Number(nanos / BigInt(1_000_000_000));\n const remainingNanos = Number(nanos % BigInt(1_000_000_000));\n return [seconds, remainingNanos];\n}\n\ninterface SentrySpanLike extends EffectTracer.Span {\n readonly [SENTRY_SPAN_SYMBOL]: true;\n readonly sentrySpan: Span;\n}\n\nfunction isSentrySpan(span: EffectTracer.AnySpan): span is SentrySpanLike {\n return SENTRY_SPAN_SYMBOL in span;\n}\n\nfunction getErrorMessage(exit: Exit.Exit<unknown, unknown>): string | undefined {\n if (!Exit.isFailure(exit)) {\n return undefined;\n }\n\n const cause = exit.cause as unknown;\n\n // Effect v4: cause.reasons is an array of Reason objects\n if (isObjectLike(cause) && 'reasons' in cause && Array.isArray((cause as { reasons: unknown }).reasons)) {\n const reasons = (cause as { reasons: Array<{ _tag?: string; error?: unknown; defect?: unknown }> }).reasons;\n for (const reason of reasons) {\n if (reason._tag === 'Fail' && reason.error !== undefined) {\n return String(reason.error);\n }\n if (reason._tag === 'Die' && reason.defect !== undefined) {\n return String(reason.defect);\n }\n }\n return 'internal_error';\n }\n\n // Effect v3: cause has _tag directly\n if (isObjectLike(cause) && '_tag' in cause) {\n const v3Cause = cause as { _tag: string; error?: unknown; defect?: unknown };\n if (v3Cause._tag === 'Fail') {\n return String(v3Cause.error);\n }\n if (v3Cause._tag === 'Die') {\n return String(v3Cause.defect);\n }\n }\n\n return 'internal_error';\n}\n\nclass SentrySpanWrapper implements SentrySpanLike {\n public readonly [SENTRY_SPAN_SYMBOL]: true;\n public readonly _tag: 'Span';\n public readonly spanId: string;\n public readonly traceId: string;\n public readonly attributes: Map<string, unknown>;\n public readonly sampled: boolean;\n public readonly parent: Option.Option<EffectTracer.AnySpan>;\n public readonly links: Array<EffectTracer.SpanLink>;\n public status: EffectTracer.SpanStatus;\n public readonly sentrySpan: Span;\n public readonly annotations: Context.Context<never>;\n\n public constructor(\n public readonly name: string,\n parent: Option.Option<EffectTracer.AnySpan>,\n public readonly context: Context.Context<never>,\n links: ReadonlyArray<EffectTracer.SpanLink>,\n startTime: bigint,\n public readonly kind: EffectTracer.SpanKind,\n existingSpan: Span,\n ) {\n this[SENTRY_SPAN_SYMBOL] = true as const;\n this._tag = 'Span' as const;\n this.attributes = new Map<string, unknown>();\n this.parent = parent;\n this.links = [...links];\n this.sentrySpan = existingSpan;\n this.annotations = context;\n\n const spanContext = this.sentrySpan.spanContext();\n this.spanId = spanContext.spanId;\n this.traceId = spanContext.traceId;\n this.sampled = this.sentrySpan.isRecording();\n this.status = {\n _tag: 'Started',\n startTime,\n };\n }\n\n public attribute(key: string, value: unknown): void {\n if (!this.sentrySpan.isRecording()) {\n return;\n }\n\n this.sentrySpan.setAttribute(key, value as Parameters<Span['setAttribute']>[1]);\n this.attributes.set(key, value);\n }\n\n public addLinks(links: ReadonlyArray<EffectTracer.SpanLink>): void {\n this.links.push(...links);\n }\n\n public end(endTime: bigint, exit: Exit.Exit<unknown, unknown>): void {\n this.status = {\n _tag: 'Ended',\n endTime,\n exit,\n startTime: this.status.startTime,\n };\n\n if (!this.sentrySpan.isRecording()) {\n return;\n }\n\n if (Exit.isFailure(exit)) {\n const message = getErrorMessage(exit) ?? 'internal_error';\n this.sentrySpan.setStatus({ code: 2, message });\n } else {\n this.sentrySpan.setStatus({ code: 1 });\n }\n\n this.sentrySpan.end(nanosToHrTime(endTime));\n }\n\n public event(name: string, startTime: bigint, attributes?: Record<string, unknown>): void {\n if (!this.sentrySpan.isRecording()) {\n return;\n }\n\n this.sentrySpan.addEvent(name, attributes as Parameters<Span['addEvent']>[1], nanosToHrTime(startTime));\n }\n}\n\n/**\n * The client and the server entry differ only in which `startInactiveSpan` they hand to\n * {@link makeSentryTracer}: the browser one from `@sentry/core/browser`, which installs the span\n * streaming integration on first use, and the plain one from `@sentry/core`, which does not. Nothing\n * else about the tracer is platform-specific.\n */\nexport type StartInactiveSpan = (options: StartSpanOptions) => Span;\n\nfunction createSentrySpan(\n startInactiveSpan: StartInactiveSpan,\n name: string,\n parent: Option.Option<EffectTracer.AnySpan>,\n context: Context.Context<never>,\n links: ReadonlyArray<EffectTracer.SpanLink>,\n startTime: bigint,\n kind: EffectTracer.SpanKind,\n): SentrySpanLike {\n const parentSentrySpan =\n Option.isSome(parent) && isSentrySpan(parent.value) ? parent.value.sentrySpan : (getActiveSpan() ?? null);\n\n const newSpan = startInactiveSpan({\n name,\n startTime: nanosToHrTime(startTime),\n attributes: {\n [SENTRY_OP]: deriveOp(name),\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: deriveOrigin(name),\n },\n ...(parentSentrySpan ? { parentSpan: parentSentrySpan } : {}),\n });\n\n return new SentrySpanWrapper(name, parent, context, links, startTime, kind, newSpan);\n}\n\n// Check if we're running Effect v4 by checking the Exit/Cause structure\n// In v4, causes have a 'reasons' array\n// In v3, causes have '_tag' directly on the cause object\nconst isEffectV4 = (() => {\n try {\n const testExit = Exit.fail('test') as unknown as { cause?: unknown };\n const cause = testExit.cause;\n // v4 causes have 'reasons' array, v3 causes have '_tag' directly\n if (isObjectLike(cause) && 'reasons' in cause) {\n return true;\n }\n return false;\n } catch {\n return false;\n }\n})();\n\nconst makeSentryTracerV3 = (startInactiveSpan: StartInactiveSpan): EffectTracer.Tracer => {\n // Effect v3 API: span(name, parent, context, links, startTime, kind)\n return EffectTracer.make({\n span(\n name: string,\n parent: Option.Option<EffectTracer.AnySpan>,\n context: Context.Context<never>,\n links: ReadonlyArray<EffectTracer.SpanLink>,\n startTime: bigint,\n kind: EffectTracer.SpanKind,\n ) {\n return createSentrySpan(startInactiveSpan, name, parent, context, links, startTime, kind);\n },\n context(execution: () => unknown, fiber: { currentSpan?: EffectTracer.AnySpan }) {\n const currentSpan = fiber.currentSpan;\n if (currentSpan === undefined || !isSentrySpan(currentSpan)) {\n return execution();\n }\n return withActiveSpan(currentSpan.sentrySpan, execution);\n },\n } as unknown as EffectTracer.Tracer);\n};\n\nconst makeSentryTracerV4 = (startInactiveSpan: StartInactiveSpan): EffectTracer.Tracer => {\n const EFFECT_EVALUATE = '~effect/Effect/evaluate' as const;\n\n return EffectTracer.make({\n span(options) {\n return createSentrySpan(\n startInactiveSpan,\n options.name,\n options.parent,\n options.annotations,\n options.links,\n options.startTime,\n options.kind,\n );\n },\n context(primitive, fiber) {\n const currentSpan = fiber.currentSpan;\n if (currentSpan === undefined || !isSentrySpan(currentSpan)) {\n return primitive[EFFECT_EVALUATE](fiber);\n }\n return withActiveSpan(currentSpan.sentrySpan, () => primitive[EFFECT_EVALUATE](fiber));\n },\n });\n};\n\n/**\n * Creates an Effect `Tracer` that records Effect spans as Sentry spans.\n *\n * Use the `SentryEffectTracer` exported from `@sentry/effect` rather than calling this directly — the\n * client and server entries each bind the right `startInactiveSpan` for their platform.\n */\nexport function makeSentryTracer(startInactiveSpan: StartInactiveSpan): EffectTracer.Tracer {\n return isEffectV4 ? makeSentryTracerV4(startInactiveSpan) : makeSentryTracerV3(startInactiveSpan);\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Effect `Tracer` that records Effect spans as Sentry spans in browser clients.
|
|
3
|
+
*
|
|
4
|
+
* Wrapped in an arrow rather than passed by reference so the import binding is read per span. That
|
|
5
|
+
* keeps the browser variant substitutable (mocks, bundler interop) exactly as it was when the tracer
|
|
6
|
+
* called it directly.
|
|
7
|
+
*/
|
|
8
|
+
export declare const SentryEffectTracer: import("effect/Tracer").Tracer;
|
|
9
|
+
//# sourceMappingURL=tracer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tracer.d.ts","sourceRoot":"","sources":["../../../src/client/tracer.ts"],"names":[],"mappings":"AAGA;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,gCAA0D,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export * from '@sentry/browser';
|
|
2
2
|
export { effectLayer, init } from './client/index';
|
|
3
3
|
export type { EffectClientLayerOptions } from './client/index';
|
|
4
|
-
export { SentryEffectTracer } from './tracer';
|
|
4
|
+
export { SentryEffectTracer } from './client/tracer';
|
|
5
5
|
export { SentryEffectLogger } from './logger';
|
|
6
6
|
export { SentryEffectMetricsLayer } from './metrics';
|
|
7
7
|
//# sourceMappingURL=index.client.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.client.d.ts","sourceRoot":"","sources":["../../src/index.client.ts"],"names":[],"mappings":"AAGA,cAAc,iBAAiB,CAAC;AAEhC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACnD,YAAY,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAE/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"index.client.d.ts","sourceRoot":"","sources":["../../src/index.client.ts"],"names":[],"mappings":"AAGA,cAAc,iBAAiB,CAAC;AAEhC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACnD,YAAY,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAE/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,wBAAwB,EAAE,MAAM,WAAW,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export * from '@sentry/node';
|
|
2
2
|
export { effectLayer, init } from './server/index';
|
|
3
3
|
export type { EffectServerLayerOptions } from './server/index';
|
|
4
|
-
export { SentryEffectTracer } from './tracer';
|
|
4
|
+
export { SentryEffectTracer } from './server/tracer';
|
|
5
5
|
export { SentryEffectLogger } from './logger';
|
|
6
6
|
export { SentryEffectMetricsLayer } from './metrics';
|
|
7
7
|
//# sourceMappingURL=index.server.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.server.d.ts","sourceRoot":"","sources":["../../src/index.server.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAE7B,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACnD,YAAY,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAE/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"index.server.d.ts","sourceRoot":"","sources":["../../src/index.server.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAE7B,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACnD,YAAY,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAE/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,wBAAwB,EAAE,MAAM,WAAW,CAAC"}
|
|
@@ -11,6 +11,10 @@ export declare function init(options: Options | clientSdk.BrowserOptions | serve
|
|
|
11
11
|
export declare const linkedErrorsIntegration: typeof clientSdk.linkedErrorsIntegration;
|
|
12
12
|
export declare const contextLinesIntegration: typeof clientSdk.contextLinesIntegration;
|
|
13
13
|
export declare const spanStreamingIntegration: typeof clientSdk.spanStreamingIntegration;
|
|
14
|
+
export declare const SentryEffectTracer: typeof clientSdk.SentryEffectTracer;
|
|
15
|
+
export declare const startSpan: typeof clientSdk.startSpan;
|
|
16
|
+
export declare const startSpanManual: typeof clientSdk.startSpanManual;
|
|
17
|
+
export declare const startInactiveSpan: typeof clientSdk.startInactiveSpan;
|
|
14
18
|
export declare const withStaticSpan: typeof clientSdk.withStaticSpan;
|
|
15
19
|
export declare const withStreamedSpan: typeof clientSdk.withStreamedSpan;
|
|
16
20
|
export declare const getDefaultIntegrations: (options: Options) => Integration[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.types.d.ts","sourceRoot":"","sources":["../../src/index.types.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC9E,OAAO,KAAK,KAAK,WAAW,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,KAAK,SAAS,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,KAAK,SAAS,MAAM,gBAAgB,CAAC;AAEjD,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAE/B,YAAY,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC/D,YAAY,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAE/D,MAAM,CAAC,OAAO,UAAU,WAAW,CACjC,OAAO,EAAE,SAAS,CAAC,wBAAwB,GAAG,SAAS,CAAC,wBAAwB,GAC/E,WAAW,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AAE1C,MAAM,CAAC,OAAO,UAAU,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,SAAS,CAAC,cAAc,GAAG,SAAS,CAAC,WAAW,GAAG,MAAM,GAAG,SAAS,CAAC;AACtH,MAAM,CAAC,OAAO,CAAC,MAAM,uBAAuB,EAAE,OAAO,SAAS,CAAC,uBAAuB,CAAC;AACvF,MAAM,CAAC,OAAO,CAAC,MAAM,uBAAuB,EAAE,OAAO,SAAS,CAAC,uBAAuB,CAAC;AACvF,MAAM,CAAC,OAAO,CAAC,MAAM,wBAAwB,EAAE,OAAO,SAAS,CAAC,wBAAwB,CAAC;AACzF,MAAM,CAAC,OAAO,CAAC,MAAM,cAAc,EAAE,OAAO,SAAS,CAAC,cAAc,CAAC;AAErE,MAAM,CAAC,OAAO,CAAC,MAAM,gBAAgB,EAAE,OAAO,SAAS,CAAC,gBAAgB,CAAC;AACzE,MAAM,CAAC,OAAO,CAAC,MAAM,sBAAsB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,WAAW,EAAE,CAAC;AACjF,MAAM,CAAC,OAAO,CAAC,MAAM,kBAAkB,EAAE,WAAW,CAAC;AACrD,MAAM,CAAC,OAAO,CAAC,MAAM,MAAM,EAAE,OAAO,SAAS,CAAC,MAAM,GAAG,OAAO,SAAS,CAAC,MAAM,CAAC;AAI/E,MAAM,CAAC,OAAO,CAAC,MAAM,uBAAuB,EAAE,OAAO,SAAS,CAAC,uBAAuB,CAAC;AACvF,MAAM,CAAC,OAAO,CAAC,MAAM,gCAAgC,EAAE,OAAO,SAAS,CAAC,gCAAgC,CAAC;AACzG,MAAM,CAAC,OAAO,CAAC,MAAM,sBAAsB,EAAE,OAAO,SAAS,CAAC,sBAAsB,CAAC;AACrF,MAAM,CAAC,OAAO,CAAC,MAAM,0BAA0B,EAAE,OAAO,SAAS,CAAC,0BAA0B,CAAC;AAC7F,MAAM,CAAC,OAAO,CAAC,MAAM,kBAAkB,EAAE,OAAO,SAAS,CAAC,kBAAkB,CAAC;AAC7E,MAAM,CAAC,OAAO,CAAC,MAAM,qBAAqB,EAAE,OAAO,SAAS,CAAC,qBAAqB,CAAC;AACnF,MAAM,CAAC,OAAO,CAAC,MAAM,kBAAkB,EAAE,OAAO,SAAS,CAAC,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.types.d.ts","sourceRoot":"","sources":["../../src/index.types.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC9E,OAAO,KAAK,KAAK,WAAW,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,KAAK,SAAS,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,KAAK,SAAS,MAAM,gBAAgB,CAAC;AAEjD,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAE/B,YAAY,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC/D,YAAY,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAE/D,MAAM,CAAC,OAAO,UAAU,WAAW,CACjC,OAAO,EAAE,SAAS,CAAC,wBAAwB,GAAG,SAAS,CAAC,wBAAwB,GAC/E,WAAW,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AAE1C,MAAM,CAAC,OAAO,UAAU,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,SAAS,CAAC,cAAc,GAAG,SAAS,CAAC,WAAW,GAAG,MAAM,GAAG,SAAS,CAAC;AACtH,MAAM,CAAC,OAAO,CAAC,MAAM,uBAAuB,EAAE,OAAO,SAAS,CAAC,uBAAuB,CAAC;AACvF,MAAM,CAAC,OAAO,CAAC,MAAM,uBAAuB,EAAE,OAAO,SAAS,CAAC,uBAAuB,CAAC;AACvF,MAAM,CAAC,OAAO,CAAC,MAAM,wBAAwB,EAAE,OAAO,SAAS,CAAC,wBAAwB,CAAC;AACzF,MAAM,CAAC,OAAO,CAAC,MAAM,kBAAkB,EAAE,OAAO,SAAS,CAAC,kBAAkB,CAAC;AAC7E,MAAM,CAAC,OAAO,CAAC,MAAM,SAAS,EAAE,OAAO,SAAS,CAAC,SAAS,CAAC;AAC3D,MAAM,CAAC,OAAO,CAAC,MAAM,eAAe,EAAE,OAAO,SAAS,CAAC,eAAe,CAAC;AACvE,MAAM,CAAC,OAAO,CAAC,MAAM,iBAAiB,EAAE,OAAO,SAAS,CAAC,iBAAiB,CAAC;AAC3E,MAAM,CAAC,OAAO,CAAC,MAAM,cAAc,EAAE,OAAO,SAAS,CAAC,cAAc,CAAC;AAErE,MAAM,CAAC,OAAO,CAAC,MAAM,gBAAgB,EAAE,OAAO,SAAS,CAAC,gBAAgB,CAAC;AACzE,MAAM,CAAC,OAAO,CAAC,MAAM,sBAAsB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,WAAW,EAAE,CAAC;AACjF,MAAM,CAAC,OAAO,CAAC,MAAM,kBAAkB,EAAE,WAAW,CAAC;AACrD,MAAM,CAAC,OAAO,CAAC,MAAM,MAAM,EAAE,OAAO,SAAS,CAAC,MAAM,GAAG,OAAO,SAAS,CAAC,MAAM,CAAC;AAI/E,MAAM,CAAC,OAAO,CAAC,MAAM,uBAAuB,EAAE,OAAO,SAAS,CAAC,uBAAuB,CAAC;AACvF,MAAM,CAAC,OAAO,CAAC,MAAM,gCAAgC,EAAE,OAAO,SAAS,CAAC,gCAAgC,CAAC;AACzG,MAAM,CAAC,OAAO,CAAC,MAAM,sBAAsB,EAAE,OAAO,SAAS,CAAC,sBAAsB,CAAC;AACrF,MAAM,CAAC,OAAO,CAAC,MAAM,0BAA0B,EAAE,OAAO,SAAS,CAAC,0BAA0B,CAAC;AAC7F,MAAM,CAAC,OAAO,CAAC,MAAM,kBAAkB,EAAE,OAAO,SAAS,CAAC,kBAAkB,CAAC;AAC7E,MAAM,CAAC,OAAO,CAAC,MAAM,qBAAqB,EAAE,OAAO,SAAS,CAAC,qBAAqB,CAAC;AACnF,MAAM,CAAC,OAAO,CAAC,MAAM,kBAAkB,EAAE,OAAO,SAAS,CAAC,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Effect `Tracer` that records Effect spans as Sentry spans on the server.
|
|
3
|
+
*
|
|
4
|
+
* Deliberately the plain `@sentry/core` variant, not `@sentry/core/browser`: the browser one guards
|
|
5
|
+
* every span start with a `getClient()` lookup to lazily install `spanStreamingIntegration`, which on
|
|
6
|
+
* the server is pure overhead — `ServerRuntimeClient` already installs it eagerly.
|
|
7
|
+
*
|
|
8
|
+
* See `./client/tracer.ts` for why the call is wrapped in an arrow.
|
|
9
|
+
*/
|
|
10
|
+
export declare const SentryEffectTracer: import("effect/Tracer").Tracer;
|
|
11
|
+
//# sourceMappingURL=tracer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tracer.d.ts","sourceRoot":"","sources":["../../../src/server/tracer.ts"],"names":[],"mappings":"AAGA;;;;;;;;GAQG;AACH,eAAO,MAAM,kBAAkB,gCAA0D,CAAC"}
|
package/build/types/tracer.d.ts
CHANGED
|
@@ -1,6 +1,17 @@
|
|
|
1
|
+
import type { Span, StartSpanOptions } from '@sentry/core';
|
|
1
2
|
import * as EffectTracer from 'effect/Tracer';
|
|
2
3
|
/**
|
|
3
|
-
*
|
|
4
|
+
* The client and the server entry differ only in which `startInactiveSpan` they hand to
|
|
5
|
+
* {@link makeSentryTracer}: the browser one from `@sentry/core/browser`, which installs the span
|
|
6
|
+
* streaming integration on first use, and the plain one from `@sentry/core`, which does not. Nothing
|
|
7
|
+
* else about the tracer is platform-specific.
|
|
4
8
|
*/
|
|
5
|
-
export
|
|
9
|
+
export type StartInactiveSpan = (options: StartSpanOptions) => Span;
|
|
10
|
+
/**
|
|
11
|
+
* Creates an Effect `Tracer` that records Effect spans as Sentry spans.
|
|
12
|
+
*
|
|
13
|
+
* Use the `SentryEffectTracer` exported from `@sentry/effect` rather than calling this directly — the
|
|
14
|
+
* client and server entries each bind the right `startInactiveSpan` for their platform.
|
|
15
|
+
*/
|
|
16
|
+
export declare function makeSentryTracer(startInactiveSpan: StartInactiveSpan): EffectTracer.Tracer;
|
|
6
17
|
//# sourceMappingURL=tracer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tracer.d.ts","sourceRoot":"","sources":["../../src/tracer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tracer.d.ts","sourceRoot":"","sources":["../../src/tracer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAK3D,OAAO,KAAK,YAAY,MAAM,eAAe,CAAC;AAqK9C;;;;;GAKG;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,EAAE,gBAAgB,KAAK,IAAI,CAAC;AA4FpE;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,iBAAiB,EAAE,iBAAiB,GAAG,YAAY,CAAC,MAAM,CAE1F"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sentry/effect",
|
|
3
|
-
"version": "11.0.0-alpha.
|
|
3
|
+
"version": "11.0.0-alpha.2",
|
|
4
4
|
"description": "Official Sentry SDK for Effect",
|
|
5
5
|
"repository": "git://github.com/getsentry/sentry-javascript.git",
|
|
6
6
|
"homepage": "https://github.com/getsentry/sentry-javascript/tree/master/packages/effect",
|
|
@@ -44,10 +44,10 @@
|
|
|
44
44
|
"access": "public"
|
|
45
45
|
},
|
|
46
46
|
"dependencies": {
|
|
47
|
-
"@sentry/browser": "11.0.0-alpha.
|
|
48
|
-
"@sentry/conventions": "^0.
|
|
49
|
-
"@sentry/core": "11.0.0-alpha.
|
|
50
|
-
"@sentry/node": "11.0.0-alpha.
|
|
47
|
+
"@sentry/browser": "11.0.0-alpha.2",
|
|
48
|
+
"@sentry/conventions": "^0.20.0",
|
|
49
|
+
"@sentry/core": "11.0.0-alpha.2",
|
|
50
|
+
"@sentry/node": "11.0.0-alpha.2"
|
|
51
51
|
},
|
|
52
52
|
"peerDependencies": {
|
|
53
53
|
"effect": "^3.0.0 || ^4.0.0-beta.50"
|
|
@@ -74,6 +74,7 @@
|
|
|
74
74
|
"clean": "rimraf build coverage sentry-effect-*.tgz",
|
|
75
75
|
"lint:fix": "oxlint . --fix --type-aware",
|
|
76
76
|
"lint": "oxlint . --type-aware",
|
|
77
|
+
"lint:types": "oxlint src --type-aware --type-check",
|
|
77
78
|
"test": "vitest run",
|
|
78
79
|
"test:watch": "vitest --watch",
|
|
79
80
|
"yalc:publish": "yalc publish --push --sig"
|