Installs and configures OpenTelemetry tracing for Effect applications, including exporter wiring, environment configuration, and validation workflow. Use when telemetry is requested and the repository does not already have OTEL configured.
Use this skill to bootstrap OpenTelemetry tracing for an Effect repository from scratch.
This skill owns installation and baseline runtime wiring.
Instrumentation strategy belongs in observability-tracing-otel.
Only run this setup when the user requests telemetry installation or repair.
Node, Bun, worker, browser).service.name, environment, version).Start with the same package set used in Effect tracing examples.
Recommended baseline (adjust to runtime requirements):
bun add @effect/opentelemetry @opentelemetry/api @opentelemetry/sdk-trace-base @opentelemetry/sdk-trace-node @opentelemetry/exporter-trace-otlp-http
Optional for early smoke tests:
@opentelemetry/sdk-trace-web for browser targets@opentelemetry/sdk-metrics when metrics export is also requestedFollow repository rules: do not read process.env directly in new code.
src/env.ts (AppEnv)..env.example.AppEnv values when building telemetry configuration.Suggested fields:
otelServiceNameotelExporterOtlpEndpointotelTracesSamplerotelTracesSamplerArgCreate a dedicated module such as src/telemetry.ts and keep setup at the boundary.
Console exporter variant (smoke-test friendly):
import { NodeSdk } from "@effect/opentelemetry";
import { BatchSpanProcessor } from "@opentelemetry/sdk-trace-base";
import { ConsoleSpanExporter } from "@opentelemetry/sdk-trace-base";
export const NodeSdkLive = NodeSdk.layer(() => ({
resource: {
serviceName: "example-service",
},
spanProcessor: new BatchSpanProcessor(new ConsoleSpanExporter()),
}));
OTLP exporter variant (backend integration):
import { NodeSdk } from "@effect/opentelemetry";
import { BatchSpanProcessor } from "@opentelemetry/sdk-trace-base";
import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-http";
export const NodeSdkLive = NodeSdk.layer(() => ({
resource: {
serviceName: "example-service",
},
spanProcessor: new BatchSpanProcessor(
new OTLPTraceExporter({
url: "http://localhost:4318/v1/traces",
}),
),
}));
Merge/provide telemetry once at bootstrap.
Do not scatter Effect.provide(...) calls throughout domain modules.
import { Effect, Layer } from "effect";
const RuntimeLayer = Layer.mergeAll(AppEnv.Default, NodeSdkLive, AppLayer);
const runnable = program.pipe(
Effect.provide(RuntimeLayer),
);
Effect.withSpan(...).Local smoke check using console exporter:
Local visualization check using OTLP backend:
Recommended default:
observability-tracing-otel for span architecture and instrumentation.observability-wide-events for wide structured event contracts.operation, IDs, status).AppEnv.