OpenObserve Telemetry SDK
A simple and lightweight Python SDK for exporting OpenTelemetry logs, metrics, and traces to OpenObserve.
Features
- Easy Integration – Minimal setup with automatic instrumentation for popular libraries
- Multi-Signal Support – Capture logs, metrics, and traces simultaneously
- Flexible Protocol – Choose between HTTP/Protobuf (default) or gRPC
- Lightweight – Minimal dependencies, designed for production use
- OpenTelemetry Native – Built on OpenTelemetry standards for compatibility
Quick Start
Generate auth token:
echo -n "root@example.com:Complexpass#123" | base64
# Output: cm9vdEBleGFtcGxlLmNvbTpDb21wbGV4cGFzcyMxMjM=
Set environment variables:
# OpenObserve Configuration (Required)
export OPENOBSERVE_AUTH_TOKEN="Basic cm9vdEBleGFtcGxlLmNvbTpDb21wbGV4cGFzcyMxMjM="
# Optional OpenObserve settings (defaults shown)
export OPENOBSERVE_URL="http://localhost:5080"
export OPENOBSERVE_ORG="default"
# API keys for services you're using (optional, based on instrumentation)
export OPENAI_API_KEY="your-openai-key"
export ANTHROPIC_API_KEY="your-anthropic-key"
Install dependencies:
Quick Example – OpenAI Instrumentation:
from opentelemetry.instrumentation.openai import OpenAIInstrumentor
from openobserve import openobserve_init
# Initialize OpenObserve and instrument OpenAI
OpenAIInstrumentor().instrument()
openobserve_init()
from openai import OpenAI
# Use OpenAI as normal - traces are automatically captured
client = OpenAI()
response = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": "Hello!"}]
)
print(response.choices[0].message.content)
Quick Example – Anthropic Instrumentation:
from opentelemetry.instrumentation.anthropic import AnthropicInstrumentor
from openobserve import openobserve_init
# Initialize OpenObserve and instrument Anthropic
AnthropicInstrumentor().instrument()
openobserve_init()
from anthropic import Anthropic
# Use Claude as normal - traces are automatically captured
client = Anthropic()
response = client.messages.create(
model="claude-3-5-sonnet-20241022",
max_tokens=1024,
messages=[{"role": "user", "content": "Hello!"}]
)
print(response.content[0].text)
Selecting Signals
By default, openobserve_init() initializes all signals (logs, metrics, traces). You can also initialize selectively:
# All signals (default)
openobserve_init()
# Specific signals only
openobserve_init(logs=True)
openobserve_init(metrics=True)
openobserve_init(traces=True)
# Combine signals
openobserve_init(logs=True, metrics=True) # no traces
Note: For logs, you still need to bridge Python's standard logging module:
import logging
from opentelemetry.sdk._logs import LoggingHandler
openobserve_init(logs=True)
handler = LoggingHandler()
logging.getLogger().addHandler(handler)
Environment Variables
| Variable | Required | Description |
|---|---|---|
OPENOBSERVE_URL |
No | OpenObserve base URL (default: "http://localhost:5080") |
OPENOBSERVE_ORG |
No | Organization name (default: "default") |
OPENOBSERVE_AUTH_TOKEN |
✅ | Authorization token (Format: "Basic |
OPENOBSERVE_TIMEOUT |
No | Request timeout in seconds (default: 30) |
OPENOBSERVE_ENABLED |
No | Enable/disable tracing (default: "true") |
OPENOBSERVE_PROTOCOL |
No | Protocol: "grpc" or "http/protobuf" (default: "http/protobuf") |
OPENOBSERVE_TRACES_STREAM_NAME |
No | Stream name for traces (default: "default") |
OPENOBSERVE_LOGS_STREAM_NAME |
No | Stream name for logs (default: "default") |
Protocol Configuration Notes
HTTP/Protobuf (default)
- Uses HTTP with Protocol Buffers encoding.
- Works with both HTTP and HTTPS endpoints.
- Organization is specified in the URL path: /api/{org}/v1/{signal}, where {signal} is traces, logs, or metrics.
- Automatically adds the stream-name header from OPENOBSERVE_TRACES_STREAM_NAME for traces and OPENOBSERVE_LOGS_STREAM_NAME for logs.
- Standard HTTP header handling (preserves case).
gRPC
- Uses gRPC protocol with automatic configuration:
- Organization is passed as a header (not in the URL).
- Automatically adds required headers:
- organization: Set to OPENOBSERVE_ORG.
- stream-name: Set to OPENOBSERVE_TRACES_STREAM_NAME for traces and OPENOBSERVE_LOGS_STREAM_NAME for logs.
- Headers are normalized to lowercase per gRPC specification.
- TLS is automatically configured based on URL scheme:
- http:// URLs use insecure (non-TLS) connections.
- https:// URLs use secure (TLS) connections.
Installation
Choose your preferred installation method:
# From PyPI (recommended)
pip install openobserve-telemetry-sdk
# From source (development)
pip install -e .
# Using requirements.txt
pip install -r requirements.txt
Both HTTP/Protobuf (default) and gRPC protocols are included in all installations.
Supported Instruments
The SDK works with OpenTelemetry instrumentation packages:
- OpenAI – Use with
opentelemetry-instrumentation-openaifor API call traces - Anthropic – Use with
opentelemetry-instrumentation-anthropicfor Claude API traces - LangChain – Use with
opentelemetry-instrumentation-langchainfor LLM chain tracing - Standard Python Logging – Built-in support via
LoggingHandler - Metrics – OpenTelemetry counters, histograms, and up/down counters
Examples
Run any of these examples to see the SDK in action. First, ensure environment variables are set:
# Traces with OpenAI
python examples/openai_example.py
# Logs with standard Python logging
python examples/logs_example.py
# Metrics (counters, histograms, up/down counters)
python examples/metrics_example.py
# LangChain Q&A with session tracking
python examples/session_demo.py
See the examples/ directory for more samples including LangChain RAG chains and user tracking patterns.
Contributing
We welcome contributions! Please feel free to open issues or submit pull requests on GitHub.