Effect CommunityEC
Effect Community5mo ago
18 replies
adama

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 thirdPartyLibFn.

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)));
Was this page helpful?