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.

Telemetry Type Support
Metrics Alpha
Traces Alpha
Logs Alpha

How it works

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 OpenTelemetry protocol (OTLP) compatible endpoint.

In your application, you use the OpenTelemetry Python SDK to add instrumentation for traces, metrics, and logs. The SDK by default will communicate over ports 4317 or 4318 on localhost to the Rotel agent. You can now ship your instrumented application and efficiently export OpenTelemetry data to your vendor or observability tool of choice with a single deployment artifact.

Future updates will introduce support for filtering data, transforming telemetry, and exporting to different vendors and tools.

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 Config, Rotel

rotel = Rotel(
    enabled = True,
    exporter = Config.otlp_exporter(
        endpoint = "https://foo.example.com",
        headers = {
            "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, logs
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
otlp_receiver_logs_disabled bool ROTEL_OTLP_RECEIVER_LOGS_DISABLED
exporter OTLPExporter | DatadogExporter | ClickhouseExporter

OTLP Exporter

To construct an OTLP exporter, use the method Config.otlp_exporter() 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
headers dict[str, 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

Datadog Exporter

Rotel provides an experimental Datadog exporter that supports traces at the moment. To use it instead of the OTLP exporter, use the method Config.datadog_exporter() with the following options.

Option Name Type Environ Default Options
region str ROTEL_DATADOG_EXPORTER_REGION us1 us1, us3, us5, eu, ap1
custom_endpoint str ROTEL_DATADOG_EXPORTER_CUSTOM_ENDPOINT
api_key str ROTEL_DATADOG_EXPORTER_API_KEY

When configuring Rotel with only environment variables, you must set ROTEL_EXPORTER=datadog in addition to the above environment variables.

Clickhouse Exporter

Rotel provides a Clickhouse exporter with support for traces and logs. To use the Clickhouse exporter instead of the OTLP exporter, use the method Cofig.clickhouse_exporter() with the following options.

Option Name Type Environ Default Options
endpoint str ROTEL_CLICKHOUSE_EXPORTER_ENDPOINT
database str ROTEL_CLICKHOUSE_EXPORTER_DATABASE otel
table_prefix str ROTEL_CLICKHOUSE_EXPORTER_TABLE_PREFIX otel
compression str ROTEL_CLICKHOUSE_EXPORTER_COMPRESSION lz4
async_insert bool ROTEL_CLICKHOUSE_EXPORTER_ASYNC_INSERT true
user str ROTEL_CLICKHOUSE_EXPORTER_USER
password str ROTEL_CLICKHOUSE_EXPORTER_PASSWORD

When configuring Rotel with only environment variables, you must set ROTEL_EXPORTER=clickhouse in addition to the above environment variables.

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 Config, OTLPExporterEndpoint, Rotel

rotel = Rotel(
    enabled = True,
    exporter = Config.otlp_exporter(
        headers = {
            "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
  • ROTEL_OTLP_EXPORTER_LOGS_ENDPOINT=http://foo.example.com:4318/api/otlp/logs

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.

Full OTEL example

To illustrate this further, here's a full example of how to use Rotel to send trace spans to Axiom from an application instrumented with OpenTelemetry.

The code sample depends on the following environment variables:

  • ROTEL_ENABLED=true: Turn on or off based on the deployment environment
  • AXIOM_DATASET: Name of an Axiom dataset
  • AXIOM_API_TOKEN: Set to an API token that has access to the Axiom dataset
import os

from rotel import Config, Rotel

from opentelemetry import trace
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.resources import Resource, SERVICE_NAME
from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
from opentelemetry.sdk.trace.export import SimpleSpanProcessor


# Enable at deploy time with ROTEL_ENABLED=true
if os.environ.get("ROTEL_ENABLED") == "true":
    #
    # Configure Rotel to export to Axiom
    #
    otlp_exporter = Config.otlp_exporter(
        endpoint="https://api.axiom.co",
        protocol="http", # Axiom only supports HTTP
        headers={
            "Authorization": f"Bearer {os.environ['AXIOM_API_TOKEN']}",
            "X-Axiom-Dataset": os.environ["AXIOM_DATASET"],
        },
    )

    rotel = Rotel(
        enabled=True,
        exporter=otlp_exporter,
    )

    # Start the agent
    rotel.start()

    #
    # Configure OpenTelemetry SDK to export to the localhost Rotel
    #

    # Define the service name resource for the tracer.
    resource = Resource(
        attributes={
            SERVICE_NAME: "pyrotel-test"
        }
    )

    # Create a TracerProvider with the defined resource for creating tracers.
    provider = TracerProvider(resource=resource)

    # Create the OTel exporter to send to the localhost Rotel agent
    exporter = OTLPSpanExporter(endpoint = "http://localhost:4318/v1/traces")

    # Create a processor with the OTLP exporter to send trace spans.
    #
    # You could also use the BatchSpanProcessor, but since Rotel runs locally
    # and will batch, you can avoid double batching.
    processor = SimpleSpanProcessor(exporter)
    provider.add_span_processor(processor)

    # Set the TracerProvider as the global tracer provider.
    trace.set_tracer_provider(provider)

For the complete example, see the hello world application.

Datadog exporter example

To use the Datadog trace exporter instead, configure and start rotel as such:

from rotel import Config, Rotel

rotel = Rotel(
    enabled = True,
    exporter = Config.datadog_exporter(
        region = "us1",
        api_key = "1bde13d9cb1675c5ca8188c8c86066c9",
    ),
)
rotel.start()

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 and logs to debug logs.

FAQ

Do I need to call rotel.stop() when I exit?

In most deployment environments you do not need to call rotel.stop() and it is generally recommended that you don't. Calling rotel.stop() will terminate the running agent on a host, so any further export calls from OTEL instrumentation will fail. In a multiprocess environment, such as gunicorn, terminating the Rotel agent from one process will terminate it for all other processes. On ephemeral deployment platforms, it is usually fine to leave the agent running until the compute instance, VM/container/isolate, terminate.

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! 🚀

Developing

See the DEVELOPING.md doc for building and development instructions.

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.1a11-cp313-cp313-manylinux_2_34_x86_64.whl (5.9 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.34+ x86-64

rotel-0.0.1a11-cp313-cp313-manylinux_2_34_aarch64.whl (5.6 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.34+ ARM64

rotel-0.0.1a11-cp313-cp313-macosx_10_9_universal2.macosx_12_3_arm64.whl (5.4 MB view details)

Uploaded CPython 3.13macOS 10.9+ universal2 (ARM64, x86-64)macOS 12.3+ ARM64

rotel-0.0.1a11-cp312-cp312-manylinux_2_34_x86_64.whl (5.9 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.34+ x86-64

rotel-0.0.1a11-cp312-cp312-manylinux_2_34_aarch64.whl (5.6 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.34+ ARM64

rotel-0.0.1a11-cp312-cp312-macosx_10_9_universal2.macosx_12_3_arm64.whl (5.4 MB view details)

Uploaded CPython 3.12macOS 10.9+ universal2 (ARM64, x86-64)macOS 12.3+ ARM64

rotel-0.0.1a11-cp311-cp311-manylinux_2_34_x86_64.whl (5.9 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.34+ x86-64

rotel-0.0.1a11-cp311-cp311-manylinux_2_34_aarch64.whl (5.6 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.34+ ARM64

rotel-0.0.1a11-cp311-cp311-macosx_10_9_universal2.macosx_12_3_arm64.whl (5.4 MB view details)

Uploaded CPython 3.11macOS 10.9+ universal2 (ARM64, x86-64)macOS 12.3+ ARM64

rotel-0.0.1a11-cp310-cp310-manylinux_2_34_x86_64.whl (5.9 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.34+ x86-64

rotel-0.0.1a11-cp310-cp310-manylinux_2_34_aarch64.whl (5.6 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.34+ ARM64

rotel-0.0.1a11-cp310-cp310-macosx_10_9_universal2.macosx_12_3_arm64.whl (5.4 MB view details)

Uploaded CPython 3.10macOS 10.9+ universal2 (ARM64, x86-64)macOS 12.3+ ARM64

File details

Details for the file rotel-0.0.1a11-cp313-cp313-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for rotel-0.0.1a11-cp313-cp313-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 ad781f359317ced3c1d3e6eff02c82ba0bdc13542ae18e528d45ab4775bf61b0
MD5 fa8d16916b9bd52e7643bea5492ebb53
BLAKE2b-256 d672f06dc8967ebdac6d78a186cce1161c1561e2644291ca010921c88f3d74fa

See more details on using hashes here.

Provenance

The following attestation bundles were made for rotel-0.0.1a11-cp313-cp313-manylinux_2_34_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.1a11-cp313-cp313-manylinux_2_34_aarch64.whl.

File metadata

File hashes

Hashes for rotel-0.0.1a11-cp313-cp313-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 db2a0bd41bdac5e41ecdcc6268ae5737b4ed5fcc66194b97eabc8a9a008a939e
MD5 62252f197f11c39b8bda6f786eb3bcba
BLAKE2b-256 6c25e74bc29a9e0ed57adb9c30d02549bd753eab946adc06570af4c82cd13499

See more details on using hashes here.

Provenance

The following attestation bundles were made for rotel-0.0.1a11-cp313-cp313-manylinux_2_34_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.1a11-cp313-cp313-macosx_10_9_universal2.macosx_12_3_arm64.whl.

File metadata

File hashes

Hashes for rotel-0.0.1a11-cp313-cp313-macosx_10_9_universal2.macosx_12_3_arm64.whl
Algorithm Hash digest
SHA256 70fe74c3c6fb79832596cde15172533daed88221c3b182d807aa9d079ee480fa
MD5 44fcc2823adfae05498046f19a48a0ad
BLAKE2b-256 8f573cc9d24a5260f209e221782fc41a5217ba85ef75edb7b79248ff4391dd0e

See more details on using hashes here.

Provenance

The following attestation bundles were made for rotel-0.0.1a11-cp313-cp313-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.

File details

Details for the file rotel-0.0.1a11-cp312-cp312-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for rotel-0.0.1a11-cp312-cp312-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 bf0c8f6c549d6dd600f35dd7db221192c0e222bf501caabc7acc492a37b370eb
MD5 8dc3435c92fb8a1c65df658ca07412bf
BLAKE2b-256 f5190737efbb088f5aa5faaa2861efeef3da1cc1b0f5a7527872eb9636c378a1

See more details on using hashes here.

Provenance

The following attestation bundles were made for rotel-0.0.1a11-cp312-cp312-manylinux_2_34_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.1a11-cp312-cp312-manylinux_2_34_aarch64.whl.

File metadata

File hashes

Hashes for rotel-0.0.1a11-cp312-cp312-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 801f0af34943b2849461a714a1961cef29a628e8efbb75af16ec743699af39ba
MD5 3931c1567a092860495874621eeea22f
BLAKE2b-256 d0400305c244794cffcc37e31977ec2c1f487473494ac7e4a509501fdaf1c897

See more details on using hashes here.

Provenance

The following attestation bundles were made for rotel-0.0.1a11-cp312-cp312-manylinux_2_34_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.1a11-cp312-cp312-macosx_10_9_universal2.macosx_12_3_arm64.whl.

File metadata

File hashes

Hashes for rotel-0.0.1a11-cp312-cp312-macosx_10_9_universal2.macosx_12_3_arm64.whl
Algorithm Hash digest
SHA256 550929808224661e3615b8227bba67c664212c9c61a134997480ed3626f194d1
MD5 a114abb880d72935f30508f581497463
BLAKE2b-256 cba8b24a569255c6361e51dc35ba17e521fe29728730c143c27157dc7325bfe5

See more details on using hashes here.

Provenance

The following attestation bundles were made for rotel-0.0.1a11-cp312-cp312-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.

File details

Details for the file rotel-0.0.1a11-cp311-cp311-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for rotel-0.0.1a11-cp311-cp311-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 b360cb2e7ca218f08b2c7d49a886e50b3ae75d3a5d6d9cd4205d89af0166d236
MD5 347637c379708ff412ee9c03f5c9da6f
BLAKE2b-256 112297965a00b5b58f81dde3d970a028d7531a7aba77d88478eb62a53eaeb5fb

See more details on using hashes here.

Provenance

The following attestation bundles were made for rotel-0.0.1a11-cp311-cp311-manylinux_2_34_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.1a11-cp311-cp311-manylinux_2_34_aarch64.whl.

File metadata

File hashes

Hashes for rotel-0.0.1a11-cp311-cp311-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 ee41e2fc2c203e754ba077780cf99fa6efab631f96203c3556808a04a783dc79
MD5 d0826b5cbbc7fd77ea83a79c879bf08f
BLAKE2b-256 aea64fb38b3c2d7ec7186ca2128191d57373810a6c457d3edc176a8b850f0754

See more details on using hashes here.

Provenance

The following attestation bundles were made for rotel-0.0.1a11-cp311-cp311-manylinux_2_34_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.1a11-cp311-cp311-macosx_10_9_universal2.macosx_12_3_arm64.whl.

File metadata

File hashes

Hashes for rotel-0.0.1a11-cp311-cp311-macosx_10_9_universal2.macosx_12_3_arm64.whl
Algorithm Hash digest
SHA256 cfa959451b8abca58f598f5ba8df7f6ca00bd4119b237f463d1e0c6e4ffbc3fe
MD5 903abf1c252168228ffe4b51a67acd23
BLAKE2b-256 4204434b99e5bed45bd68852c66e993340673760803c1bf948791d0e60b12644

See more details on using hashes here.

Provenance

The following attestation bundles were made for rotel-0.0.1a11-cp311-cp311-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.

File details

Details for the file rotel-0.0.1a11-cp310-cp310-manylinux_2_34_x86_64.whl.

File metadata

File hashes

Hashes for rotel-0.0.1a11-cp310-cp310-manylinux_2_34_x86_64.whl
Algorithm Hash digest
SHA256 96974cda023047594cc751a55e5c446f27f2080102b8a1aa7b9233cb5c1b440b
MD5 0f5cfe48da8d77f15e08f6ebb470b241
BLAKE2b-256 69e1260cb89140233e3af9323a88f603e04382a5d35eba1f262405057dac1092

See more details on using hashes here.

Provenance

The following attestation bundles were made for rotel-0.0.1a11-cp310-cp310-manylinux_2_34_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.1a11-cp310-cp310-manylinux_2_34_aarch64.whl.

File metadata

File hashes

Hashes for rotel-0.0.1a11-cp310-cp310-manylinux_2_34_aarch64.whl
Algorithm Hash digest
SHA256 c3c27416d21393be34fbaa21ba9b1c524fae1cb226cb0e1022acd36f173661e2
MD5 5d2e819e4f010bdbb25067d113807dd9
BLAKE2b-256 7e6d68f5556b9b5eddafe058b82c7825b9c57ea73144f913ee261a60b491bf26

See more details on using hashes here.

Provenance

The following attestation bundles were made for rotel-0.0.1a11-cp310-cp310-manylinux_2_34_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.1a11-cp310-cp310-macosx_10_9_universal2.macosx_12_3_arm64.whl.

File metadata

File hashes

Hashes for rotel-0.0.1a11-cp310-cp310-macosx_10_9_universal2.macosx_12_3_arm64.whl
Algorithm Hash digest
SHA256 58345115f268db2e6484c54d255932bdc7317db7dd805f5f49b52c3c0e609d02
MD5 27042fabfee5eb73e11fa8deb3c44111
BLAKE2b-256 21a71df5de50c213a9422dd221c32e7e1c9f9f150133b6a317ad95b5cdd489a5

See more details on using hashes here.

Provenance

The following attestation bundles were made for rotel-0.0.1a11-cp310-cp310-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