Choose your language
Python

.NET

Java

Kotlin
Node.js / JavaScript

Go

Ruby

PHP

Erlang / Elixir

Rust

C++

Swift
How OTel logging works
OpenTelemetry provides a Log Bridge API. You attach an OTel handler or appender to your existing logging framework — Logback, Python’slogging, ILogger, Winston, and so on. Every log record your application emits passes through the bridge, which enriches it with structured metadata and forwards it to the OTel exporter.
Nothing in your application code changes. logger.info(), log.warn(), console.log() — all of these keep working exactly as before.
What the bridge adds
Here is the same log event before and after the bridge:trace_id and span_id were injected automatically because this log was emitted inside a traced request. The service.name and service.namespace were set once at application startup and are now attached to every log record — no per-statement boilerplate.
Why it’s worth adopting
Automatic trace correlation When a log is emitted inside a traced request, the activetrace_id and span_id are injected automatically — no manual MDC propagation or context threading needed. In Bronto, trace_id is a queryable field. Click it to jump from a log line directly to the corresponding trace.
Structured by default
Every OTel log record follows a defined schema: timestamp, severity, body, attributes, resource, and instrumentation_scope. Not “structured if you remembered to configure JSON output” — structured unconditionally, in a format Bronto understands natively.
Service identity is automatic
service.name and service.namespace are Resource attributes — set once at SDK initialisation, then attached to every log record that process emits. You do not add them to individual log statements. In Bronto, they map directly to Dataset and Collection with no extra configuration.
Semantic conventions
OTel defines standard attribute names across all languages: http.request.method, exception.type, db.system, user.id, and hundreds more. When all your services use the same attribute names, your Bronto queries work identically regardless of which language or framework emitted the log.
One pipeline for logs, traces, and metrics
Logs, traces, and metrics all flow through the same OTel SDK and exporter. One endpoint URL, one API key, one exporter configuration. Adding traces later (Phase 2) means extending existing setup — not wiring a new pipeline.
Vendor portability
OTLP is an open standard. Switching your observability backend requires changing one endpoint URL, not rewriting instrumentation.
Zero code churn
Adoption is a configuration change, not a refactor. Existing log statements are untouched.
How OTel concepts map to Bronto
| OTel concept | Bronto concept | How it’s set |
|---|---|---|
service.name | Dataset | Resource attribute at SDK init |
service.namespace | Collection | Resource attribute at SDK init |
trace_id / span_id | Queryable fields | Automatic when tracing is active |
severity | Log level | Mapped from OTel SeverityNumber |
attributes | Searchable fields | Any key/value on the log record |
deployment.environment | Searchable field | Resource attribute at SDK init |
Endpoints
| Region | Logs | Traces |
|---|---|---|
| EU | https://ingestion.eu.bronto.io/v1/logs | https://ingestion.eu.bronto.io/v1/traces |
| US | https://ingestion.us.bronto.io/v1/logs | https://ingestion.us.bronto.io/v1/traces |
x-bronto-api-key: <YOUR_API_KEY>. See API Keys for how to create one.

