Skip to main content

Lightweight OpenTelemetry collector

Project description

rotel 🌶️ 🍅

Python package for the Rotel lightweight OpenTelemetry collector.

PyPI - Version PyPI - Python Version

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:

  1. typed config dicts
  2. 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=true
  • ROTEL_OTLP_EXPORTER_ENDPOINT=https://foo.example.com
  • ROTEL_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/traces
  • ROTEL_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 duration
  • retry_max_backoff: Maximum backoff interval
  • retry_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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

rotel-0.0.1a4-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (3.9 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

rotel-0.0.1a4-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl (3.7 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

rotel-0.0.1a4-py3-none-macosx_10_9_universal2.macosx_12_3_arm64.whl (3.5 MB view details)

Uploaded Python 3macOS 10.9+ universal2 (ARM64, x86-64)macOS 12.3+ ARM64

File details

Details for the file rotel-0.0.1a4-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for rotel-0.0.1a4-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 38c98fa5ddc2429691530b0e683fd25835d015b0aa94c5d8b18dff6ad8ee2c7b
MD5 60f8259ee4233ff682e355b83a59dbd6
BLAKE2b-256 0115cd2d220bcf316ebff2c756ff90e596ce8f24c53a4684ed7ab4f78f06692e

See more details on using hashes here.

Provenance

The following attestation bundles were made for rotel-0.0.1a4-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl:

Publisher: build-release.yml on streamfold/pyrotel

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rotel-0.0.1a4-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl.

File metadata

File hashes

Hashes for rotel-0.0.1a4-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl
Algorithm Hash digest
SHA256 7582f0e256c43a847bac2aff40ff59f5830af2e4d54713f132801252cc74c19e
MD5 4c323393afc24a33a8c6256d6d8fa3c4
BLAKE2b-256 0cddc1639638bd8c894377437fda9a4c59fda784e0eb1bf635f95d0cb8e65857

See more details on using hashes here.

Provenance

The following attestation bundles were made for rotel-0.0.1a4-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl:

Publisher: build-release.yml on streamfold/pyrotel

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rotel-0.0.1a4-py3-none-macosx_10_9_universal2.macosx_12_3_arm64.whl.

File metadata

File hashes

Hashes for rotel-0.0.1a4-py3-none-macosx_10_9_universal2.macosx_12_3_arm64.whl
Algorithm Hash digest
SHA256 1d1275da332cc4cda6a900687ca3f1cb95484f03dad4afdccd9e8ad33844c8dd
MD5 8c1d8f9b123498b90e622d0ba41de65f
BLAKE2b-256 285bebf4168bfe2d64a275fc523a6c7678ef96f8baf84d0b842b722fe7e535ed

See more details on using hashes here.

Provenance

The following attestation bundles were made for rotel-0.0.1a4-py3-none-macosx_10_9_universal2.macosx_12_3_arm64.whl:

Publisher: build-release.yml on streamfold/pyrotel

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page