Trouble using OpenTelemetry context with Effect layers for tracing
How do I use the global opentelemetry context while setting up my layers? I've tried to provide the global tracer provider to the effect layer, but I'm still not able to export any traces from the
thirdPartyLibFnthirdPartyLibFn.import { NodeSdk, Tracer } from "@effect/opentelemetry";
import { context, trace, type SpanContext } from "@opentelemetry/api";
import {
ConsoleSpanExporter,
SimpleSpanProcessor,
} from "@opentelemetry/sdk-trace-base";
import { Effect, Layer } from "effect";
const thirdPartyLibFn = async (parentSpanContext?: SpanContext) => {
if (parentSpanContext) {
trace.setSpanContext(context.active(), parentSpanContext);
}
const t = trace.getTracer("langfuse");
const s = t.startSpan("plain-otel-span");
await new Promise((resolve) => setTimeout(resolve, 1000));
s.end();
};
const program = Effect.gen(function* () {
yield* Effect.promise(() => thirdPartyLibFn());
});
const NodeSdkLive = Layer.provideMerge(
Layer.sync(Tracer.OtelTracerProvider, () => trace.getTracerProvider()),
NodeSdk.layer(() => ({
resource: { serviceName: "example" },
spanProcessor: [new SimpleSpanProcessor(new ConsoleSpanExporter())],
}))
);
void Effect.runPromise(program.pipe(Effect.provide(NodeSdkLive)));import { NodeSdk, Tracer } from "@effect/opentelemetry";
import { context, trace, type SpanContext } from "@opentelemetry/api";
import {
ConsoleSpanExporter,
SimpleSpanProcessor,
} from "@opentelemetry/sdk-trace-base";
import { Effect, Layer } from "effect";
const thirdPartyLibFn = async (parentSpanContext?: SpanContext) => {
if (parentSpanContext) {
trace.setSpanContext(context.active(), parentSpanContext);
}
const t = trace.getTracer("langfuse");
const s = t.startSpan("plain-otel-span");
await new Promise((resolve) => setTimeout(resolve, 1000));
s.end();
};
const program = Effect.gen(function* () {
yield* Effect.promise(() => thirdPartyLibFn());
});
const NodeSdkLive = Layer.provideMerge(
Layer.sync(Tracer.OtelTracerProvider, () => trace.getTracerProvider()),
NodeSdk.layer(() => ({
resource: { serviceName: "example" },
spanProcessor: [new SimpleSpanProcessor(new ConsoleSpanExporter())],
}))
);
void Effect.runPromise(program.pipe(Effect.provide(NodeSdkLive)));