1import * as Layer from "effect/Layer";
2import * as Tracer from "effect/Tracer";
3
4import { randomUUID } from "../lib/utils";
5
6/** `service.instance.id` for this page load, shared by every resource the UI exports. */
7export const serviceInstanceId = randomUUID();
8
9let delegate: Tracer.Tracer | null = null;
10
11export function setDelegate(next: Tracer.Tracer | null): void {
12 delegate = next;
13}
14
15export function hasDelegate(): boolean {
16 return delegate !== null;
17}
18
19// Install before exporters exist so spans reach whichever exporter is configured later.
20export const layer = Layer.succeed(
21 Tracer.Tracer,
22 Tracer.make({
23 span(options) {
24 return delegate?.span(options) ?? new Tracer.NativeSpan(options);
25 },
26 }),
27);