@sentry/effect 11.5.0 → 11.6.0
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/tracer.js +26 -21
- package/build/cjs/tracer.js.map +1 -1
- package/build/esm/package.json +1 -1
- package/build/esm/tracer.js +27 -22
- package/build/esm/tracer.js.map +1 -1
- package/build/types/tracer.d.ts.map +1 -1
- package/package.json +4 -4
package/build/cjs/tracer.js
CHANGED
|
@@ -9,12 +9,6 @@ const Layer = require('effect/Layer');
|
|
|
9
9
|
const Option = require('effect/Option');
|
|
10
10
|
const EffectTracer = require('effect/Tracer');
|
|
11
11
|
|
|
12
|
-
function deriveOrigin(name) {
|
|
13
|
-
if (name.startsWith("http.server") || name.startsWith("http.client")) {
|
|
14
|
-
return "auto.http.effect";
|
|
15
|
-
}
|
|
16
|
-
return void 0;
|
|
17
|
-
}
|
|
18
12
|
const EFFECT_SPAN_SYMBOL = /* @__PURE__ */ Symbol.for("@sentry/effect.EffectSpan");
|
|
19
13
|
function markEffectSpan(span) {
|
|
20
14
|
core.addNonEnumerableProperty(span, EFFECT_SPAN_SYMBOL, true);
|
|
@@ -22,21 +16,17 @@ function markEffectSpan(span) {
|
|
|
22
16
|
function isEffectSpan(span) {
|
|
23
17
|
return span[EFFECT_SPAN_SYMBOL] === true;
|
|
24
18
|
}
|
|
25
|
-
|
|
26
|
-
|
|
19
|
+
const HTTP_METHODS = /* @__PURE__ */ new Set(["GET", "HEAD", "POST", "PUT", "DELETE", "CONNECT", "OPTIONS", "TRACE", "PATCH"]);
|
|
20
|
+
function deriveOp(name, kind) {
|
|
21
|
+
if (name.startsWith("http.server") || kind === "server" && HTTP_METHODS.has(name)) {
|
|
27
22
|
return op.HTTP_SERVER;
|
|
28
23
|
}
|
|
29
|
-
if (name.startsWith("http.client")) {
|
|
24
|
+
if (name.startsWith("http.client") || kind === "client" && HTTP_METHODS.has(name)) {
|
|
30
25
|
return op.HTTP_CLIENT;
|
|
31
26
|
}
|
|
32
27
|
return void 0;
|
|
33
28
|
}
|
|
34
29
|
const SENTRY_SPAN_SYMBOL = /* @__PURE__ */ Symbol.for("@sentry/effect.SentrySpan");
|
|
35
|
-
function nanosToHrTime(nanos) {
|
|
36
|
-
const seconds = Number(nanos / BigInt(1e9));
|
|
37
|
-
const remainingNanos = Number(nanos % BigInt(1e9));
|
|
38
|
-
return [seconds, remainingNanos];
|
|
39
|
-
}
|
|
40
30
|
function isSentrySpan(span) {
|
|
41
31
|
return SENTRY_SPAN_SYMBOL in span;
|
|
42
32
|
}
|
|
@@ -69,7 +59,7 @@ function getErrorMessage(exit) {
|
|
|
69
59
|
return "internal_error";
|
|
70
60
|
}
|
|
71
61
|
class SentrySpanWrapper {
|
|
72
|
-
constructor(name, parent, context, links, startTime, kind, existingSpan) {
|
|
62
|
+
constructor(name, parent, context, links, startTime, kind, existingSpan, sentryStartTime) {
|
|
73
63
|
this.name = name;
|
|
74
64
|
this.context = context;
|
|
75
65
|
this.kind = kind;
|
|
@@ -80,6 +70,7 @@ class SentrySpanWrapper {
|
|
|
80
70
|
this.links = [...links];
|
|
81
71
|
this.sentrySpan = existingSpan;
|
|
82
72
|
this.annotations = context;
|
|
73
|
+
this._sentryStartTime = sentryStartTime;
|
|
83
74
|
const spanContext = this.sentrySpan.spanContext();
|
|
84
75
|
this.spanId = spanContext.spanId;
|
|
85
76
|
this.traceId = spanContext.traceId;
|
|
@@ -115,13 +106,26 @@ class SentrySpanWrapper {
|
|
|
115
106
|
} else {
|
|
116
107
|
this.sentrySpan.setStatus({ code: 1 });
|
|
117
108
|
}
|
|
118
|
-
this.sentrySpan.end(
|
|
109
|
+
this.sentrySpan.end(this._toSentryTime(endTime));
|
|
119
110
|
}
|
|
120
111
|
event(name, startTime, attributes) {
|
|
121
112
|
if (!this.sentrySpan.isRecording()) {
|
|
122
113
|
return;
|
|
123
114
|
}
|
|
124
|
-
this.sentrySpan.addEvent(name, attributes,
|
|
115
|
+
this.sentrySpan.addEvent(name, attributes, this._toSentryTime(startTime));
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Converts an Effect time to Sentry's clock by adding its offset from the span's start.
|
|
119
|
+
*
|
|
120
|
+
* Effect's clock doesn't correct for clock drift (e.g. after the device slept), so its absolute times can be off
|
|
121
|
+
* from the Sentry spans around this one. Its durations are still correct, and this way we also respect end times
|
|
122
|
+
* that were passed explicitly.
|
|
123
|
+
*/
|
|
124
|
+
_toSentryTime(effectTime) {
|
|
125
|
+
if (!effectTime || !this.status.startTime) {
|
|
126
|
+
return void 0;
|
|
127
|
+
}
|
|
128
|
+
return this._sentryStartTime + Number(effectTime - this.status.startTime) / 1e9;
|
|
125
129
|
}
|
|
126
130
|
}
|
|
127
131
|
const isEffectV4 = (() => {
|
|
@@ -196,13 +200,14 @@ function startSentrySpan(startInactiveSpan, options, parent, newTraceForRootSpan
|
|
|
196
200
|
return core.withActiveSpan(null, () => startInactiveSpan(options));
|
|
197
201
|
}
|
|
198
202
|
function createSentrySpan(startInactiveSpan, newTraceForRootSpans, name, parent, context, links, startTime, kind) {
|
|
199
|
-
const op = deriveOp(name);
|
|
200
|
-
const origin =
|
|
203
|
+
const op = deriveOp(name, kind);
|
|
204
|
+
const origin = op && "auto.http.effect";
|
|
205
|
+
const sentryStartTime = core.timestampInSeconds();
|
|
201
206
|
const newSpan = startSentrySpan(
|
|
202
207
|
startInactiveSpan,
|
|
203
208
|
{
|
|
204
209
|
name,
|
|
205
|
-
startTime:
|
|
210
|
+
startTime: sentryStartTime,
|
|
206
211
|
// Setting these to `undefined` would strip the core defaults instead of leaving them in place.
|
|
207
212
|
attributes: {
|
|
208
213
|
...op && { [attributes.SENTRY_OP]: op },
|
|
@@ -213,7 +218,7 @@ function createSentrySpan(startInactiveSpan, newTraceForRootSpans, name, parent,
|
|
|
213
218
|
newTraceForRootSpans
|
|
214
219
|
);
|
|
215
220
|
markEffectSpan(newSpan);
|
|
216
|
-
return new SentrySpanWrapper(name, parent, context, links, startTime, kind, newSpan);
|
|
221
|
+
return new SentrySpanWrapper(name, parent, context, links, startTime, kind, newSpan, sentryStartTime);
|
|
217
222
|
}
|
|
218
223
|
const makeSentryTracerV3 = (startInactiveSpan, newTraceForRootSpans) => {
|
|
219
224
|
return EffectTracer.make({
|
package/build/cjs/tracer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tracer.js","sources":["../../src/tracer.ts"],"sourcesContent":["/* oxlint-disable max-lines */\nimport { SENTRY_OP, SENTRY_ORIGIN } from '@sentry/conventions/attributes';\nimport { HTTP_CLIENT, HTTP_SERVER } from '@sentry/conventions/op';\nimport type { Span, StartSpanOptions } from '@sentry/core';\nimport {\n _INTERNAL_safeMathRandom,\n addNonEnumerableProperty,\n getActiveSpan,\n getCurrentScope,\n getDefaultCurrentScope,\n isObjectLike,\n startNewTrace,\n withActiveSpan,\n withScope,\n} from '@sentry/core';\nimport * as Context from 'effect/Context';\nimport * as Exit from 'effect/Exit';\nimport type * as EffectLayer from 'effect/Layer';\nimport { succeed as succeedLayer } from 'effect/Layer';\nimport * as Option from 'effect/Option';\nimport * as EffectTracer from 'effect/Tracer';\n\nfunction deriveOrigin(name: string): string | undefined {\n if (name.startsWith('http.server') || name.startsWith('http.client')) {\n return 'auto.http.effect';\n }\n\n return undefined;\n}\n\nconst EFFECT_SPAN_SYMBOL = Symbol.for('@sentry/effect.EffectSpan');\n\nfunction markEffectSpan(span: Span): void {\n addNonEnumerableProperty(span, EFFECT_SPAN_SYMBOL, true);\n}\n\n/**\n * Whether this tracer created the span. A brand rather than an attribute check, because an unsampled\n * span keeps no attributes.\n */\nfunction isEffectSpan(span: Span): boolean {\n return (span as { [EFFECT_SPAN_SYMBOL]?: boolean })[EFFECT_SPAN_SYMBOL] === true;\n}\n\n/**\n * Effect span names are chosen by whoever calls `Effect.withSpan`, so the name is the only signal\n * available. `@effect/platform` names its HTTP spans `http.server`/`http.client`, which map onto the\n * matching Sentry ops. Every other name comes from user code or a third-party library, whose semantics\n * we cannot infer, so op and origin stay unset and the span keeps the core defaults: no op, and a\n * `manual` origin.\n */\nfunction deriveOp(name: string): string | undefined {\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 undefined;\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 hand different `startInactiveSpan` functions 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.\n */\nexport type StartInactiveSpan = (options: StartSpanOptions) => Span;\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 EXTERNAL_SPAN_KEY = '@sentry/effect/ExternalSpan';\n\ninterface ContextExports {\n Reference: typeof Context.Reference;\n /** Only Effect v3 exports it. */\n GenericTag<Identifier, Service>(key: string): Context.Key<Identifier, Service>;\n}\n\n// Effect v4 has no `Context.GenericTag` and Effect v3 before 3.11 has no `Context.Reference`. Both are read\n// through a separate binding because bundlers fail the build on a namespace member the installed version lacks.\nconst contextExports = Context as unknown as ContextExports;\n\n/**\n * Whether the tracer continues the trace of a `Tracer.externalSpan` parent. Effect v4 has no `FiberRef`\n * and v3 before 3.11 has no `Context.Reference`, so the flag is a plain service in both. The cast is safe:\n * the tracer reads it with `getRef` only on a v4 fiber, where it is a reference, and with\n * `Context.getOption` on v3.\n */\nconst ExternalSpanFlag = (\n isEffectV4\n ? contextExports.Reference<boolean>(EXTERNAL_SPAN_KEY, { defaultValue: () => false })\n : contextExports.GenericTag<never, boolean>(EXTERNAL_SPAN_KEY)\n) as Context.Reference<boolean>;\n\n/**\n * Makes the tracer continue the trace of a `Tracer.externalSpan` parent instead of ignoring it. Provide it\n * next to the tracer layer to continue every external span in the runtime, or provide it to a single\n * effect with `Effect.provide` to continue only that one.\n */\nexport const SentryEffectExternalSpanLayer: EffectLayer.Layer<never> = succeedLayer(ExternalSpanFlag, true);\n\ninterface FiberLike {\n /** The span the fiber runs in. Only Effect v3 fibers have it. */\n readonly currentSpan?: EffectTracer.AnySpan | undefined;\n /** Holds `span`, the span the fiber runs in. Only Effect v4 fibers have it. */\n readonly cache?: { readonly span?: EffectTracer.AnySpan | undefined };\n /** Reads a reference with its default. Only Effect v4 fibers have it. */\n readonly getRef?: <A>(ref: Context.Reference<A>) => A;\n /** The services of the fiber. Only Effect v3 fibers have it. */\n readonly currentContext?: Context.Context<never>;\n}\n\n/**\n * The fiber whose operation is being evaluated. Effect hands the fiber to the `context` hook but not to\n * `span`, which runs synchronously inside it, so the hook keeps the fiber here for that extent.\n */\nlet currentFiber: FiberLike | undefined;\n\nfunction continuesExternalSpans(fiber: FiberLike): boolean {\n if (fiber.getRef) {\n return fiber.getRef(ExternalSpanFlag);\n }\n\n return (\n fiber.currentContext !== undefined &&\n Option.getOrElse(Context.getOption(fiber.currentContext, ExternalSpanFlag), () => false)\n );\n}\n\nfunction getFiberSpan(fiber: FiberLike): EffectTracer.AnySpan | undefined {\n return isEffectV4 ? fiber.cache?.span : fiber.currentSpan;\n}\n\nfunction withFiberContext<X>(fiber: FiberLike, execution: () => X): X {\n const previousFiber = currentFiber;\n currentFiber = fiber;\n try {\n const currentSpan = getFiberSpan(fiber);\n if (currentSpan === undefined || !isSentrySpan(currentSpan)) {\n return execution();\n }\n return withActiveSpan(currentSpan.sentrySpan, execution);\n } finally {\n currentFiber = previousFiber;\n }\n}\n\n/**\n * Starts the Sentry span for an Effect span, rooted or parented the way Effect asked for.\n *\n * - A parent this tracer created becomes the Sentry parent.\n * - Any other parent (`Tracer.externalSpan` bridging a trace this SDK did not start, such as an\n * OpenTelemetry span of another app in the same process or persisted trace state) is ignored unless\n * {@link SentryEffectExternalSpanLayer} is provided, so a span joins a foreign trace only when the user\n * asked for it. The span then nests where Effect would have put it without the `parent` option: under\n * the fiber's current span, or parentless. With the layer, the span continues that trace: it is a root\n * span whose `parent_span_id` is the external span. No dynamic sampling context is frozen, so the SDK\n * builds one from the client the way it does for a head-of-trace span.\n * - Without a parent, the span nests under a foreign active Sentry span (an `http.server` span from the\n * Node SDK, a pageload in the browser) but never under a span this tracer created: Effect's own parent\n * tracking is authoritative for those, so an active one is an enclosing `root: true` span or a span\n * leaked from another fiber through the async context. Effect reports `root: true` for every\n * parentless span, so the flag adds nothing and is not consulted.\n * - A root span starts a new trace when `newTraceForRootSpans` is set, unless the user set up the\n * current scope (`Sentry.continueTrace`, `Sentry.withScope`, an HTTP request's isolation scope).\n */\nfunction startSentrySpan(\n startInactiveSpan: StartInactiveSpan,\n options: StartSpanOptions,\n parent: Option.Option<EffectTracer.AnySpan>,\n newTraceForRootSpans: boolean,\n): Span {\n if (Option.isSome(parent)) {\n const parentSpan = parent.value;\n\n if (isSentrySpan(parentSpan)) {\n return startInactiveSpan({ ...options, parentSpan: parentSpan.sentrySpan });\n }\n\n if (currentFiber !== undefined && continuesExternalSpans(currentFiber)) {\n return withScope(scope => {\n scope.setPropagationContext({\n traceId: parentSpan.traceId,\n parentSpanId: parentSpan.spanId,\n sampled: parentSpan.sampled,\n sampleRand: _INTERNAL_safeMathRandom(),\n });\n return withActiveSpan(null, () => startInactiveSpan(options));\n });\n }\n\n const enclosingSpan = currentFiber && getFiberSpan(currentFiber);\n if (enclosingSpan !== undefined && isSentrySpan(enclosingSpan)) {\n return startInactiveSpan({ ...options, parentSpan: enclosingSpan.sentrySpan });\n }\n }\n\n const activeSpan = getActiveSpan();\n if (activeSpan && !isEffectSpan(activeSpan)) {\n return startInactiveSpan({ ...options, parentSpan: activeSpan });\n }\n\n // A scope the user forked (`continueTrace`, `withScope`, an isolation scope) carries its own trace id.\n // The scopes this tracer forks in `context()` clone the propagation context they were forked from, so\n // even when one leaks into another fiber through the async context it still carries the process-wide\n // trace id of the default scope.\n const isProcessTrace =\n getCurrentScope().getPropagationContext().traceId === getDefaultCurrentScope().getPropagationContext().traceId;\n if (newTraceForRootSpans && isProcessTrace) {\n return startNewTrace(() => startInactiveSpan(options));\n }\n\n return withActiveSpan(null, () => startInactiveSpan(options));\n}\n\nfunction createSentrySpan(\n startInactiveSpan: StartInactiveSpan,\n newTraceForRootSpans: boolean,\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 op = deriveOp(name);\n const origin = deriveOrigin(name);\n\n const newSpan = startSentrySpan(\n startInactiveSpan,\n {\n name,\n startTime: nanosToHrTime(startTime),\n // Setting these to `undefined` would strip the core defaults instead of leaving them in place.\n attributes: {\n ...(op && { [SENTRY_OP]: op }),\n ...(origin && { [SENTRY_ORIGIN]: origin }),\n },\n },\n parent,\n newTraceForRootSpans,\n );\n markEffectSpan(newSpan);\n\n return new SentrySpanWrapper(name, parent, context, links, startTime, kind, newSpan);\n}\n\nconst makeSentryTracerV3 = (\n startInactiveSpan: StartInactiveSpan,\n newTraceForRootSpans: boolean,\n): 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, newTraceForRootSpans, name, parent, context, links, startTime, kind);\n },\n context(execution: () => unknown, fiber: FiberLike) {\n return withFiberContext(fiber, execution);\n },\n } as unknown as EffectTracer.Tracer);\n};\n\nconst makeSentryTracerV4 = (\n startInactiveSpan: StartInactiveSpan,\n newTraceForRootSpans: boolean,\n): 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 newTraceForRootSpans,\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 return withFiberContext(fiber, () => 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 *\n * `newTraceForRootSpans` is the one behavioural difference between the platforms: Effect gives every\n * parentless span a fresh trace id, and on a long-lived server nothing else forks the propagation\n * context, so the server tracer follows Effect and starts a new trace. In the browser the page trace is\n * the intended home of every span, so the client tracer keeps parentless spans in it.\n */\nexport function makeSentryTracer(\n startInactiveSpan: StartInactiveSpan,\n newTraceForRootSpans: boolean,\n): EffectTracer.Tracer {\n return isEffectV4\n ? makeSentryTracerV4(startInactiveSpan, newTraceForRootSpans)\n : makeSentryTracerV3(startInactiveSpan, newTraceForRootSpans);\n}\n"],"names":["addNonEnumerableProperty","HTTP_SERVER","HTTP_CLIENT","isObjectLike","succeedLayer","withActiveSpan","withScope","_INTERNAL_safeMathRandom","getActiveSpan","getCurrentScope","getDefaultCurrentScope","startNewTrace","SENTRY_OP","SENTRY_ORIGIN"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tracer.js","sources":["../../src/tracer.ts"],"sourcesContent":["/* oxlint-disable max-lines */\nimport { SENTRY_OP, SENTRY_ORIGIN } from '@sentry/conventions/attributes';\nimport { HTTP_CLIENT, HTTP_SERVER } from '@sentry/conventions/op';\nimport type { Span, StartSpanOptions } from '@sentry/core';\nimport {\n _INTERNAL_safeMathRandom,\n addNonEnumerableProperty,\n getActiveSpan,\n getCurrentScope,\n getDefaultCurrentScope,\n isObjectLike,\n startNewTrace,\n timestampInSeconds,\n withActiveSpan,\n withScope,\n} from '@sentry/core';\nimport * as Context from 'effect/Context';\nimport * as Exit from 'effect/Exit';\nimport type * as EffectLayer from 'effect/Layer';\nimport { succeed as succeedLayer } from 'effect/Layer';\nimport * as Option from 'effect/Option';\nimport * as EffectTracer from 'effect/Tracer';\n\nconst EFFECT_SPAN_SYMBOL = Symbol.for('@sentry/effect.EffectSpan');\n\nfunction markEffectSpan(span: Span): void {\n addNonEnumerableProperty(span, EFFECT_SPAN_SYMBOL, true);\n}\n\n/**\n * Whether this tracer created the span. A brand rather than an attribute check, because an unsampled\n * span keeps no attributes.\n */\nfunction isEffectSpan(span: Span): boolean {\n return (span as { [EFFECT_SPAN_SYMBOL]?: boolean })[EFFECT_SPAN_SYMBOL] === true;\n}\n\nconst HTTP_METHODS = new Set(['GET', 'HEAD', 'POST', 'PUT', 'DELETE', 'CONNECT', 'OPTIONS', 'TRACE', 'PATCH']);\n\n/**\n * Effect span names are chosen by whoever calls `Effect.withSpan`, so the name and the kind are the only\n * signals available. Effect names its HTTP spans `http.server <method>`/`http.client <method>` (Effect v3\n * and v4 before 4.0.2) or only `<method>` with a `server`/`client` kind (Effect 4.0.2 and later), which map\n * onto the matching Sentry ops. Every other span comes from user code or a third-party library, whose\n * semantics we cannot infer, so op and origin stay unset and the span keeps the core defaults: no op, and\n * a `manual` origin.\n */\nfunction deriveOp(name: string, kind: EffectTracer.SpanKind): string | undefined {\n if (name.startsWith('http.server') || (kind === 'server' && HTTP_METHODS.has(name))) {\n return HTTP_SERVER;\n }\n\n if (name.startsWith('http.client') || (kind === 'client' && HTTP_METHODS.has(name))) {\n return HTTP_CLIENT;\n }\n\n return undefined;\n}\n\nconst SENTRY_SPAN_SYMBOL = Symbol.for('@sentry/effect.SentrySpan');\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 private readonly _sentryStartTime: number;\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 sentryStartTime: number,\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 this._sentryStartTime = sentryStartTime;\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(this._toSentryTime(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], this._toSentryTime(startTime));\n }\n\n /**\n * Converts an Effect time to Sentry's clock by adding its offset from the span's start.\n *\n * Effect's clock doesn't correct for clock drift (e.g. after the device slept), so its absolute times can be off\n * from the Sentry spans around this one. Its durations are still correct, and this way we also respect end times\n * that were passed explicitly.\n */\n private _toSentryTime(effectTime: bigint): number | undefined {\n // Effect passes 0 if tracer timing is disabled. Sentry then takes the current time.\n if (!effectTime || !this.status.startTime) {\n return undefined;\n }\n\n return this._sentryStartTime + Number(effectTime - this.status.startTime) / 1e9;\n }\n}\n\n/**\n * The client and the server entry hand different `startInactiveSpan` functions 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.\n */\nexport type StartInactiveSpan = (options: StartSpanOptions) => Span;\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 EXTERNAL_SPAN_KEY = '@sentry/effect/ExternalSpan';\n\ninterface ContextExports {\n Reference: typeof Context.Reference;\n /** Only Effect v3 exports it. */\n GenericTag<Identifier, Service>(key: string): Context.Key<Identifier, Service>;\n}\n\n// Effect v4 has no `Context.GenericTag` and Effect v3 before 3.11 has no `Context.Reference`. Both are read\n// through a separate binding because bundlers fail the build on a namespace member the installed version lacks.\nconst contextExports = Context as unknown as ContextExports;\n\n/**\n * Whether the tracer continues the trace of a `Tracer.externalSpan` parent. Effect v4 has no `FiberRef`\n * and v3 before 3.11 has no `Context.Reference`, so the flag is a plain service in both. The cast is safe:\n * the tracer reads it with `getRef` only on a v4 fiber, where it is a reference, and with\n * `Context.getOption` on v3.\n */\nconst ExternalSpanFlag = (\n isEffectV4\n ? contextExports.Reference<boolean>(EXTERNAL_SPAN_KEY, { defaultValue: () => false })\n : contextExports.GenericTag<never, boolean>(EXTERNAL_SPAN_KEY)\n) as Context.Reference<boolean>;\n\n/**\n * Makes the tracer continue the trace of a `Tracer.externalSpan` parent instead of ignoring it. Provide it\n * next to the tracer layer to continue every external span in the runtime, or provide it to a single\n * effect with `Effect.provide` to continue only that one.\n */\nexport const SentryEffectExternalSpanLayer: EffectLayer.Layer<never> = succeedLayer(ExternalSpanFlag, true);\n\ninterface FiberLike {\n /** The span the fiber runs in. Only Effect v3 fibers have it. */\n readonly currentSpan?: EffectTracer.AnySpan | undefined;\n /** Holds `span`, the span the fiber runs in. Only Effect v4 fibers have it. */\n readonly cache?: { readonly span?: EffectTracer.AnySpan | undefined };\n /** Reads a reference with its default. Only Effect v4 fibers have it. */\n readonly getRef?: <A>(ref: Context.Reference<A>) => A;\n /** The services of the fiber. Only Effect v3 fibers have it. */\n readonly currentContext?: Context.Context<never>;\n}\n\n/**\n * The fiber whose operation is being evaluated. Effect hands the fiber to the `context` hook but not to\n * `span`, which runs synchronously inside it, so the hook keeps the fiber here for that extent.\n */\nlet currentFiber: FiberLike | undefined;\n\nfunction continuesExternalSpans(fiber: FiberLike): boolean {\n if (fiber.getRef) {\n return fiber.getRef(ExternalSpanFlag);\n }\n\n return (\n fiber.currentContext !== undefined &&\n Option.getOrElse(Context.getOption(fiber.currentContext, ExternalSpanFlag), () => false)\n );\n}\n\nfunction getFiberSpan(fiber: FiberLike): EffectTracer.AnySpan | undefined {\n return isEffectV4 ? fiber.cache?.span : fiber.currentSpan;\n}\n\nfunction withFiberContext<X>(fiber: FiberLike, execution: () => X): X {\n const previousFiber = currentFiber;\n currentFiber = fiber;\n try {\n const currentSpan = getFiberSpan(fiber);\n if (currentSpan === undefined || !isSentrySpan(currentSpan)) {\n return execution();\n }\n return withActiveSpan(currentSpan.sentrySpan, execution);\n } finally {\n currentFiber = previousFiber;\n }\n}\n\n/**\n * Starts the Sentry span for an Effect span, rooted or parented the way Effect asked for.\n *\n * - A parent this tracer created becomes the Sentry parent.\n * - Any other parent (`Tracer.externalSpan` bridging a trace this SDK did not start, such as an\n * OpenTelemetry span of another app in the same process or persisted trace state) is ignored unless\n * {@link SentryEffectExternalSpanLayer} is provided, so a span joins a foreign trace only when the user\n * asked for it. The span then nests where Effect would have put it without the `parent` option: under\n * the fiber's current span, or parentless. With the layer, the span continues that trace: it is a root\n * span whose `parent_span_id` is the external span. No dynamic sampling context is frozen, so the SDK\n * builds one from the client the way it does for a head-of-trace span.\n * - Without a parent, the span nests under a foreign active Sentry span (an `http.server` span from the\n * Node SDK, a pageload in the browser) but never under a span this tracer created: Effect's own parent\n * tracking is authoritative for those, so an active one is an enclosing `root: true` span or a span\n * leaked from another fiber through the async context. Effect reports `root: true` for every\n * parentless span, so the flag adds nothing and is not consulted.\n * - A root span starts a new trace when `newTraceForRootSpans` is set, unless the user set up the\n * current scope (`Sentry.continueTrace`, `Sentry.withScope`, an HTTP request's isolation scope).\n */\nfunction startSentrySpan(\n startInactiveSpan: StartInactiveSpan,\n options: StartSpanOptions,\n parent: Option.Option<EffectTracer.AnySpan>,\n newTraceForRootSpans: boolean,\n): Span {\n if (Option.isSome(parent)) {\n const parentSpan = parent.value;\n\n if (isSentrySpan(parentSpan)) {\n return startInactiveSpan({ ...options, parentSpan: parentSpan.sentrySpan });\n }\n\n if (currentFiber !== undefined && continuesExternalSpans(currentFiber)) {\n return withScope(scope => {\n scope.setPropagationContext({\n traceId: parentSpan.traceId,\n parentSpanId: parentSpan.spanId,\n sampled: parentSpan.sampled,\n sampleRand: _INTERNAL_safeMathRandom(),\n });\n return withActiveSpan(null, () => startInactiveSpan(options));\n });\n }\n\n const enclosingSpan = currentFiber && getFiberSpan(currentFiber);\n if (enclosingSpan !== undefined && isSentrySpan(enclosingSpan)) {\n return startInactiveSpan({ ...options, parentSpan: enclosingSpan.sentrySpan });\n }\n }\n\n const activeSpan = getActiveSpan();\n if (activeSpan && !isEffectSpan(activeSpan)) {\n return startInactiveSpan({ ...options, parentSpan: activeSpan });\n }\n\n // A scope the user forked (`continueTrace`, `withScope`, an isolation scope) carries its own trace id.\n // The scopes this tracer forks in `context()` clone the propagation context they were forked from, so\n // even when one leaks into another fiber through the async context it still carries the process-wide\n // trace id of the default scope.\n const isProcessTrace =\n getCurrentScope().getPropagationContext().traceId === getDefaultCurrentScope().getPropagationContext().traceId;\n if (newTraceForRootSpans && isProcessTrace) {\n return startNewTrace(() => startInactiveSpan(options));\n }\n\n return withActiveSpan(null, () => startInactiveSpan(options));\n}\n\nfunction createSentrySpan(\n startInactiveSpan: StartInactiveSpan,\n newTraceForRootSpans: boolean,\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 op = deriveOp(name, kind);\n const origin = op && 'auto.http.effect';\n\n // Effect calls the tracer when the span starts, so we start it on Sentry's clock and convert later Effect times\n // relative to this (see `_toSentryTime`).\n const sentryStartTime = timestampInSeconds();\n const newSpan = startSentrySpan(\n startInactiveSpan,\n {\n name,\n startTime: sentryStartTime,\n // Setting these to `undefined` would strip the core defaults instead of leaving them in place.\n attributes: {\n ...(op && { [SENTRY_OP]: op }),\n ...(origin && { [SENTRY_ORIGIN]: origin }),\n },\n },\n parent,\n newTraceForRootSpans,\n );\n markEffectSpan(newSpan);\n\n return new SentrySpanWrapper(name, parent, context, links, startTime, kind, newSpan, sentryStartTime);\n}\n\nconst makeSentryTracerV3 = (\n startInactiveSpan: StartInactiveSpan,\n newTraceForRootSpans: boolean,\n): 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, newTraceForRootSpans, name, parent, context, links, startTime, kind);\n },\n context(execution: () => unknown, fiber: FiberLike) {\n return withFiberContext(fiber, execution);\n },\n } as unknown as EffectTracer.Tracer);\n};\n\nconst makeSentryTracerV4 = (\n startInactiveSpan: StartInactiveSpan,\n newTraceForRootSpans: boolean,\n): 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 newTraceForRootSpans,\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 return withFiberContext(fiber, () => 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 *\n * `newTraceForRootSpans` is the one behavioural difference between the platforms: Effect gives every\n * parentless span a fresh trace id, and on a long-lived server nothing else forks the propagation\n * context, so the server tracer follows Effect and starts a new trace. In the browser the page trace is\n * the intended home of every span, so the client tracer keeps parentless spans in it.\n */\nexport function makeSentryTracer(\n startInactiveSpan: StartInactiveSpan,\n newTraceForRootSpans: boolean,\n): EffectTracer.Tracer {\n return isEffectV4\n ? makeSentryTracerV4(startInactiveSpan, newTraceForRootSpans)\n : makeSentryTracerV3(startInactiveSpan, newTraceForRootSpans);\n}\n"],"names":["addNonEnumerableProperty","HTTP_SERVER","HTTP_CLIENT","isObjectLike","succeedLayer","withActiveSpan","withScope","_INTERNAL_safeMathRandom","getActiveSpan","getCurrentScope","getDefaultCurrentScope","startNewTrace","timestampInSeconds","SENTRY_OP","SENTRY_ORIGIN"],"mappings":";;;;;;;;;;;AAuBA,MAAM,kBAAA,mBAAqB,MAAA,CAAO,GAAA,CAAI,2BAA2B,CAAA;AAEjE,SAAS,eAAe,IAAA,EAAkB;AACxC,EAAAA,6BAAA,CAAyB,IAAA,EAAM,oBAAoB,IAAI,CAAA;AACzD;AAMA,SAAS,aAAa,IAAA,EAAqB;AACzC,EAAA,OAAQ,IAAA,CAA4C,kBAAkB,CAAA,KAAM,IAAA;AAC9E;AAEA,MAAM,YAAA,mBAAe,IAAI,GAAA,CAAI,CAAC,KAAA,EAAO,MAAA,EAAQ,MAAA,EAAQ,KAAA,EAAO,QAAA,EAAU,SAAA,EAAW,SAAA,EAAW,OAAA,EAAS,OAAO,CAAC,CAAA;AAU7G,SAAS,QAAA,CAAS,MAAc,IAAA,EAAiD;AAC/E,EAAA,IAAI,IAAA,CAAK,WAAW,aAAa,CAAA,IAAM,SAAS,QAAA,IAAY,YAAA,CAAa,GAAA,CAAI,IAAI,CAAA,EAAI;AACnF,IAAA,OAAOC,cAAA;AAAA,EACT;AAEA,EAAA,IAAI,IAAA,CAAK,WAAW,aAAa,CAAA,IAAM,SAAS,QAAA,IAAY,YAAA,CAAa,GAAA,CAAI,IAAI,CAAA,EAAI;AACnF,IAAA,OAAOC,cAAA;AAAA,EACT;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,MAAM,kBAAA,mBAAqB,MAAA,CAAO,GAAA,CAAI,2BAA2B,CAAA;AAOjE,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,IAAIC,iBAAA,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,IAAIA,iBAAA,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,EAczC,WAAA,CACW,MAChB,MAAA,EACgB,OAAA,EAChB,OACA,SAAA,EACgB,IAAA,EAChB,cACA,eAAA,EACA;AARgB,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAEA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAGA,IAAA,IAAA,CAAA,IAAA,GAAA,IAAA;AAIhB,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;AACnB,IAAA,IAAA,CAAK,gBAAA,GAAmB,eAAA;AAExB,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,IAAA,CAAK,aAAA,CAAc,OAAO,CAAC,CAAA;AAAA,EACjD;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,YAA+C,IAAA,CAAK,aAAA,CAAc,SAAS,CAAC,CAAA;AAAA,EAC7G;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,cAAc,UAAA,EAAwC;AAE5D,IAAA,IAAI,CAAC,UAAA,IAAc,CAAC,IAAA,CAAK,OAAO,SAAA,EAAW;AACzC,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,OAAO,KAAK,gBAAA,GAAmB,MAAA,CAAO,aAAa,IAAA,CAAK,MAAA,CAAO,SAAS,CAAA,GAAI,GAAA;AAAA,EAC9E;AACF;AAYA,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,IAAIA,iBAAA,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,iBAAA,GAAoB,6BAAA;AAU1B,MAAM,cAAA,GAAiB,OAAA;AAQvB,MAAM,gBAAA,GACJ,UAAA,GACI,cAAA,CAAe,SAAA,CAAmB,iBAAA,EAAmB,EAAE,YAAA,EAAc,MAAM,KAAA,EAAO,CAAA,GAClF,cAAA,CAAe,WAA2B,iBAAiB,CAAA;AAQ1D,MAAM,6BAAA,GAA0DC,aAAA,CAAa,gBAAA,EAAkB,IAAI;AAiB1G,IAAI,YAAA;AAEJ,SAAS,uBAAuB,KAAA,EAA2B;AACzD,EAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,IAAA,OAAO,KAAA,CAAM,OAAO,gBAAgB,CAAA;AAAA,EACtC;AAEA,EAAA,OACE,KAAA,CAAM,cAAA,KAAmB,MAAA,IACzB,MAAA,CAAO,SAAA,CAAU,OAAA,CAAQ,SAAA,CAAU,KAAA,CAAM,cAAA,EAAgB,gBAAgB,CAAA,EAAG,MAAM,KAAK,CAAA;AAE3F;AAEA,SAAS,aAAa,KAAA,EAAoD;AACxE,EAAA,OAAO,UAAA,GAAa,KAAA,CAAM,KAAA,EAAO,IAAA,GAAO,KAAA,CAAM,WAAA;AAChD;AAEA,SAAS,gBAAA,CAAoB,OAAkB,SAAA,EAAuB;AACpE,EAAA,MAAM,aAAA,GAAgB,YAAA;AACtB,EAAA,YAAA,GAAe,KAAA;AACf,EAAA,IAAI;AACF,IAAA,MAAM,WAAA,GAAc,aAAa,KAAK,CAAA;AACtC,IAAA,IAAI,WAAA,KAAgB,KAAA,CAAA,IAAa,CAAC,YAAA,CAAa,WAAW,CAAA,EAAG;AAC3D,MAAA,OAAO,SAAA,EAAU;AAAA,IACnB;AACA,IAAA,OAAOC,mBAAA,CAAe,WAAA,CAAY,UAAA,EAAY,SAAS,CAAA;AAAA,EACzD,CAAA,SAAE;AACA,IAAA,YAAA,GAAe,aAAA;AAAA,EACjB;AACF;AAqBA,SAAS,eAAA,CACP,iBAAA,EACA,OAAA,EACA,MAAA,EACA,oBAAA,EACM;AACN,EAAA,IAAI,MAAA,CAAO,MAAA,CAAO,MAAM,CAAA,EAAG;AACzB,IAAA,MAAM,aAAa,MAAA,CAAO,KAAA;AAE1B,IAAA,IAAI,YAAA,CAAa,UAAU,CAAA,EAAG;AAC5B,MAAA,OAAO,kBAAkB,EAAE,GAAG,SAAS,UAAA,EAAY,UAAA,CAAW,YAAY,CAAA;AAAA,IAC5E;AAEA,IAAA,IAAI,YAAA,KAAiB,MAAA,IAAa,sBAAA,CAAuB,YAAY,CAAA,EAAG;AACtE,MAAA,OAAOC,eAAU,CAAA,KAAA,KAAS;AACxB,QAAA,KAAA,CAAM,qBAAA,CAAsB;AAAA,UAC1B,SAAS,UAAA,CAAW,OAAA;AAAA,UACpB,cAAc,UAAA,CAAW,MAAA;AAAA,UACzB,SAAS,UAAA,CAAW,OAAA;AAAA,UACpB,YAAYC,6BAAA;AAAyB,SACtC,CAAA;AACD,QAAA,OAAOF,mBAAA,CAAe,IAAA,EAAM,MAAM,iBAAA,CAAkB,OAAO,CAAC,CAAA;AAAA,MAC9D,CAAC,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,aAAA,GAAgB,YAAA,IAAgB,YAAA,CAAa,YAAY,CAAA;AAC/D,IAAA,IAAI,aAAA,KAAkB,MAAA,IAAa,YAAA,CAAa,aAAa,CAAA,EAAG;AAC9D,MAAA,OAAO,kBAAkB,EAAE,GAAG,SAAS,UAAA,EAAY,aAAA,CAAc,YAAY,CAAA;AAAA,IAC/E;AAAA,EACF;AAEA,EAAA,MAAM,aAAaG,kBAAA,EAAc;AACjC,EAAA,IAAI,UAAA,IAAc,CAAC,YAAA,CAAa,UAAU,CAAA,EAAG;AAC3C,IAAA,OAAO,kBAAkB,EAAE,GAAG,OAAA,EAAS,UAAA,EAAY,YAAY,CAAA;AAAA,EACjE;AAMA,EAAA,MAAM,cAAA,GACJC,sBAAgB,CAAE,qBAAA,GAAwB,OAAA,KAAYC,2BAAA,EAAuB,CAAE,qBAAA,EAAsB,CAAE,OAAA;AACzG,EAAA,IAAI,wBAAwB,cAAA,EAAgB;AAC1C,IAAA,OAAOC,kBAAA,CAAc,MAAM,iBAAA,CAAkB,OAAO,CAAC,CAAA;AAAA,EACvD;AAEA,EAAA,OAAON,mBAAA,CAAe,IAAA,EAAM,MAAM,iBAAA,CAAkB,OAAO,CAAC,CAAA;AAC9D;AAEA,SAAS,gBAAA,CACP,mBACA,oBAAA,EACA,IAAA,EACA,QACA,OAAA,EACA,KAAA,EACA,WACA,IAAA,EACgB;AAChB,EAAA,MAAM,EAAA,GAAK,QAAA,CAAS,IAAA,EAAM,IAAI,CAAA;AAC9B,EAAA,MAAM,SAAS,EAAA,IAAM,kBAAA;AAIrB,EAAA,MAAM,kBAAkBO,uBAAA,EAAmB;AAC3C,EAAA,MAAM,OAAA,GAAU,eAAA;AAAA,IACd,iBAAA;AAAA,IACA;AAAA,MACE,IAAA;AAAA,MACA,SAAA,EAAW,eAAA;AAAA;AAAA,MAEX,UAAA,EAAY;AAAA,QACV,GAAI,EAAA,IAAM,EAAE,CAACC,oBAAS,GAAG,EAAA,EAAG;AAAA,QAC5B,GAAI,MAAA,IAAU,EAAE,CAACC,wBAAa,GAAG,MAAA;AAAO;AAC1C,KACF;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,cAAA,CAAe,OAAO,CAAA;AAEtB,EAAA,OAAO,IAAI,kBAAkB,IAAA,EAAM,MAAA,EAAQ,SAAS,KAAA,EAAO,SAAA,EAAW,IAAA,EAAM,OAAA,EAAS,eAAe,CAAA;AACtG;AAEA,MAAM,kBAAA,GAAqB,CACzB,iBAAA,EACA,oBAAA,KACwB;AAExB,EAAA,OAAO,aAAa,IAAA,CAAK;AAAA,IACvB,KACE,IAAA,EACA,MAAA,EACA,OAAA,EACA,KAAA,EACA,WACA,IAAA,EACA;AACA,MAAA,OAAO,gBAAA,CAAiB,mBAAmB,oBAAA,EAAsB,IAAA,EAAM,QAAQ,OAAA,EAAS,KAAA,EAAO,WAAW,IAAI,CAAA;AAAA,IAChH,CAAA;AAAA,IACA,OAAA,CAAQ,WAA0B,KAAA,EAAkB;AAClD,MAAA,OAAO,gBAAA,CAAiB,OAAO,SAAS,CAAA;AAAA,IAC1C;AAAA,GACiC,CAAA;AACrC,CAAA;AAEA,MAAM,kBAAA,GAAqB,CACzB,iBAAA,EACA,oBAAA,KACwB;AACxB,EAAA,MAAM,eAAA,GAAkB,yBAAA;AAExB,EAAA,OAAO,aAAa,IAAA,CAAK;AAAA,IACvB,KAAK,OAAA,EAAS;AACZ,MAAA,OAAO,gBAAA;AAAA,QACL,iBAAA;AAAA,QACA,oBAAA;AAAA,QACA,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,OAAO,iBAAiB,KAAA,EAAO,MAAM,UAAU,eAAe,CAAA,CAAE,KAAK,CAAC,CAAA;AAAA,IACxE;AAAA,GACD,CAAA;AACH,CAAA;AAaO,SAAS,gBAAA,CACd,mBACA,oBAAA,EACqB;AACrB,EAAA,OAAO,aACH,kBAAA,CAAmB,iBAAA,EAAmB,oBAAoB,CAAA,GAC1D,kBAAA,CAAmB,mBAAmB,oBAAoB,CAAA;AAChE;;;;;"}
|
package/build/esm/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"type":"module","version":"11.
|
|
1
|
+
{"type":"module","version":"11.6.0","sideEffects":false}
|
package/build/esm/tracer.js
CHANGED
|
@@ -1,18 +1,12 @@
|
|
|
1
1
|
import { SENTRY_ORIGIN, SENTRY_OP } from '@sentry/conventions/attributes';
|
|
2
2
|
import { HTTP_SERVER, HTTP_CLIENT } from '@sentry/conventions/op';
|
|
3
|
-
import { isObjectLike, withActiveSpan, withScope, _INTERNAL_safeMathRandom, getActiveSpan, getCurrentScope, getDefaultCurrentScope, addNonEnumerableProperty, startNewTrace } from '@sentry/core';
|
|
3
|
+
import { isObjectLike, withActiveSpan, timestampInSeconds, withScope, _INTERNAL_safeMathRandom, getActiveSpan, getCurrentScope, getDefaultCurrentScope, addNonEnumerableProperty, startNewTrace } from '@sentry/core';
|
|
4
4
|
import * as Context from 'effect/Context';
|
|
5
5
|
import * as Exit from 'effect/Exit';
|
|
6
6
|
import { succeed } from 'effect/Layer';
|
|
7
7
|
import * as Option from 'effect/Option';
|
|
8
8
|
import * as EffectTracer from 'effect/Tracer';
|
|
9
9
|
|
|
10
|
-
function deriveOrigin(name) {
|
|
11
|
-
if (name.startsWith("http.server") || name.startsWith("http.client")) {
|
|
12
|
-
return "auto.http.effect";
|
|
13
|
-
}
|
|
14
|
-
return void 0;
|
|
15
|
-
}
|
|
16
10
|
const EFFECT_SPAN_SYMBOL = /* @__PURE__ */ Symbol.for("@sentry/effect.EffectSpan");
|
|
17
11
|
function markEffectSpan(span) {
|
|
18
12
|
addNonEnumerableProperty(span, EFFECT_SPAN_SYMBOL, true);
|
|
@@ -20,21 +14,17 @@ function markEffectSpan(span) {
|
|
|
20
14
|
function isEffectSpan(span) {
|
|
21
15
|
return span[EFFECT_SPAN_SYMBOL] === true;
|
|
22
16
|
}
|
|
23
|
-
|
|
24
|
-
|
|
17
|
+
const HTTP_METHODS = /* @__PURE__ */ new Set(["GET", "HEAD", "POST", "PUT", "DELETE", "CONNECT", "OPTIONS", "TRACE", "PATCH"]);
|
|
18
|
+
function deriveOp(name, kind) {
|
|
19
|
+
if (name.startsWith("http.server") || kind === "server" && HTTP_METHODS.has(name)) {
|
|
25
20
|
return HTTP_SERVER;
|
|
26
21
|
}
|
|
27
|
-
if (name.startsWith("http.client")) {
|
|
22
|
+
if (name.startsWith("http.client") || kind === "client" && HTTP_METHODS.has(name)) {
|
|
28
23
|
return HTTP_CLIENT;
|
|
29
24
|
}
|
|
30
25
|
return void 0;
|
|
31
26
|
}
|
|
32
27
|
const SENTRY_SPAN_SYMBOL = /* @__PURE__ */ Symbol.for("@sentry/effect.SentrySpan");
|
|
33
|
-
function nanosToHrTime(nanos) {
|
|
34
|
-
const seconds = Number(nanos / BigInt(1e9));
|
|
35
|
-
const remainingNanos = Number(nanos % BigInt(1e9));
|
|
36
|
-
return [seconds, remainingNanos];
|
|
37
|
-
}
|
|
38
28
|
function isSentrySpan(span) {
|
|
39
29
|
return SENTRY_SPAN_SYMBOL in span;
|
|
40
30
|
}
|
|
@@ -67,7 +57,7 @@ function getErrorMessage(exit) {
|
|
|
67
57
|
return "internal_error";
|
|
68
58
|
}
|
|
69
59
|
class SentrySpanWrapper {
|
|
70
|
-
constructor(name, parent, context, links, startTime, kind, existingSpan) {
|
|
60
|
+
constructor(name, parent, context, links, startTime, kind, existingSpan, sentryStartTime) {
|
|
71
61
|
this.name = name;
|
|
72
62
|
this.context = context;
|
|
73
63
|
this.kind = kind;
|
|
@@ -78,6 +68,7 @@ class SentrySpanWrapper {
|
|
|
78
68
|
this.links = [...links];
|
|
79
69
|
this.sentrySpan = existingSpan;
|
|
80
70
|
this.annotations = context;
|
|
71
|
+
this._sentryStartTime = sentryStartTime;
|
|
81
72
|
const spanContext = this.sentrySpan.spanContext();
|
|
82
73
|
this.spanId = spanContext.spanId;
|
|
83
74
|
this.traceId = spanContext.traceId;
|
|
@@ -113,13 +104,26 @@ class SentrySpanWrapper {
|
|
|
113
104
|
} else {
|
|
114
105
|
this.sentrySpan.setStatus({ code: 1 });
|
|
115
106
|
}
|
|
116
|
-
this.sentrySpan.end(
|
|
107
|
+
this.sentrySpan.end(this._toSentryTime(endTime));
|
|
117
108
|
}
|
|
118
109
|
event(name, startTime, attributes) {
|
|
119
110
|
if (!this.sentrySpan.isRecording()) {
|
|
120
111
|
return;
|
|
121
112
|
}
|
|
122
|
-
this.sentrySpan.addEvent(name, attributes,
|
|
113
|
+
this.sentrySpan.addEvent(name, attributes, this._toSentryTime(startTime));
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Converts an Effect time to Sentry's clock by adding its offset from the span's start.
|
|
117
|
+
*
|
|
118
|
+
* Effect's clock doesn't correct for clock drift (e.g. after the device slept), so its absolute times can be off
|
|
119
|
+
* from the Sentry spans around this one. Its durations are still correct, and this way we also respect end times
|
|
120
|
+
* that were passed explicitly.
|
|
121
|
+
*/
|
|
122
|
+
_toSentryTime(effectTime) {
|
|
123
|
+
if (!effectTime || !this.status.startTime) {
|
|
124
|
+
return void 0;
|
|
125
|
+
}
|
|
126
|
+
return this._sentryStartTime + Number(effectTime - this.status.startTime) / 1e9;
|
|
123
127
|
}
|
|
124
128
|
}
|
|
125
129
|
const isEffectV4 = (() => {
|
|
@@ -194,13 +198,14 @@ function startSentrySpan(startInactiveSpan, options, parent, newTraceForRootSpan
|
|
|
194
198
|
return withActiveSpan(null, () => startInactiveSpan(options));
|
|
195
199
|
}
|
|
196
200
|
function createSentrySpan(startInactiveSpan, newTraceForRootSpans, name, parent, context, links, startTime, kind) {
|
|
197
|
-
const op = deriveOp(name);
|
|
198
|
-
const origin =
|
|
201
|
+
const op = deriveOp(name, kind);
|
|
202
|
+
const origin = op && "auto.http.effect";
|
|
203
|
+
const sentryStartTime = timestampInSeconds();
|
|
199
204
|
const newSpan = startSentrySpan(
|
|
200
205
|
startInactiveSpan,
|
|
201
206
|
{
|
|
202
207
|
name,
|
|
203
|
-
startTime:
|
|
208
|
+
startTime: sentryStartTime,
|
|
204
209
|
// Setting these to `undefined` would strip the core defaults instead of leaving them in place.
|
|
205
210
|
attributes: {
|
|
206
211
|
...op && { [SENTRY_OP]: op },
|
|
@@ -211,7 +216,7 @@ function createSentrySpan(startInactiveSpan, newTraceForRootSpans, name, parent,
|
|
|
211
216
|
newTraceForRootSpans
|
|
212
217
|
);
|
|
213
218
|
markEffectSpan(newSpan);
|
|
214
|
-
return new SentrySpanWrapper(name, parent, context, links, startTime, kind, newSpan);
|
|
219
|
+
return new SentrySpanWrapper(name, parent, context, links, startTime, kind, newSpan, sentryStartTime);
|
|
215
220
|
}
|
|
216
221
|
const makeSentryTracerV3 = (startInactiveSpan, newTraceForRootSpans) => {
|
|
217
222
|
return EffectTracer.make({
|
package/build/esm/tracer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tracer.js","sources":["../../src/tracer.ts"],"sourcesContent":["/* oxlint-disable max-lines */\nimport { SENTRY_OP, SENTRY_ORIGIN } from '@sentry/conventions/attributes';\nimport { HTTP_CLIENT, HTTP_SERVER } from '@sentry/conventions/op';\nimport type { Span, StartSpanOptions } from '@sentry/core';\nimport {\n _INTERNAL_safeMathRandom,\n addNonEnumerableProperty,\n getActiveSpan,\n getCurrentScope,\n getDefaultCurrentScope,\n isObjectLike,\n startNewTrace,\n withActiveSpan,\n withScope,\n} from '@sentry/core';\nimport * as Context from 'effect/Context';\nimport * as Exit from 'effect/Exit';\nimport type * as EffectLayer from 'effect/Layer';\nimport { succeed as succeedLayer } from 'effect/Layer';\nimport * as Option from 'effect/Option';\nimport * as EffectTracer from 'effect/Tracer';\n\nfunction deriveOrigin(name: string): string | undefined {\n if (name.startsWith('http.server') || name.startsWith('http.client')) {\n return 'auto.http.effect';\n }\n\n return undefined;\n}\n\nconst EFFECT_SPAN_SYMBOL = Symbol.for('@sentry/effect.EffectSpan');\n\nfunction markEffectSpan(span: Span): void {\n addNonEnumerableProperty(span, EFFECT_SPAN_SYMBOL, true);\n}\n\n/**\n * Whether this tracer created the span. A brand rather than an attribute check, because an unsampled\n * span keeps no attributes.\n */\nfunction isEffectSpan(span: Span): boolean {\n return (span as { [EFFECT_SPAN_SYMBOL]?: boolean })[EFFECT_SPAN_SYMBOL] === true;\n}\n\n/**\n * Effect span names are chosen by whoever calls `Effect.withSpan`, so the name is the only signal\n * available. `@effect/platform` names its HTTP spans `http.server`/`http.client`, which map onto the\n * matching Sentry ops. Every other name comes from user code or a third-party library, whose semantics\n * we cannot infer, so op and origin stay unset and the span keeps the core defaults: no op, and a\n * `manual` origin.\n */\nfunction deriveOp(name: string): string | undefined {\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 undefined;\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 hand different `startInactiveSpan` functions 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.\n */\nexport type StartInactiveSpan = (options: StartSpanOptions) => Span;\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 EXTERNAL_SPAN_KEY = '@sentry/effect/ExternalSpan';\n\ninterface ContextExports {\n Reference: typeof Context.Reference;\n /** Only Effect v3 exports it. */\n GenericTag<Identifier, Service>(key: string): Context.Key<Identifier, Service>;\n}\n\n// Effect v4 has no `Context.GenericTag` and Effect v3 before 3.11 has no `Context.Reference`. Both are read\n// through a separate binding because bundlers fail the build on a namespace member the installed version lacks.\nconst contextExports = Context as unknown as ContextExports;\n\n/**\n * Whether the tracer continues the trace of a `Tracer.externalSpan` parent. Effect v4 has no `FiberRef`\n * and v3 before 3.11 has no `Context.Reference`, so the flag is a plain service in both. The cast is safe:\n * the tracer reads it with `getRef` only on a v4 fiber, where it is a reference, and with\n * `Context.getOption` on v3.\n */\nconst ExternalSpanFlag = (\n isEffectV4\n ? contextExports.Reference<boolean>(EXTERNAL_SPAN_KEY, { defaultValue: () => false })\n : contextExports.GenericTag<never, boolean>(EXTERNAL_SPAN_KEY)\n) as Context.Reference<boolean>;\n\n/**\n * Makes the tracer continue the trace of a `Tracer.externalSpan` parent instead of ignoring it. Provide it\n * next to the tracer layer to continue every external span in the runtime, or provide it to a single\n * effect with `Effect.provide` to continue only that one.\n */\nexport const SentryEffectExternalSpanLayer: EffectLayer.Layer<never> = succeedLayer(ExternalSpanFlag, true);\n\ninterface FiberLike {\n /** The span the fiber runs in. Only Effect v3 fibers have it. */\n readonly currentSpan?: EffectTracer.AnySpan | undefined;\n /** Holds `span`, the span the fiber runs in. Only Effect v4 fibers have it. */\n readonly cache?: { readonly span?: EffectTracer.AnySpan | undefined };\n /** Reads a reference with its default. Only Effect v4 fibers have it. */\n readonly getRef?: <A>(ref: Context.Reference<A>) => A;\n /** The services of the fiber. Only Effect v3 fibers have it. */\n readonly currentContext?: Context.Context<never>;\n}\n\n/**\n * The fiber whose operation is being evaluated. Effect hands the fiber to the `context` hook but not to\n * `span`, which runs synchronously inside it, so the hook keeps the fiber here for that extent.\n */\nlet currentFiber: FiberLike | undefined;\n\nfunction continuesExternalSpans(fiber: FiberLike): boolean {\n if (fiber.getRef) {\n return fiber.getRef(ExternalSpanFlag);\n }\n\n return (\n fiber.currentContext !== undefined &&\n Option.getOrElse(Context.getOption(fiber.currentContext, ExternalSpanFlag), () => false)\n );\n}\n\nfunction getFiberSpan(fiber: FiberLike): EffectTracer.AnySpan | undefined {\n return isEffectV4 ? fiber.cache?.span : fiber.currentSpan;\n}\n\nfunction withFiberContext<X>(fiber: FiberLike, execution: () => X): X {\n const previousFiber = currentFiber;\n currentFiber = fiber;\n try {\n const currentSpan = getFiberSpan(fiber);\n if (currentSpan === undefined || !isSentrySpan(currentSpan)) {\n return execution();\n }\n return withActiveSpan(currentSpan.sentrySpan, execution);\n } finally {\n currentFiber = previousFiber;\n }\n}\n\n/**\n * Starts the Sentry span for an Effect span, rooted or parented the way Effect asked for.\n *\n * - A parent this tracer created becomes the Sentry parent.\n * - Any other parent (`Tracer.externalSpan` bridging a trace this SDK did not start, such as an\n * OpenTelemetry span of another app in the same process or persisted trace state) is ignored unless\n * {@link SentryEffectExternalSpanLayer} is provided, so a span joins a foreign trace only when the user\n * asked for it. The span then nests where Effect would have put it without the `parent` option: under\n * the fiber's current span, or parentless. With the layer, the span continues that trace: it is a root\n * span whose `parent_span_id` is the external span. No dynamic sampling context is frozen, so the SDK\n * builds one from the client the way it does for a head-of-trace span.\n * - Without a parent, the span nests under a foreign active Sentry span (an `http.server` span from the\n * Node SDK, a pageload in the browser) but never under a span this tracer created: Effect's own parent\n * tracking is authoritative for those, so an active one is an enclosing `root: true` span or a span\n * leaked from another fiber through the async context. Effect reports `root: true` for every\n * parentless span, so the flag adds nothing and is not consulted.\n * - A root span starts a new trace when `newTraceForRootSpans` is set, unless the user set up the\n * current scope (`Sentry.continueTrace`, `Sentry.withScope`, an HTTP request's isolation scope).\n */\nfunction startSentrySpan(\n startInactiveSpan: StartInactiveSpan,\n options: StartSpanOptions,\n parent: Option.Option<EffectTracer.AnySpan>,\n newTraceForRootSpans: boolean,\n): Span {\n if (Option.isSome(parent)) {\n const parentSpan = parent.value;\n\n if (isSentrySpan(parentSpan)) {\n return startInactiveSpan({ ...options, parentSpan: parentSpan.sentrySpan });\n }\n\n if (currentFiber !== undefined && continuesExternalSpans(currentFiber)) {\n return withScope(scope => {\n scope.setPropagationContext({\n traceId: parentSpan.traceId,\n parentSpanId: parentSpan.spanId,\n sampled: parentSpan.sampled,\n sampleRand: _INTERNAL_safeMathRandom(),\n });\n return withActiveSpan(null, () => startInactiveSpan(options));\n });\n }\n\n const enclosingSpan = currentFiber && getFiberSpan(currentFiber);\n if (enclosingSpan !== undefined && isSentrySpan(enclosingSpan)) {\n return startInactiveSpan({ ...options, parentSpan: enclosingSpan.sentrySpan });\n }\n }\n\n const activeSpan = getActiveSpan();\n if (activeSpan && !isEffectSpan(activeSpan)) {\n return startInactiveSpan({ ...options, parentSpan: activeSpan });\n }\n\n // A scope the user forked (`continueTrace`, `withScope`, an isolation scope) carries its own trace id.\n // The scopes this tracer forks in `context()` clone the propagation context they were forked from, so\n // even when one leaks into another fiber through the async context it still carries the process-wide\n // trace id of the default scope.\n const isProcessTrace =\n getCurrentScope().getPropagationContext().traceId === getDefaultCurrentScope().getPropagationContext().traceId;\n if (newTraceForRootSpans && isProcessTrace) {\n return startNewTrace(() => startInactiveSpan(options));\n }\n\n return withActiveSpan(null, () => startInactiveSpan(options));\n}\n\nfunction createSentrySpan(\n startInactiveSpan: StartInactiveSpan,\n newTraceForRootSpans: boolean,\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 op = deriveOp(name);\n const origin = deriveOrigin(name);\n\n const newSpan = startSentrySpan(\n startInactiveSpan,\n {\n name,\n startTime: nanosToHrTime(startTime),\n // Setting these to `undefined` would strip the core defaults instead of leaving them in place.\n attributes: {\n ...(op && { [SENTRY_OP]: op }),\n ...(origin && { [SENTRY_ORIGIN]: origin }),\n },\n },\n parent,\n newTraceForRootSpans,\n );\n markEffectSpan(newSpan);\n\n return new SentrySpanWrapper(name, parent, context, links, startTime, kind, newSpan);\n}\n\nconst makeSentryTracerV3 = (\n startInactiveSpan: StartInactiveSpan,\n newTraceForRootSpans: boolean,\n): 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, newTraceForRootSpans, name, parent, context, links, startTime, kind);\n },\n context(execution: () => unknown, fiber: FiberLike) {\n return withFiberContext(fiber, execution);\n },\n } as unknown as EffectTracer.Tracer);\n};\n\nconst makeSentryTracerV4 = (\n startInactiveSpan: StartInactiveSpan,\n newTraceForRootSpans: boolean,\n): 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 newTraceForRootSpans,\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 return withFiberContext(fiber, () => 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 *\n * `newTraceForRootSpans` is the one behavioural difference between the platforms: Effect gives every\n * parentless span a fresh trace id, and on a long-lived server nothing else forks the propagation\n * context, so the server tracer follows Effect and starts a new trace. In the browser the page trace is\n * the intended home of every span, so the client tracer keeps parentless spans in it.\n */\nexport function makeSentryTracer(\n startInactiveSpan: StartInactiveSpan,\n newTraceForRootSpans: boolean,\n): EffectTracer.Tracer {\n return isEffectV4\n ? makeSentryTracerV4(startInactiveSpan, newTraceForRootSpans)\n : makeSentryTracerV3(startInactiveSpan, newTraceForRootSpans);\n}\n"],"names":["succeedLayer"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tracer.js","sources":["../../src/tracer.ts"],"sourcesContent":["/* oxlint-disable max-lines */\nimport { SENTRY_OP, SENTRY_ORIGIN } from '@sentry/conventions/attributes';\nimport { HTTP_CLIENT, HTTP_SERVER } from '@sentry/conventions/op';\nimport type { Span, StartSpanOptions } from '@sentry/core';\nimport {\n _INTERNAL_safeMathRandom,\n addNonEnumerableProperty,\n getActiveSpan,\n getCurrentScope,\n getDefaultCurrentScope,\n isObjectLike,\n startNewTrace,\n timestampInSeconds,\n withActiveSpan,\n withScope,\n} from '@sentry/core';\nimport * as Context from 'effect/Context';\nimport * as Exit from 'effect/Exit';\nimport type * as EffectLayer from 'effect/Layer';\nimport { succeed as succeedLayer } from 'effect/Layer';\nimport * as Option from 'effect/Option';\nimport * as EffectTracer from 'effect/Tracer';\n\nconst EFFECT_SPAN_SYMBOL = Symbol.for('@sentry/effect.EffectSpan');\n\nfunction markEffectSpan(span: Span): void {\n addNonEnumerableProperty(span, EFFECT_SPAN_SYMBOL, true);\n}\n\n/**\n * Whether this tracer created the span. A brand rather than an attribute check, because an unsampled\n * span keeps no attributes.\n */\nfunction isEffectSpan(span: Span): boolean {\n return (span as { [EFFECT_SPAN_SYMBOL]?: boolean })[EFFECT_SPAN_SYMBOL] === true;\n}\n\nconst HTTP_METHODS = new Set(['GET', 'HEAD', 'POST', 'PUT', 'DELETE', 'CONNECT', 'OPTIONS', 'TRACE', 'PATCH']);\n\n/**\n * Effect span names are chosen by whoever calls `Effect.withSpan`, so the name and the kind are the only\n * signals available. Effect names its HTTP spans `http.server <method>`/`http.client <method>` (Effect v3\n * and v4 before 4.0.2) or only `<method>` with a `server`/`client` kind (Effect 4.0.2 and later), which map\n * onto the matching Sentry ops. Every other span comes from user code or a third-party library, whose\n * semantics we cannot infer, so op and origin stay unset and the span keeps the core defaults: no op, and\n * a `manual` origin.\n */\nfunction deriveOp(name: string, kind: EffectTracer.SpanKind): string | undefined {\n if (name.startsWith('http.server') || (kind === 'server' && HTTP_METHODS.has(name))) {\n return HTTP_SERVER;\n }\n\n if (name.startsWith('http.client') || (kind === 'client' && HTTP_METHODS.has(name))) {\n return HTTP_CLIENT;\n }\n\n return undefined;\n}\n\nconst SENTRY_SPAN_SYMBOL = Symbol.for('@sentry/effect.SentrySpan');\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 private readonly _sentryStartTime: number;\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 sentryStartTime: number,\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 this._sentryStartTime = sentryStartTime;\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(this._toSentryTime(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], this._toSentryTime(startTime));\n }\n\n /**\n * Converts an Effect time to Sentry's clock by adding its offset from the span's start.\n *\n * Effect's clock doesn't correct for clock drift (e.g. after the device slept), so its absolute times can be off\n * from the Sentry spans around this one. Its durations are still correct, and this way we also respect end times\n * that were passed explicitly.\n */\n private _toSentryTime(effectTime: bigint): number | undefined {\n // Effect passes 0 if tracer timing is disabled. Sentry then takes the current time.\n if (!effectTime || !this.status.startTime) {\n return undefined;\n }\n\n return this._sentryStartTime + Number(effectTime - this.status.startTime) / 1e9;\n }\n}\n\n/**\n * The client and the server entry hand different `startInactiveSpan` functions 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.\n */\nexport type StartInactiveSpan = (options: StartSpanOptions) => Span;\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 EXTERNAL_SPAN_KEY = '@sentry/effect/ExternalSpan';\n\ninterface ContextExports {\n Reference: typeof Context.Reference;\n /** Only Effect v3 exports it. */\n GenericTag<Identifier, Service>(key: string): Context.Key<Identifier, Service>;\n}\n\n// Effect v4 has no `Context.GenericTag` and Effect v3 before 3.11 has no `Context.Reference`. Both are read\n// through a separate binding because bundlers fail the build on a namespace member the installed version lacks.\nconst contextExports = Context as unknown as ContextExports;\n\n/**\n * Whether the tracer continues the trace of a `Tracer.externalSpan` parent. Effect v4 has no `FiberRef`\n * and v3 before 3.11 has no `Context.Reference`, so the flag is a plain service in both. The cast is safe:\n * the tracer reads it with `getRef` only on a v4 fiber, where it is a reference, and with\n * `Context.getOption` on v3.\n */\nconst ExternalSpanFlag = (\n isEffectV4\n ? contextExports.Reference<boolean>(EXTERNAL_SPAN_KEY, { defaultValue: () => false })\n : contextExports.GenericTag<never, boolean>(EXTERNAL_SPAN_KEY)\n) as Context.Reference<boolean>;\n\n/**\n * Makes the tracer continue the trace of a `Tracer.externalSpan` parent instead of ignoring it. Provide it\n * next to the tracer layer to continue every external span in the runtime, or provide it to a single\n * effect with `Effect.provide` to continue only that one.\n */\nexport const SentryEffectExternalSpanLayer: EffectLayer.Layer<never> = succeedLayer(ExternalSpanFlag, true);\n\ninterface FiberLike {\n /** The span the fiber runs in. Only Effect v3 fibers have it. */\n readonly currentSpan?: EffectTracer.AnySpan | undefined;\n /** Holds `span`, the span the fiber runs in. Only Effect v4 fibers have it. */\n readonly cache?: { readonly span?: EffectTracer.AnySpan | undefined };\n /** Reads a reference with its default. Only Effect v4 fibers have it. */\n readonly getRef?: <A>(ref: Context.Reference<A>) => A;\n /** The services of the fiber. Only Effect v3 fibers have it. */\n readonly currentContext?: Context.Context<never>;\n}\n\n/**\n * The fiber whose operation is being evaluated. Effect hands the fiber to the `context` hook but not to\n * `span`, which runs synchronously inside it, so the hook keeps the fiber here for that extent.\n */\nlet currentFiber: FiberLike | undefined;\n\nfunction continuesExternalSpans(fiber: FiberLike): boolean {\n if (fiber.getRef) {\n return fiber.getRef(ExternalSpanFlag);\n }\n\n return (\n fiber.currentContext !== undefined &&\n Option.getOrElse(Context.getOption(fiber.currentContext, ExternalSpanFlag), () => false)\n );\n}\n\nfunction getFiberSpan(fiber: FiberLike): EffectTracer.AnySpan | undefined {\n return isEffectV4 ? fiber.cache?.span : fiber.currentSpan;\n}\n\nfunction withFiberContext<X>(fiber: FiberLike, execution: () => X): X {\n const previousFiber = currentFiber;\n currentFiber = fiber;\n try {\n const currentSpan = getFiberSpan(fiber);\n if (currentSpan === undefined || !isSentrySpan(currentSpan)) {\n return execution();\n }\n return withActiveSpan(currentSpan.sentrySpan, execution);\n } finally {\n currentFiber = previousFiber;\n }\n}\n\n/**\n * Starts the Sentry span for an Effect span, rooted or parented the way Effect asked for.\n *\n * - A parent this tracer created becomes the Sentry parent.\n * - Any other parent (`Tracer.externalSpan` bridging a trace this SDK did not start, such as an\n * OpenTelemetry span of another app in the same process or persisted trace state) is ignored unless\n * {@link SentryEffectExternalSpanLayer} is provided, so a span joins a foreign trace only when the user\n * asked for it. The span then nests where Effect would have put it without the `parent` option: under\n * the fiber's current span, or parentless. With the layer, the span continues that trace: it is a root\n * span whose `parent_span_id` is the external span. No dynamic sampling context is frozen, so the SDK\n * builds one from the client the way it does for a head-of-trace span.\n * - Without a parent, the span nests under a foreign active Sentry span (an `http.server` span from the\n * Node SDK, a pageload in the browser) but never under a span this tracer created: Effect's own parent\n * tracking is authoritative for those, so an active one is an enclosing `root: true` span or a span\n * leaked from another fiber through the async context. Effect reports `root: true` for every\n * parentless span, so the flag adds nothing and is not consulted.\n * - A root span starts a new trace when `newTraceForRootSpans` is set, unless the user set up the\n * current scope (`Sentry.continueTrace`, `Sentry.withScope`, an HTTP request's isolation scope).\n */\nfunction startSentrySpan(\n startInactiveSpan: StartInactiveSpan,\n options: StartSpanOptions,\n parent: Option.Option<EffectTracer.AnySpan>,\n newTraceForRootSpans: boolean,\n): Span {\n if (Option.isSome(parent)) {\n const parentSpan = parent.value;\n\n if (isSentrySpan(parentSpan)) {\n return startInactiveSpan({ ...options, parentSpan: parentSpan.sentrySpan });\n }\n\n if (currentFiber !== undefined && continuesExternalSpans(currentFiber)) {\n return withScope(scope => {\n scope.setPropagationContext({\n traceId: parentSpan.traceId,\n parentSpanId: parentSpan.spanId,\n sampled: parentSpan.sampled,\n sampleRand: _INTERNAL_safeMathRandom(),\n });\n return withActiveSpan(null, () => startInactiveSpan(options));\n });\n }\n\n const enclosingSpan = currentFiber && getFiberSpan(currentFiber);\n if (enclosingSpan !== undefined && isSentrySpan(enclosingSpan)) {\n return startInactiveSpan({ ...options, parentSpan: enclosingSpan.sentrySpan });\n }\n }\n\n const activeSpan = getActiveSpan();\n if (activeSpan && !isEffectSpan(activeSpan)) {\n return startInactiveSpan({ ...options, parentSpan: activeSpan });\n }\n\n // A scope the user forked (`continueTrace`, `withScope`, an isolation scope) carries its own trace id.\n // The scopes this tracer forks in `context()` clone the propagation context they were forked from, so\n // even when one leaks into another fiber through the async context it still carries the process-wide\n // trace id of the default scope.\n const isProcessTrace =\n getCurrentScope().getPropagationContext().traceId === getDefaultCurrentScope().getPropagationContext().traceId;\n if (newTraceForRootSpans && isProcessTrace) {\n return startNewTrace(() => startInactiveSpan(options));\n }\n\n return withActiveSpan(null, () => startInactiveSpan(options));\n}\n\nfunction createSentrySpan(\n startInactiveSpan: StartInactiveSpan,\n newTraceForRootSpans: boolean,\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 op = deriveOp(name, kind);\n const origin = op && 'auto.http.effect';\n\n // Effect calls the tracer when the span starts, so we start it on Sentry's clock and convert later Effect times\n // relative to this (see `_toSentryTime`).\n const sentryStartTime = timestampInSeconds();\n const newSpan = startSentrySpan(\n startInactiveSpan,\n {\n name,\n startTime: sentryStartTime,\n // Setting these to `undefined` would strip the core defaults instead of leaving them in place.\n attributes: {\n ...(op && { [SENTRY_OP]: op }),\n ...(origin && { [SENTRY_ORIGIN]: origin }),\n },\n },\n parent,\n newTraceForRootSpans,\n );\n markEffectSpan(newSpan);\n\n return new SentrySpanWrapper(name, parent, context, links, startTime, kind, newSpan, sentryStartTime);\n}\n\nconst makeSentryTracerV3 = (\n startInactiveSpan: StartInactiveSpan,\n newTraceForRootSpans: boolean,\n): 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, newTraceForRootSpans, name, parent, context, links, startTime, kind);\n },\n context(execution: () => unknown, fiber: FiberLike) {\n return withFiberContext(fiber, execution);\n },\n } as unknown as EffectTracer.Tracer);\n};\n\nconst makeSentryTracerV4 = (\n startInactiveSpan: StartInactiveSpan,\n newTraceForRootSpans: boolean,\n): 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 newTraceForRootSpans,\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 return withFiberContext(fiber, () => 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 *\n * `newTraceForRootSpans` is the one behavioural difference between the platforms: Effect gives every\n * parentless span a fresh trace id, and on a long-lived server nothing else forks the propagation\n * context, so the server tracer follows Effect and starts a new trace. In the browser the page trace is\n * the intended home of every span, so the client tracer keeps parentless spans in it.\n */\nexport function makeSentryTracer(\n startInactiveSpan: StartInactiveSpan,\n newTraceForRootSpans: boolean,\n): EffectTracer.Tracer {\n return isEffectV4\n ? makeSentryTracerV4(startInactiveSpan, newTraceForRootSpans)\n : makeSentryTracerV3(startInactiveSpan, newTraceForRootSpans);\n}\n"],"names":["succeedLayer"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tracer.d.ts","sourceRoot":"","sources":["../../src/tracer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"tracer.d.ts","sourceRoot":"","sources":["../../src/tracer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAe3D,OAAO,KAAK,KAAK,WAAW,MAAM,cAAc,CAAC;AAGjD,OAAO,KAAK,YAAY,MAAM,eAAe,CAAC;AA2L9C;;;;GAIG;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,EAAE,gBAAgB,KAAK,IAAI,CAAC;AA2CpE;;;;GAIG;AACH,eAAO,MAAM,6BAA6B,EAAE,WAAW,CAAC,KAAK,CAAC,KAAK,CAAwC,CAAC;AAsM5G;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAC9B,iBAAiB,EAAE,iBAAiB,EACpC,oBAAoB,EAAE,OAAO,GAC5B,YAAY,CAAC,MAAM,CAIrB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sentry/effect",
|
|
3
|
-
"version": "11.
|
|
3
|
+
"version": "11.6.0",
|
|
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.
|
|
47
|
+
"@sentry/browser": "11.6.0",
|
|
48
48
|
"@sentry/conventions": "^0.26.0",
|
|
49
|
-
"@sentry/core": "11.
|
|
50
|
-
"@sentry/node": "11.
|
|
49
|
+
"@sentry/core": "11.6.0",
|
|
50
|
+
"@sentry/node": "11.6.0"
|
|
51
51
|
},
|
|
52
52
|
"peerDependencies": {
|
|
53
53
|
"effect": "^3.0.0 || ^4.0.0"
|