Skip to main content

Rotel

High Performance, Resource Efficient OpenTelemetry Collector

⚡ 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

email-redact-processor.py
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.