Prerequisites
- C++14 or later
- CMake 3.12 or later
- vcpkg or Conan (recommended), or a manual build of
opentelemetry-cpp - A running OTel Collector configured to forward logs and traces to Bronto — see Connect Open Telemetry to Bronto
- OpenTelemetry C++ SDK documentation
Install dependencies
CMakeLists.txt:
CMakeLists.txt
Configure the log bridge
Set up anOtlpHttpLogRecordExporter, a BatchLogRecordProcessor, and a LoggerProvider. Register it as the global provider so any part of your application can obtain a logger.
otel_logging.cpp
InitLogging() once at application startup, before any log emission.
Configure the OTLP exporter
Theopts.url field in the snippet above connects to the OTel Collector on localhost:4318. If your Collector runs on a different host or port, update the URL accordingly.
Set resource attributes
Resource attributes are attached to every log record exported from this process. Two attributes drive how Bronto organises incoming logs:
These are set via
Resource::Create in the setup above.
Complete example
main.cpp
Unlike higher-level language SDKs, there is no automatic bridge from a popular C++ logging library (spdlog, glog) in the official OTel SDK yet. Community bridges exist — search the OpenTelemetry registry for your preferred library.
Verify delivery
After running your application, check both signals in Bronto:- Logs: open the Search page and filter by the dataset name you set in
service.name— your log records should appear within a few seconds. - Traces: open the Explore Traces page and filter by the same
service.name— your spans should appear within a few seconds.
- The OTel Collector is running and reachable at the configured endpoint.
- The Collector’s pipeline includes a
logspipeline with anotlpreceiver and the Bronto exporter — see Connect Open Telemetry to Bronto. InitLogging()is called before the first log emission.ForceFlush()is called before process exit to flush buffered records.
Traces
Link tracing components
Add the tracing libraries to yourCMakeLists.txt alongside the logging ones:
CMakeLists.txt
Configure the tracer provider
otel_logging.cpp (extended)
res used in InitLogging so both signals share service.name and service.namespace.
Creating spans
GenAI semantic conventions
If your application calls an LLM, OpenTelemetry defines GenAI semantic conventions. There is no first-party GenAI auto-instrumentation package for C++ yet — set the attributes yourself around each LLM call:This page was verified on July 17, 2026. GenAI libraries and semantic conventions are evolving rapidly, so package configuration and emitted attributes can change between releases. Keep your instrumentation current and verify the fields emitted by the version you deploy.
Message content (
gen_ai.input.messages / gen_ai.output.messages) is opt-in by convention in languages with auto-instrumentation, off by default. Since you’re setting attributes by hand here, apply the same discipline — gate prompt/response content behind your own config flag rather than always sending it.Direct export to Bronto
If you are not using an OTel Collector, export directly to Bronto by replacing the exporter configurations with the Bronto OTLP endpoints and your API key:
See API Keys for how to create a key with ingestion permissions. No other changes to the rest of the setup are required.

