Skip to main content
One preloaded module sends logs, metrics, and traces from your Node.js application to Bronto. 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

Install dependencies

Configure the environment

The SDK reads its endpoint and identity from environment variables, so nothing in the code below is environment-specific.
The SDK appends the signal path (/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
Preload it so the instrumentations patch your dependencies before they are required:
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 attach trace_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 the service.name you set:
  • Logs β€” the Search page, in the dataset named after your service
  • Metrics β€” the Metric Explorer
  • Traces β€” the Explore Traces page
If nothing arrives:
  • Confirm the Collector is running and reachable at OTEL_EXPORTER_OTLP_ENDPOINT, and that its pipelines include an otlp receiver and the Bronto exporters.
  • Confirm instrumentation.js is preloaded with --require rather than imported from inside app.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.
For signal-specific reference material, see Send Metrics to Bronto and Send Traces to Bronto.

Direct export to Bronto

Without a Collector, the application exports straight to Bronto over OTLP/HTTP. The code in instrumentation.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.
Prefer the Collector for multi-service environments β€” it batches, filters, and enriches telemetry, and keeps the API key out of every application. Direct export suits single services and simple architectures.

GenAI semantic conventions

If your application calls an LLM, OpenTelemetry’s GenAI semantic conventions define gen_ai.* span attributes for model, token usage, and prompt and response content. For OpenAI, add the contrib instrumentation to the instrumentations array:
instrumentation.js
For Amazon Bedrock, no extra package is needed β€” @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:
Need broader provider or framework coverage? See OpenLLMetry for supported packages, setup, and content-capture controls.

Capture prompts and responses

Content capture is off by default:
The JS contrib instrumentations emit captured content as OTel log records rather than span attributes, so it travels through the logs pipeline correlated by 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.

Manual spans

Where no instrumentation package exists for your provider, set the same attributes yourself:
See the GenAI span conventions for the full attribute list. For the recommended attribute set and Bronto search queries, see LLM Observability.