NodeSDK wires all three signals to one resource identity, and the auto-instrumentations package traces Express, Fastify, HTTP, gRPC, and database clients β and bridges Winston and Pino output into the OTLP logs pipeline β with no changes to your application code.
The application exports to an OpenTelemetry Collector, which forwards to Bronto. If you donβt run a Collector, export directly to Bronto instead β the code is identical, only two environment variables change.
Prerequisites
- Node.js 18 or later
- An OTel Collector reachable from your application, with
logs,metrics, andtracespipelines forwarding to Bronto β see Connect OpenTelemetry Collector to Bronto
Install dependencies
Configure the environment
The SDK reads its endpoint and identity from environment variables, so nothing in the code below is environment-specific./v1/logs, /v1/metrics, /v1/traces) to OTEL_EXPORTER_OTLP_ENDPOINT automatically.
Two resource attributes determine how Bronto organises your data:
http://localhost:4318 is the standard OTLP/HTTP address for a Collector on the same host. Use the address reachable from your application if the Collector runs in another container, pod, or host. No authentication is needed between the application and the Collector β the Collector holds the Bronto API key.Initialise the SDK
instrumentation.js
For ESM projects, use
node --import ./instrumentation.mjs app.js and the register() hook β see Node.js instrumentation setup.Instrument your application
Existing Winston and Pino calls need no changes β the auto-instrumentations bridge them into the OTLP logs pipeline and attachtrace_id and span_id to any log emitted inside an active span, so you can jump from a log line to its trace in Bronto.
For spans and metrics around your own business logic:
payment.js
Verify
Run your application, then check each signal in Bronto, filtering by theservice.name you set:
- Logs β the Search page, in the dataset named after your service
- Metrics β the Metric Explorer
- Traces β the Explore Traces page
- Confirm the Collector is running and reachable at
OTEL_EXPORTER_OTLP_ENDPOINT, and that its pipelines include anotlpreceiver and the Bronto exporters. - Confirm
instrumentation.jsis preloaded with--requirerather than imported from insideapp.jsβ instrumentations must run before the libraries they patch are loaded. - The batch processors export on a background timer. Short-lived scripts can exit before the first flush β call
sdk.shutdown()before exit.
Direct export to Bronto
Without a Collector, the application exports straight to Bronto over OTLP/HTTP. The code ininstrumentation.js is unchanged β point the endpoint at your Bronto region and add your API key:
See API Keys for how to create a key with ingestion permissions.
GenAI semantic conventions
If your application calls an LLM, OpenTelemetryβs GenAI semantic conventions definegen_ai.* span attributes for model, token usage, and prompt and response content.
For OpenAI, add the contrib instrumentation to the instrumentations array:
instrumentation.js
@opentelemetry/instrumentation-aws-sdk implements the GenAI conventions for Bedrock Runtime calls (Converse, InvokeModel) and is already bundled in @opentelemetry/auto-instrumentations-node.
Each model call then produces a span such as chat gpt-4o-mini in place of a plain HTTP client span:
Capture prompts and responses
Content capture is off by default:trace_id and is not queryable on the span itself. To make it searchable alongside the span, emit it as a structured log record following LLM Observability. The OTEL_SEMCONV_STABILITY_OPT_IN variant used by the Python instrumentations is not read by the JS packages.

