Skip to content

OpenTelemetry Bridge

Import from loggily/otel. Works everywhere. Requires @opentelemetry/api as a peer dependency.

Forwards loggily events to any OTLP-compatible backend (Jaeger, Grafana, Datadog, etc.). The stage is transparent — events pass through unchanged to subsequent pipeline elements.

Quick Start

typescript
import * as otelApi from "@opentelemetry/api"
import { createLogger } from "loggily"
import { toOtel } from "loggily/otel"

const log = createLogger("myapp", [toOtel({ api: otelApi }), console])

log.info?.("request handled", { status: 200 })
// → forwarded to OTLP backend AND printed to console

API

ExportDescription
toOtel(options?)Pipeline stage that forwards events to OpenTelemetry
OtelBridgeOptionsOptions type

Options

typescript
interface OtelBridgeOptions {
  api: typeof import("@opentelemetry/api") // required
  loggerName?: string // OTLP logger name (default: "loggily")
  tracerName?: string // OTLP tracer name (default: "loggily")
  logs?: boolean // forward log events (default: true)
  spans?: boolean // forward span events (default: true)
}

How it works

toOtel() is a regular pipeline stage — it receives events, forwards them to OpenTelemetry, and passes them through unchanged. This means you can place it anywhere in your pipeline:

typescript
const log = createLogger("myapp", [
  { level: "info" },
  toOtel({ api: otelApi }), // forward to OTLP
  console, // also print to console
  { file: "/tmp/app.log" }, // also write to file
])

Set logs: false or spans: false to forward only one event type:

typescript
// Only forward spans to OTLP, handle logs locally
toOtel({ api: otelApi, logs: false })

When to use this vs raw OpenTelemetry

Use this bridge when you want loggily's API (conditional ?., config pipeline, namespace hierarchy) but need to export to an OTLP backend. For full auto-instrumentation (HTTP, database, gRPC), use OpenTelemetry's SDK directly.