EdgeAIG's picture
download
raw
8.67 kB
/**
* Defines the low-level tracing model used by Effect.
*
* A span records the lifetime of an operation, including its name, parent,
* attributes, links, annotations, sampling decision, kind, and completion
* status. The module also defines the tracer service, parent-span context,
* external span support, trace propagation settings, and the default in-memory
* span implementation.
*
* @since 2.0.0
*/
import * as Context from "./Context.js";
import { constFalse } from "./Function.js";
import * as Option from "./Option.js";
const evaluate = "~effect/Effect/evaluate";
/**
* Defines the string key for the parent-span context service.
*
* **When to use**
*
* Use when you need the raw context key for parent span lookup in lower-level
* tracing code.
*
* **Example** (Reading the parent span key)
*
* ```ts
* import { Tracer } from "effect"
*
* // The key used to identify parent spans in the context
* console.log(Tracer.ParentSpanKey) // "effect/Tracer/ParentSpan"
* ```
*
* @category constants
* @since 4.0.0
*/
export const ParentSpanKey = "effect/Tracer/ParentSpan";
/**
* Context service containing the `Span` or `ExternalSpan` to use as the parent
* of newly-created child spans.
*
* **Example** (Accessing the parent span)
*
* ```ts
* import { Effect, Tracer } from "effect"
*
* // Access the parent span from the context
* const program = Effect.gen(function*() {
* const parentSpan = yield* Effect.service(Tracer.ParentSpan)
* console.log(`Parent span: ${parentSpan.spanId}`)
* })
* ```
*
* @category services
* @since 2.0.0
*/
export class ParentSpan extends /*#__PURE__*/Context.Service()(ParentSpanKey) {}
/**
* Creates a `Tracer` value from a tracer implementation object.
*
* **When to use**
*
* Use to create a custom tracing backend value that Effect can use when
* creating spans.
*
* **Details**
*
* `make` returns the supplied implementation object unchanged. The object must
* satisfy the `Tracer` contract, including a `span` method that returns a
* `Span`.
*
* @see {@link Span} for the span values returned by tracer implementations
*
* @category constructors
* @since 2.0.0
*/
export const make = options => options;
/**
* Creates an `ExternalSpan` from trace and span identifiers, defaulting
* `sampled` to `true` and annotations to an empty context when they are not
* provided.
*
* **Example** (Creating an external span)
*
* ```ts
* import { Effect, Tracer } from "effect"
*
* // Create an external span from another tracing system
* const span = Tracer.externalSpan({
* spanId: "span-abc-123",
* traceId: "trace-xyz-789",
* sampled: true
* })
*
* // Use the external span as a parent
* const program = Effect.succeed("Hello").pipe(
* Effect.withSpan("child-operation", { parent: span })
* )
* ```
*
* @category constructors
* @since 2.0.0
*/
export const externalSpan = options => ({
_tag: "ExternalSpan",
spanId: options.spanId,
traceId: options.traceId,
sampled: options.sampled ?? true,
annotations: options.annotations ?? Context.empty()
});
/**
* Context reference for disabling trace propagation.
*
* **When to use**
*
* Use to prevent spans in a scope from propagating tracing context.
*
* **Details**
*
* When enabled on fiber or span annotations, new spans are created as
* non-propagating no-op spans and disabled spans are skipped when deriving a
* parent span.
*
* **Example** (Disabling span propagation)
*
* ```ts
* import { Effect, Tracer } from "effect"
*
* // Disable span propagation for a specific effect
* const program = Effect.gen(function*() {
* yield* Effect.log("This will not propagate parent span")
* }).pipe(
* Effect.provideService(Tracer.DisablePropagation, true)
* )
* ```
*
* @category references
* @since 3.12.0
*/
export const DisablePropagation = /*#__PURE__*/Context.Reference("effect/Tracer/DisablePropagation", {
defaultValue: constFalse
});
/**
* Context reference for controlling the current trace level for dynamic filtering.
*
* **When to use**
*
* Use to set the default trace level for spans in a scope when span options do
* not provide `level`.
*
* **Details**
*
* The default value is `"Info"`. Span creation uses `options.level ??
* CurrentTraceLevel` before applying `MinimumTraceLevel`.
*
* @see {@link MinimumTraceLevel} for the threshold that decides whether spans at that level are sampled
*
* @category references
* @since 4.0.0
*/
export const CurrentTraceLevel = /*#__PURE__*/Context.Reference("effect/Tracer/CurrentTraceLevel", {
defaultValue: () => "Info"
});
/**
* Context reference for setting the minimum trace level threshold. Spans and their
* descendants below this level will have their sampling decision forced to
* false, preventing them from being exported.
*
* **When to use**
*
* Use to set the trace-level threshold that controls whether spans are sampled
* by default.
*
* **Details**
*
* The default value is `"All"`. Span creation compares the span level from
* `options.level ?? CurrentTraceLevel` against this threshold.
*
* **Gotchas**
*
* Explicit `options.sampled` bypasses threshold computation.
*
* @see {@link CurrentTraceLevel} for the default span level used when options do not specify one
*
* @category references
* @since 4.0.0
*/
export const MinimumTraceLevel = /*#__PURE__*/Context.Reference("effect/Tracer/MinimumTraceLevel", {
defaultValue: () => "All"
});
/**
* Defines the string key for the active tracer context reference.
*
* **When to use**
*
* Use when you need the raw context key for active tracer lookup in lower-level
* tracing code.
*
* @category references
* @since 4.0.0
*/
export const TracerKey = "effect/Tracer";
/**
* Context reference for the active tracer service. By default it uses the
* native tracer, which creates `NativeSpan` instances.
*
* **Example** (Accessing the current tracer)
*
* ```ts
* import { Effect, Tracer } from "effect"
*
* // Access the current tracer from the context
* const program = Effect.gen(function*() {
* const tracer = yield* Effect.service(Tracer.Tracer)
* console.log("Using current tracer")
* })
*
* // Or use the built-in tracer effect
* const tracerEffect = Effect.gen(function*() {
* const tracer = yield* Effect.tracer
* console.log("Current tracer obtained")
* })
* ```
*
* @category references
* @since 2.0.0
*/
export const Tracer = /*#__PURE__*/Context.Reference(TracerKey, {
defaultValue: () => make({
span: options => new NativeSpan(options)
})
});
/**
* Default in-memory `Span` implementation used by the native tracer. It
* generates span and trace identifiers, stores attributes, events, and links,
* and records `Started` or `Ended` status.
*
* **Details**
*
* The constructor initializes the span with `Started` status, inherits the
* parent trace id or generates a new one, and always generates a new span id.
* Attributes, events, links, and status are then mutated through `Span` methods.
*
* @see {@link Span} for the interface implemented by native spans
*
* @category native tracer
* @since 4.0.0
*/
export class NativeSpan {
_tag = "Span";
spanId;
traceId = "native";
sampled;
name;
parent;
annotations;
links;
startTime;
kind;
status;
attributes;
events = [];
constructor(options) {
this.name = options.name;
this.parent = options.parent;
this.annotations = options.annotations;
this.links = options.links;
this.startTime = options.startTime;
this.kind = options.kind;
this.sampled = options.sampled;
this.status = {
_tag: "Started",
startTime: options.startTime
};
this.attributes = new Map();
this.traceId = Option.getOrUndefined(options.parent)?.traceId ?? randomHexString(32);
this.spanId = randomHexString(16);
}
end(endTime, exit) {
this.status = {
_tag: "Ended",
endTime,
exit,
startTime: this.status.startTime
};
}
attribute(key, value) {
this.attributes.set(key, value);
}
event(name, startTime, attributes) {
this.events.push([name, startTime, attributes ?? {}]);
}
addLinks(links) {
// oxlint-disable-next-line no-restricted-syntax
this.links.push(...links);
}
}
const randomHexString = /*#__PURE__*/function () {
const characters = "abcdef0123456789";
const charactersLength = characters.length;
return function (length) {
let result = "";
for (let i = 0; i < length; i++) {
result += characters.charAt(Math.floor(Math.random() * charactersLength));
}
return result;
};
}();
//# sourceMappingURL=Tracer.js.map

Xet Storage Details

Size:
8.67 kB
·
Xet hash:
08d1f2d7e2967d0e844b74d18905383ce65f2bc6477a0a30006e2fcba67732b8

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.