⚡ Exceptional Performance with No Overhead
Written in Rust to deliver bare-metal speeds and minimal resource consumption, free from garbage collector overhead.
⏱️ Blazing Fast Cold-Starts
Specifically tailored for serverless environments like AWS Lambda, ensuring your functions start fast.
📦 Flexible and Lightweight Deployment
Deploy Rotel to the cloud with pre-built Docker containers, import as Python / Node.js packages, or load the extension layer on AWS Lambda.
🐍 Native Python Integration
Easily develop custom telemetry processors in Python using Rust pyo3 bindings with full IDE support including type hints and autocompletion.
High-performance and low overhead ⚡
Rotel requires fewer resources for the same workloads
Comparison of memory and CPU usage of Rotel and the OpenTelemetry collector. Results from the loadtest benchmarks.
Ideal for serverless environments 📦
Small package size and low cold-start times are ideal for serverless environments
This chart compares cold start times between Rotel, the OpenTelemetry Lambda, and the Datadog OTEL Lambda layers.
Developer friendly with native language integrations ⚙️
Write custom telemetry processors in Python with full type support
import re
import itertools
from rotel_sdk.open_telemetry.common.v1 import AnyValue
from rotel_sdk.open_telemetry.logs.v1 import ResourceLogs
email_pattern = r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b'
def process_logs(resource_logs: ResourceLogs):
for log_record in itertools.chain.from_iterable(
scope_log.log_records for scope_log in resource_logs.scope_logs
):
if hasattr(log_record, 'body') and log_record.body \
and hasattr(log_record.body, 'value'):
if log_record.body.value and re.search(email_pattern, log_record.body.value):
if log_record.body is not None:
log_record.body = redact_emails(log_record.body)
def redact_emails(body: AnyValue) -> AnyValue:
"""
Searches for email addresses in a string and replaces them with '[email redacted]'
"""
if body.value is None or not isinstance(body.value, str):
return body
redacted_body, matches = re.subn(email_pattern, '[email redacted]', body.value)
if matches == 0:
return body
return AnyValue(redacted_body)
Growing Feature Matrix 🚀
Comprehensive telemetry collection with batteries included
Receivers & Processing
- OTLP/gRPC, OTLP/HTTP, OTLP/HTTP-JSON receivers
- Automatic batching for optimal delivery
- Python processor support
- Out-of-the-box processors or write your own
- Adaptive flushing that minimizes lambda overhead
Exporters & Destinations
- OTLP (gRPC/HTTP) exporters
- Clickhouse exporter
- Datadog trace exporter
- AWS X-Ray tracing
- Debug & logging exporters
Explore Rotel in Action 🛠️
Check out these example repositories for integrations and use cases.
Rotel with Python FastAPI
Integrating Rotel for telemetry in a Python FastAPI application.
AWS Lambda + Clickhouse
Using the Lambda Extension to send Lambda logs and application traces to Clickhouse.
Node.js Lambda + Honeycomb
Use OpenTelemetry Node.js auto-instrumentation and send data to Honeycomb.