-
Notifications
You must be signed in to change notification settings - Fork 59
Add Bronto to the OpenLLMetry integrations catalog #176
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,27 @@ | ||
| --- | ||
| title: "LLM Observability with Bronto and OpenLLMetry" | ||
| sidebarTitle: "Bronto" | ||
| --- | ||
|
|
||
| <Frame> | ||
| <img src="/img/integrations/bronto.png" /> | ||
| </Frame> | ||
|
|
||
| [Bronto](https://www.bronto.io) is an intelligent data platform for observability, built on BrontoDB — a polymorphic database designed to handle high-cardinality logs, traces, and metrics efficiently. Because you don't have to sample workloads or shorten retention to control cost, you can send full-fidelity LLM traces and keep months of them immediately queryable with sub-second search — no rehydration step before a root cause analysis. | ||
|
|
||
| OpenLLMetry spans arrive as [OpenTelemetry GenAI semantic conventions](https://opentelemetry.io/docs/specs/semconv/gen-ai/), so attributes such as `gen_ai.provider.name`, `gen_ai.request.model`, and `gen_ai.usage.input_tokens` / `gen_ai.usage.output_tokens` are searchable and aggregatable on arrival — group token usage by model, chart cost trends, or inspect prompt and completion content on the span. Bronto's MCP server exposes the same search and analysis as tools, so agents can investigate your LLM traces directly. | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win 🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -eu
printf '%s\n' '--- target file ---'
cat -n openllmetry/integrations/bronto.mdx
printf '%s\n' '--- related OpenLLMetry references ---'
rg -n -i 'content.capture|gen_ai\.provider|gen_ai\.request\.model|gen_ai\.usage\.input_tokens|gen_ai\.usage\.output_tokens|OpenTelemetry GenAI|bronto' . --glob '!node_modules' --glob '!dist' --glob '!build' | head -200Repository: traceloop/docs Length of output: 6904 🌐 Web query:
💡 Result: OpenLLMetry and the broader OpenTelemetry GenAI semantic conventions have moved away from including raw content (prompts/completions) as standard span attributes due to privacy concerns and the potential for PII leakage [1][2]. Key points regarding GenAI content capture attribute availability: 1. Deprecation of Span-Based Content: Earlier implementations of OpenLLMetry and other instrumentation libraries frequently recorded message content directly onto spans (e.g., as Citations:
Qualify GenAI attributes and content capture. Attribute availability depends on the OpenLLMetry language instrumentation and release. Prompt and completion content is opt-in and may be emitted as OpenTelemetry events rather than span attributes. State these conditions instead of promising that every span contains these fields or content. 🤖 Prompt for AI Agents📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win 🧩 Analysis chain🏁 Script executed: python3 - <<'PY'
from urllib.request import Request, urlopen
from urllib.error import HTTPError, URLError
urls = [
"https://opentelemetry.io/docs/specs/semconv/gen-ai/",
"https://github.com/open-telemetry/semantic-conventions/tree/main/docs/gen-ai",
]
for url in urls:
try:
req = Request(url, method="GET", headers={"User-Agent": "review-check"})
with urlopen(req, timeout=15) as response:
print(f"{url}\t{response.status}\t{response.geturl()}")
body = response.read(200000).decode("utf-8", "replace")
for phrase in ("moved", "no longer maintained", "semantic conventions"):
if phrase in body.lower():
print(f" contains {phrase!r}")
except (HTTPError, URLError, TimeoutError) as exc:
print(f"{url}\tERROR\t{exc}")
PYRepository: traceloop/docs Length of output: 563 🌐 Web query:
💡 Result: The OpenTelemetry Generative AI (GenAI) semantic conventions have moved from the main OpenTelemetry semantic conventions repository to a new, dedicated repository: open-telemetry/semantic-conventions-genai [1][2]. As of August 2026, the status of this transition and the conventions is as follows: - Repository Move: In June 2026, with the release of semantic-conventions v1.42.0, all GenAI-specific attributes, spans, metrics, and events were deprecated in the main repository and fully migrated to the new, dedicated repository [3][4][5][6]. - Maintenance: The original documentation page at opentelemetry.io now contains a notice that the content has moved and is no longer maintained in the main repository [7]. The new repository is the authoritative home for these conventions [1][2]. - Stability Status: All Citations:
🏁 Script executed: python3 - <<'PY'
import json
import ssl
from urllib.request import Request, urlopen
from urllib.error import HTTPError, URLError
context = ssl._create_unverified_context()
urls = [
"https://api.github.com/repos/open-telemetry/semantic-conventions-genai",
"https://api.github.com/repos/open-telemetry/semantic-conventions-genai/contents/docs",
"https://api.github.com/repos/open-telemetry/semantic-conventions/contents/docs/gen-ai",
]
for url in urls:
try:
request = Request(url, headers={
"Accept": "application/vnd.github+json",
"User-Agent": "review-check",
})
with urlopen(request, context=context, timeout=15) as response:
data = json.load(response)
if isinstance(data, dict):
print(url, response.status, data.get("html_url", data.get("message", "")))
else:
print(url, response.status, [item.get("path") for item in data])
except (HTTPError, URLError, TimeoutError) as exc:
print(url, "ERROR", exc)
PYRepository: traceloop/docs Length of output: 884 Update the OpenTelemetry GenAI link. Link to the current canonical documentation:
🤖 Prompt for AI Agents |
||
|
|
||
| <Frame> | ||
| <img src="/img/integrations/bronto-llm-usage.png" /> | ||
| </Frame> | ||
|
|
||
| Route your traces to Bronto's OTLP endpoint: | ||
|
|
||
| ```bash | ||
| TRACELOOP_BASE_URL="https://ingestion.eu.bronto.io" | ||
| TRACELOOP_HEADERS="x-bronto-api-key=<YOUR_API_KEY>" | ||
| ``` | ||
|
Comment on lines
+20
to
+23
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win 🧩 Analysis chain🏁 Script executed: #!/bin/sh
set -eu
sh -c 'TRACELOOP_BASE_URL=value; test -z "$(printenv TRACELOOP_BASE_URL)"'
sh -c 'export TRACELOOP_BASE_URL=value; test "$(printenv TRACELOOP_BASE_URL)" = value'Repository: traceloop/docs Length of output: 232 🏁 Script executed: #!/bin/sh
set -eu
printf '%s\n' '--- openllmetry/integrations/bronto.mdx ---'
sed -n '1,40p' openllmetry/integrations/bronto.mdx
printf '%s\n' '--- shell inheritance probe ---'
python3 - <<'PY'
import os
import subprocess
for statement in (
"TRACELOOP_BASE_URL=value",
"export TRACELOOP_BASE_URL=value",
):
result = subprocess.run(
["sh", "-c", f"{statement}; python3 -c 'import os; print(os.getenv(\"TRACELOOP_BASE_URL\"))'"],
text=True,
capture_output=True,
check=True,
)
print(f"{statement!r} -> {result.stdout.strip()!r}")
PY
printf '%s\n' '--- related documentation references ---'
rg -n -C 2 'TRACELOOP_BASE_URL|TRACELOOP_HEADERS|bronto|export ' openllmetry README.md 2>/dev/null || trueRepository: traceloop/docs Length of output: 27689 Export both environment variables. Standalone assignments are not inherited by the application process. Prefix both assignments with 🤖 Prompt for AI Agents |
||
|
|
||
| Use `https://ingestion.us.bronto.io` for the US region. Do not append `/v1/traces` — OpenLLMetry adds the signal path automatically. | ||
|
|
||
| For the full setup, including the OTel Collector path and the complete attribute reference, see the [Bronto OpenLLMetry documentation](https://docs.bronto.io/integrations/openllmetry). | ||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
Add
alttext to both screenshots.These screenshots contain integration information. Without alternative text, screen-reader users cannot access that content.
Suggested fix
Also applies to: 15-15
🤖 Prompt for AI Agents