effect-orpc creates Effect spans around procedures. To export them, include an OpenTelemetry layer in your application runtime.
Install OpenTelemetry packages
bun add @effect/opentelemetry @opentelemetry/exporter-trace-otlp-http @opentelemetry/sdk-trace-base
Create a tracing layer
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
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
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.
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