Skip to main content
effect-orpc creates Effect spans around procedures. To export them, include an OpenTelemetry layer in your application runtime.

Install OpenTelemetry packages

Install packages
bun add @effect/opentelemetry @opentelemetry/exporter-trace-otlp-http @opentelemetry/sdk-trace-base

Create a tracing layer

tracing.ts
import { NodeSdk } from "@effect/opentelemetry";
import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-http";
import { BatchSpanProcessor } from "@opentelemetry/sdk-trace-base";

const NodeSdkLive = NodeSdk.layer(() => ({
  resource: { serviceName: "my-api" },
  spanProcessor: new BatchSpanProcessor(
    new OTLPTraceExporter({
      url: "http://localhost:4318/v1/traces",
    }),
  ),
}));

Add it to your runtime

runtime.ts
const AppLive = Layer.mergeAll(UsersRepo.Default).pipe(
  Layer.provideMerge(NodeSdkLive),
);

export const runtime = ManagedRuntime.make(AppLive);
export const effectProcedure = makeEffectORPC(runtime);

Customize procedure span names

custom-span.ts
const getUser = effectProcedure
  .traced("users.get_by_id")
  .input(z.object({ id: z.string() }))
  .effect(function* ({ input }) {
    return yield* UsersRepo.findById(input.id);
  });

Local collector

The repository Hono example includes an optional telemetry stack.
Run collector
cd examples/hono
docker compose up

Next step

Review the Tracing capability for how spans are named by default.
Last modified on June 15, 2026