Lightweight OpenTelemetry collector
Project description
rotel 🌶️ 🍅
Python package for the Rotel lightweight OpenTelemetry collector.
Description
This package provides an embedded OpenTelemetry collector, built on the lightweight Rotel collector. When started, it spawns a background daemon that accepts OpenTelemetry metrics, traces, and logs. Designed for minimal overhead, Rotel reduces resource consumption while simplifying telemetry collection and processing in complex Python applications—without requiring additional sidecar containers.
By default, the Rotel agent listens for OpenTelemetry data over gRPC (port 4317) and HTTP (port 4318) on localhost. It efficiently batches telemetry signals and forwards them to a configurable OTLP endpoint. Future updates will introduce support for additional filtering, transformations, and exporters.
| Telemetry Type | Support |
|---|---|
| Metrics | Alpha |
| Traces | Alpha |
| Logs | Coming soon |
Getting started
Rotel configuration
Add the rotel Python package to your project's dependencies. There are two approaches to configuring rotel:
- typed config dicts
- environment variables
Typed dicts
In the startup section of your main.py add the following code block. Replace the endpoint with the endpoint of your OpenTelemetry vendor and any required API KEY headers.
from rotel import OTLPExporter, Rotel
rotel = Rotel(
enabled = True,
exporter = OTLPExporter(
endpoint = "https://foo.example.com",
custom_headers=[f"x-api-key={settings.API_KEY}", "x-data-set=testing"]
),
)
rotel.start()
Environment variables
You can also configure rotel entirely with environment variables. In your application startup, insert:
import rotel
rotel.start()
In your application deployment configuration, set the following environment variables. These match the typed configuration above:
ROTEL_ENABLED=trueROTEL_OTLP_EXPORTER_ENDPOINT=https://foo.example.comROTEL_OTLP_EXPORTER_CUSTOM_HEADERS=x-api-key={API_KEY}
Any typed configuration options will override environment variables of the same name.
See the Configuration section for the full list of options.
OpenTelemetry SDK configuration
Once the rotel collector agent is running, you may need to configure your application's instrumentation. If you are using the default rotel endpoints of localhost:4317 and localhost:4318, then you should not need to change anything.
To set the endpoint the OpenTelemetry SDK will use, set the following environment variable:
OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317
Configuration
This is the full list of options and their environment variable alternatives. Any defaults left blank in the table are either False or None.
| Option Name | Type | Environ | Default | Options |
|---|---|---|---|---|
| enabled | bool | ROTEL_ENABLED | ||
| pid_file | str | ROTEL_PID_FILE | /tmp/rotel-agent.pid | |
| log_file | str | ROTEL_LOG_FILE | /tmp/rotel-agent.log | |
| log_format | str | ROTEL_LOG_FORMAT | text | json, text |
| debug_log | list[str] | ROTEL_DEBUG_LOG | traces, metrics | |
| otlp_grpc_endpoint | str | ROTEL_OTLP_GRPC_ENDPOINT | localhost:4317 | |
| otlp_http_endpoint | str | ROTEL_OTLP_HTTP_ENDPOINT | localhost:4318 | |
| otlp_receiver_traces_disabled | bool | ROTEL_OTLP_RECEIVER_TRACES_DISABLED | ||
| otlp_receiver_metrics_disabled | bool | ROTEL_OTLP_RECEIVER_METRICS_DISABLED | ||
| exporter | OTLPExporter |
The OTLPExporter can be enabled with the following options.
| Option Name | Type | Environ | Default | Options |
|---|---|---|---|---|
| endpoint | str | ROTEL_OTLP_EXPORTER_ENDPOINT | ||
| protocol | str | ROTEL_OTLP_EXPORTER_PROTOCOL | grpc | grpc or http |
| custom_headers | list[str] | ROTEL_OTLP_EXPORTER_CUSTOM_HEADERS | ||
| compression | str | ROTEL_OTLP_EXPORTER_COMPRESSION | gzip | gzip or none |
| request_timeout | str | ROTEL_OTLP_EXPORTER_REQUEST_TIMEOUT | 5s | |
| retry_initial_backoff | str | ROTEL_OTLP_EXPORTER_RETRY_INITIAL_BACKOFF | 5s | |
| retry_max_backoff | str | ROTEL_OTLP_EXPORTER_RETRY_MAX_BACKOFF | 30s | |
| retry_max_elapsed_time | str | ROTEL_OTLP_EXPORTER_RETRY_MAX_ELAPSED_TIME | 300s | |
| batch_max_size | int | ROTEL_OTLP_EXPORTER_BATCH_MAX_SIZE | 8192 | |
| batch_timeout | str | ROTEL_OTLP_EXPORTER_BATCH_TIMEOUT | 200ms | |
| tls_cert_file | str | ROTEL_OTLP_EXPORTER_TLS_CERT_FILE | ||
| tls_key_file | str | ROTEL_OTLP_EXPORTER_TLS_KEY_FILE | ||
| tls_ca_file | str | ROTEL_OTLP_EXPORTER_TLS_CA_FILE | ||
| tls_skip_verify | bool | ROTEL_OTLP_EXPORTER_TLS_SKIP_VERIFY |
Endpoint overrides
When using the OTLP exporter over HTTP, the exporter will append /v1/traces, /v1/metrics, or /v1/logs to the endpoint URL for traces, metrics, and logs respectively. If the service you are exporting telemetry data to does not support these standard URL paths, you can individually override them for traces, metrics, and logs.
For example, to override the endpoint for traces and metrics you can do the following:
from rotel import OTLPExporter, OTLPExporterEndpoint, Rotel
rotel = Rotel(
enabled = True,
exporter = OTLPExporter(
custom_headers=[f"x-api-key={settings.API_KEY}"],
traces = OTLPExporterEndpoint(
endpoint = "http://foo.example.com:4318/api/otlp/traces",
),
metrics = OTLPExporterEndpoint(
endpoint = "http://foo.example.com:4318/api/otlp/metrics",
),
),
)
rotel.start()
Or, you can override the endpoints using environment variables:
ROTEL_OTLP_EXPORTER_TRACES_ENDPOINT=http://foo.example.com:4318/api/otlp/tracesROTEL_OTLP_EXPORTER_METRICS_ENDPOINT=http://foo.example.com:4318/api/otlp/metrics
All the OTLP exporter settings can be overridden per endpoint type (traces, metrics, logs). Any value that is not overridden will fall back to the top-level exporter configuration or the default.
Retries and timeouts
You can override the default request timeout of 5 seconds for the OTLP Exporter with the exporter setting:
request_timeout: Takes a string time duration, so"250ms"for 250 milliseconds,"3s"for 3 seconds, etc.
Requests will be retried if they match retryable error codes like 429 (Too Many Requests) or timeout. You can control the behavior with the following exporter options:
retry_initial_backoff: Initial backoff durationretry_max_backoff: Maximum backoff intervalretry_max_elapsed_time: Maximum wall time a request will be retried for until it is marked as permanent failure
All options should be represented as string time durations.
Debugging
If you set the option debug_log to ["traces"], or the environment variable ROTEL_DEBUG_LOG=traces, then rotel will log a summary to the log file /tmp/rotel-agent.log each time it processes trace spans. You can add also specify metrics to debug metrics.
Community
Want to chat about this project, share feedback, or suggest improvements? Join our Discord server! Whether you're a user of this project or not, we'd love to hear your thoughts and ideas. See you there! 🚀
Development
Install the latest version of the hatch build tool. We'll use this to manage the environments, run tests and perform builds.
Managing Python versions
Hatch will default to the system's Python version.
If you want to install additional Python versions, you can use hatch to manage those.
The following will install Python 3.9:
hatch python install 3.9
Then you can run tests against version 3.9 with:
hatch run test.py39:pytest
Wheel builds
To build locally using an existing Rotel agent binary, run:
hatch run build:me ../path/to/agent/file
You can always download the latest rotel agent binary from Github. Make sure to create a Github Personal Access Token (PAT) that allows you to pull Github release artifacts. Set that as GITHUB_API_TOKEN for the commands below.
To build using the latest Github built binary:
GITHUB_API_TOKEN=1234 hatch run build:me
Finally, to build for all supported platforms:
GITHUB_API_TOKEN=1234 hatch run build:all
Linting and formatting
hatch run lint:fmt # will fix anything it can, report others
hatch run lint:check # will only report issues
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 Distributions
Built Distributions
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 rotel-0.0.1a5-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.
File metadata
- Download URL: rotel-0.0.1a5-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
- Upload date:
- Size: 3.9 MB
- Tags: Python 3, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9d47235e6317afdd1877e2c04ed04b61468b94c5e6cd99ae0c1d9f739bdc0dde
|
|
| MD5 |
363a7ba99e08748dd48db93c058aaf17
|
|
| BLAKE2b-256 |
e966b7087e67f50778abc14d5613e8ba8f83e997910bd2c38b61533bd6599e82
|
Provenance
The following attestation bundles were made for rotel-0.0.1a5-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl:
Publisher:
build-release.yml on streamfold/pyrotel
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
rotel-0.0.1a5-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl -
Subject digest:
9d47235e6317afdd1877e2c04ed04b61468b94c5e6cd99ae0c1d9f739bdc0dde - Sigstore transparency entry: 180452000
- Sigstore integration time:
-
Permalink:
streamfold/pyrotel@1b5024b5f6cf10bd0772dbbb41848f19c6de9acc -
Branch / Tag:
refs/tags/v0.0.1a5 - Owner: https://github.com/streamfold
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
build-release.yml@1b5024b5f6cf10bd0772dbbb41848f19c6de9acc -
Trigger Event:
push
-
Statement type:
File details
Details for the file rotel-0.0.1a5-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl.
File metadata
- Download URL: rotel-0.0.1a5-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl
- Upload date:
- Size: 3.7 MB
- Tags: Python 3, manylinux: glibc 2.17+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c93135541d9d24af2bbfd7cee67afedbfd70b4990e9ef8f0f81cdd0776fceca3
|
|
| MD5 |
cb57efae65434100ed25547947f1cf90
|
|
| BLAKE2b-256 |
c67f14afcd5e36e63652c9afb12f3aa9050cc3d407908b63ee60c9206c1bc54b
|
Provenance
The following attestation bundles were made for rotel-0.0.1a5-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl:
Publisher:
build-release.yml on streamfold/pyrotel
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
rotel-0.0.1a5-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl -
Subject digest:
c93135541d9d24af2bbfd7cee67afedbfd70b4990e9ef8f0f81cdd0776fceca3 - Sigstore transparency entry: 180452003
- Sigstore integration time:
-
Permalink:
streamfold/pyrotel@1b5024b5f6cf10bd0772dbbb41848f19c6de9acc -
Branch / Tag:
refs/tags/v0.0.1a5 - Owner: https://github.com/streamfold
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
build-release.yml@1b5024b5f6cf10bd0772dbbb41848f19c6de9acc -
Trigger Event:
push
-
Statement type:
File details
Details for the file rotel-0.0.1a5-py3-none-macosx_10_9_universal2.macosx_12_3_arm64.whl.
File metadata
- Download URL: rotel-0.0.1a5-py3-none-macosx_10_9_universal2.macosx_12_3_arm64.whl
- Upload date:
- Size: 3.5 MB
- Tags: Python 3, macOS 10.9+ universal2 (ARM64, x86-64), macOS 12.3+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
26b67473fa3beabd4aa6016bdbcb50a3ba5a5e49c624861c47b040707be43cdb
|
|
| MD5 |
01e7fe66bd2ec3fd4fbb44ac8032d92d
|
|
| BLAKE2b-256 |
265a8b04d7171ad96ed096932f3dc93c3aec8b3a5aea6d155969bc9d59141090
|
Provenance
The following attestation bundles were made for rotel-0.0.1a5-py3-none-macosx_10_9_universal2.macosx_12_3_arm64.whl:
Publisher:
build-release.yml on streamfold/pyrotel
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
rotel-0.0.1a5-py3-none-macosx_10_9_universal2.macosx_12_3_arm64.whl -
Subject digest:
26b67473fa3beabd4aa6016bdbcb50a3ba5a5e49c624861c47b040707be43cdb - Sigstore transparency entry: 180452002
- Sigstore integration time:
-
Permalink:
streamfold/pyrotel@1b5024b5f6cf10bd0772dbbb41848f19c6de9acc -
Branch / Tag:
refs/tags/v0.0.1a5 - Owner: https://github.com/streamfold
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
build-release.yml@1b5024b5f6cf10bd0772dbbb41848f19c6de9acc -
Trigger Event:
push
-
Statement type: