Skip to main content
LLM observability in Bronto is built on the OpenTelemetry GenAI semantic conventions — a standard set of gen_ai.* attributes for model calls. Any application emitting these attributes on spans or log records gets first-class, searchable prompt/response, token usage, and model fields in Bronto automatically — no Bronto-specific SDK.
This documentation was verified on July 17, 2026 and uses the latest OpenTelemetry GenAI semantic conventions available on that date. GenAI instrumentation evolves rapidly: current library releases may add the latest conventions while retaining legacy output for compatibility, so the schema emitted by default can vary by library and version.

Convention version and opt-in

To avoid breaking existing dashboards and queries, instrumentation libraries are not required to switch their default output when a newer Development convention is released. Where supported, enable the current convention with this OpenTelemetry migration opt-in:
Support for this opt-in is instrumentation-specific, not universal. Check the relevant language instrumentation page and your installed package version before relying on it. Some libraries already emit the current fields by default, some require a different setting, and some still emit an older schema even when this variable is present.

1. Instrument your application

Pick your language for the generic gen_ai.* mechanics — auto-instrumentation where it exists, manual spans where it doesn’t, and the experimental content-capture flags:

Python

GenAI auto-instrumentation for supported Python model clients.

Node.js

Auto-instrumentation for OpenAI, plus alternatives.

Java

Javaagent-based GenAI coverage (also covers Kotlin).

All languages

.NET, Go, Ruby, PHP, Rust, C++, Swift, Erlang/Elixir.
Using a specific framework or AWS GenAI service? These pages cover the OTel setup and the telemetry available from each integration:

Amazon Bedrock

Converse / InvokeModel via botocore instrumentation.

Amazon Bedrock AgentCore

Agent-loop traces with the Strands framework.

OpenLLMetry

Broad provider and framework instrumentation from Traceloop.

LangChain

Chain instrumentation, with optional LangSmith OTel routing.

2. Send it to Bronto

Export through an OTel Collector or directly — see Connect OpenTelemetry to Bronto or the “Direct export to Bronto” section on any language page.

3. Know what you’ll see

The most useful gen_ai.* attributes: OpenTelemetry also defines latency metric instruments for aggregate analysis:
Instrumentation does not yet use these boundaries consistently. Traceloop and Strands releases may emit gen_ai.server.time_to_first_token from client or framework instrumentation, while Amazon Bedrock publishes a separate CloudWatch TimeToFirstToken metric for streaming APIs. Preserve the field emitted by your instrumentation and confirm its unit and measurement boundary before comparing providers.
Content capture is instrumentation-specific and can expose sensitive data. Official Python, JavaScript, and Java instrumentations generally default it off; Traceloop and Strands differ. Prefer a supported span-attribute mode such as Python OpenAI v2’s span_only so gen_ai.input.messages / gen_ai.output.messages are queryable on traces. Where content is emitted as OTel log events—or no span-attribute mode exists—emit a structured log record correlated by trace_id:
Setting attributes manually on a span (no auto-instrumentation for your provider)? Same idea:

4. Search and aggregate

Open Log Search and use field predicates to select GenAI calls. For example, select Bedrock calls that report input-token usage:
Build token-usage views with $gen_ai.provider.name as the group-by field: Bronto time-series views also provide Count, Average, Min, Max, Sum, and Median; median is the 50th percentile. Dashboard percentile views provide P75, P90, P95, and P99. Use a median to compare typical token consumption and the higher percentiles to find providers or models producing unusually large responses. For streaming latency on spans, apply the same median and percentile views to $gen_ai.response.time_to_first_chunk, grouped by $gen_ai.provider.name. If your instrumentation exports metrics, chart gen_ai.client.operation.time_to_first_chunk for client-observed streaming latency, gen_ai.client.operation.duration for total completion time, or gen_ai.server.time_to_first_token for model-server TTFT. gen_ai.response.finish_reasons remains an OpenTelemetry array attribute. Bronto indexes its first element as $gen_ai.response.finish_reasons.0; .0 is not part of the semantic-convention name and is not normally added by the Collector. See Visualizations for building these views into a dashboard.

References