OpenTelemetry exporter for Kubit analytics.
Project description
kubit-otel
OpenTelemetry exporter for Kubit analytics.
Install
pip install kubit-otel
Quick start
from kubit_otel import configure
from opentelemetry import trace
configure(api_key="rg.v1.xxx", service_name="my-app")
tracer = trace.get_tracer("my-app")
with tracer.start_as_current_span("chat.completion") as span:
span.set_attribute("gen_ai.request.model", "gpt-4o")
span.set_attribute("gen_ai.prompt", "Hello, world!")
span.set_attribute("gen_ai.completion", "Hi there!")
span.set_attribute("gen_ai.usage.input_tokens", 10)
span.set_attribute("gen_ai.usage.output_tokens", 5)
Spans are exported to Kubit using standard OpenTelemetry GenAI semantic
conventions. Each trace's root span is recorded as the trace; every span
(including the root) is recorded as an observation under it. gen_ai.*
attributes are mapped to first-class, queryable fields for model name,
prompt/completion, token counts, and cost.
Works alongside other OTel-based SDKs
configure() detects whether a real TracerProvider is already installed
as the global OTel provider. If so, it attaches KubitSpanProcessor to
that provider and merges in your resource attributes — it does not
replace the existing provider. You can call configure() before or after
other OTel-based libraries (Langfuse, OpenLLMetry, an OTel distro, …) and
every span will reach both sinks.
If you want explicit "attach only, never register" behavior, use
attach():
from kubit_otel import attach
# Must be called after another library has installed a real provider.
attach(api_key="rg.v1.xxx")
Supported attributes
| OpenTelemetry attribute | Purpose |
|---|---|
gen_ai.request.model / gen_ai.response.model |
Model name |
gen_ai.prompt / gen_ai.content.prompt |
Input prompt |
gen_ai.completion / gen_ai.content.completion |
Output completion |
gen_ai.usage.input_tokens |
Input token count |
gen_ai.usage.output_tokens |
Output token count |
gen_ai.usage.cost |
Total cost (USD) |
session.id |
Conversation session id |
enduser.id |
End-user id |
Span filtering
By default, only LLM-relevant spans are forwarded to Kubit. A span is exported if it:
- was created by the Kubit SDK tracer (
kubit-sdk), - carries any
gen_ai.*semantic-convention attribute, or - comes from a known LLM instrumentation scope (OpenInference, Langfuse, Vercel AI SDK, …).
This keeps HTTP/DB/framework auto-instrumentation noise out of your Kubit workspace without extra configuration.
Extend the default filter
from kubit_otel import configure, is_default_export_span
configure(
api_key="rg.v1.xxx",
should_export_span=lambda span: (
is_default_export_span(span)
or (
span.instrumentation_scope is not None
and span.instrumentation_scope.name.startswith("my_framework")
)
),
)
Full override
configure(
api_key="rg.v1.xxx",
should_export_span=lambda span: span.name.startswith("llm."),
)
Export everything
configure(api_key="rg.v1.xxx", should_export_span=lambda _span: True)
Python compatibility
Python 3.9+
License
Proprietary — see LICENSE.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file kubit_otel-0.6.1.tar.gz.
File metadata
- Download URL: kubit_otel-0.6.1.tar.gz
- Upload date:
- Size: 75.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
316c5cb5519e5c94915632e507489a9b2056ca196ad358d01ab31bc2402950bc
|
|
| MD5 |
caddbabed026594bf54289ab810d7da8
|
|
| BLAKE2b-256 |
380f6aeba42d1a2d4ca5db517a6800898a172f1c7f98e4125f193187d843f959
|
File details
Details for the file kubit_otel-0.6.1-py3-none-any.whl.
File metadata
- Download URL: kubit_otel-0.6.1-py3-none-any.whl
- Upload date:
- Size: 59.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b2212b05356e2d560d7331695c2ff83ebb185442e50442521abe11a21ed009cb
|
|
| MD5 |
4da12d37b2584377a95f0c348077bdaa
|
|
| BLAKE2b-256 |
0f005336977e1e6fa4eaa99e762769ec275898a7d1ec98f3fbbaf0c9ac9ff0de
|