Skip to main content

A comprehensive observability library for Python applications with logging, metrics, and tracing

Project description

corrupt o11y

CI codecov License: MIT Python 3.11+ uv

A comprehensive observability library for Python applications with logging, metrics, and tracing.

Features

  • Structured Logging - JSON-formatted logs with OpenTelemetry trace correlation
  • Flexible Processor Chain - PII redaction, field filtering, exception enhancement, conditional processing
  • Prometheus Metrics - Built-in collectors for GC, platform, and process metrics with custom metric support
  • OpenTelemetry Tracing - Multiple exporters (OTLP HTTP/gRPC, console)
  • Operational Endpoints - Health checks, metrics, and service info HTTP server
  • Service Metadata - Centralized service information management
  • Type Safe - Strict type checking with mypy
  • Environment-Based Configuration - All components configurable via environment variables

Quick Start

from corrupt_o11y import logging, metrics, tracing
from corrupt_o11y.operational import Status, OperationalServerConfig, OperationalServer
from corrupt_o11y.metadata import ServiceInfo

async def main():
    # Setup service information
    service_info = ServiceInfo.from_env()

    # Configure logging
    log_config = logging.LoggingConfig.from_env()
    logging.configure_logging(log_config)
    logger = logging.get_logger(__name__)

    # Set up metrics
    metrics_collector = metrics.MetricsCollector()
    metrics_collector.create_service_info_metric_from_service_info(service_info)

    # Configure tracing
    trace_config = tracing.TracingConfig.from_env()
    tracing.configure_tracing(trace_config, service_info.name, service_info.version)
    tracer = tracing.get_tracer(__name__)

    # Set up operational server
    status = Status()
    op_config = OperationalServerConfig.from_env()
    server = OperationalServer(op_config, service_info.asdict(), status, metrics_collector)
    await server.start()
    status.is_ready = True

    # Use observability features
    logger.info("Service started", extra={"port": 8080})

    with tracer.start_as_current_span("process_request"):
        # Your business logic here
        logger.info("Processing request")

Configuration

All components are configured via environment variables:

Logging

  • LOG_LEVEL - Log level (default: INFO)
  • LOG_AS_JSON - Output JSON format (default: false)
  • LOG_TRACING - Include trace information (default: false)

Tracing

  • TRACING_ENABLED - Enable tracing (default: true)
  • TRACING_EXPORTER_TYPE - Exporter type: stdout, http, grpc (default: stdout)
  • TRACING_EXPORTER_ENDPOINT - OTLP endpoint URL (required for http/grpc)
  • TRACING_INSECURE - Use insecure connection (default: false)
  • TRACING_TIMEOUT - Request timeout in seconds (default: 30)

Metrics

  • METRICS_ENABLE_GC - Enable GC metrics collector (default: true)
  • METRICS_ENABLE_PLATFORM - Enable platform metrics collector (default: true)
  • METRICS_ENABLE_PROCESS - Enable process metrics collector (default: true)
  • METRICS_PREFIX - Prefix for custom metrics (default: empty)

Operational Server

  • OPERATIONAL_HOST - Bind address (default: 0.0.0.0)
  • OPERATIONAL_PORT - Port number (default: 42069)

Service Metadata

  • SERVICE_NAME - Service name (default: unknown-dev)
  • SERVICE_VERSION - Service version (default: unknown-dev)
  • INSTANCE_ID - Instance identifier (default: unknown-dev)
  • COMMIT_SHA - Git commit SHA (default: unknown-dev)
  • BUILD_TIME - Build timestamp (default: unknown-dev)

Endpoints

The operational server provides:

  • GET /health - Liveness check (200 if alive)
  • GET /ready - Readiness check (200 if ready)
  • GET /metrics - Prometheus metrics
  • GET /info - Service information JSON

Service Info Metric

Following Prometheus best practices, service metadata is exposed as an info metric:

service_info{service="my-service", version="1.2.3", instance="pod-123", commit="abc123"} 1

This provides rich metadata without increasing cardinality of other metrics.

Advanced Usage

Logging Processors

The library supports flexible processor chains for log processing:

from corrupt_o11y.logging import LoggingCollector
from corrupt_o11y.logging.processors import (
    PIIRedactionProcessor,
    FieldFilterProcessor,
    EnhancedExceptionProcessor,
    ConditionalProcessor,
    is_level
)

