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)));