collector = LoggingCollector()
collector.preprocessing().extend([
    PIIRedactionProcessor(),  # Redact PII (emails, phones, etc.)
    FieldFilterProcessor(blocked_fields=["password", "token"]),  # Filter sensitive fields
    ConditionalProcessor(
        condition=is_level("error"),
        processor=EnhancedExceptionProcessor()  # Enhanced exception info for errors
    )
])

logging.configure_logging(config, collector)

Custom Metrics

from prometheus_client import Counter, Histogram

# Create custom metrics
request_counter = Counter(
    "http_requests_total",
    "Total HTTP requests",
    ["method", "endpoint", "status"],
    registry=None
)

# Register with collector
metrics_collector.register("http_requests", request_counter)

# Use metrics
request_counter.labels(method="GET", endpoint="/api/users", status="200").inc()

Installation

Basic Installation (Metrics Only)

# With uv (recommended)
uv add corrupt-o11y

# With pip
pip install corrupt-o11y

With Optional Features

# Structured logging support
uv add "corrupt-o11y[logging]"
pip install "corrupt-o11y[logging]"

# OpenTelemetry tracing support
uv add "corrupt-o11y[otlp]"
pip install "corrupt-o11y[otlp]"

# OTLP exporters for tracing
uv add "corrupt-o11y[otlp-http,otlp-grpc]"
# or
pip install "corrupt-o11y[otlp-http,otlp-grpc]"

# HTTP operational server
uv add "corrupt-o11y[server]"
pip install "corrupt-o11y[server]"

# All features
uv add "corrupt-o11y[all]"
pip install "corrupt-o11y[all]"

Development

For contributors (using uv as recommended package manager):

# Install with development dependencies and all optional features
uv sync --dev --all-extras

# Install pre-commit hooks
uv run pre-commit install

# Run linting and type checking
uv run ruff check
uv run ruff format --check
uv run mypy

# Run tests with coverage
uv run pytest tests/ --cov=src --cov-report=term-missing --cov-branch

# Or just commit - pre-commit will run all checks automatically

With pip:

pip install -e ".[dev]"
pre-commit install

Requirements

  • Python 3.11+
  • OpenTelemetry
  • Prometheus Client
  • structlog
  • aiohttp

License

MIT

Project details


Download files

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

Source Distribution

corrupt_o11y-0.3.4.tar.gz (22.8 kB view details)

Uploaded Source

Built Distribution

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

corrupt_o11y-0.3.4-py3-none-any.whl (30.9 kB view details)

Uploaded Python 3

File details

Details for the file corrupt_o11y-0.3.4.tar.gz.

File metadata

  • Download URL: corrupt_o11y-0.3.4.tar.gz
  • Upload date:
  • Size: 22.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for corrupt_o11y-0.3.4.tar.gz
Algorithm Hash digest
SHA256 0c19bd1548f291c7af770e4bc35c1c22cc42c0ad034339d943a7a8e8e83063f3
MD5 47491dd37a2f6f64346093f97bb18864
BLAKE2b-256 e1e288bc5678cb3b46e3fa8f45a49b9604ae673241ea17e7f3cef82bc2003c46

See more details on using hashes here.

Provenance

The following attestation bundles were made for corrupt_o11y-0.3.4.tar.gz:

Publisher: release.yml on corruptmane/corrupt-o11y-py

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

File details

Details for the file corrupt_o11y-0.3.4-py3-none-any.whl.

File metadata

  • Download URL: corrupt_o11y-0.3.4-py3-none-any.whl
  • Upload date:
  • Size: 30.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for corrupt_o11y-0.3.4-py3-none-any.whl
Algorithm Hash digest
SHA256 8e9d29819f0a79e15955db4fed179795783a8f782a49ed9d41235fd13cc7c6d9
MD5 328317f716d5b705404b53d8401833a2
BLAKE2b-256 5ffff410af00a31ba5718614f0da3c12738bc32bebb54da1808d419c3af772d5

See more details on using hashes here.

Provenance

The following attestation bundles were made for corrupt_o11y-0.3.4-py3-none-any.whl:

Publisher: release.yml on corruptmane/corrupt-o11y-py

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