Skip to main content

A unified OpenTelemetry observability package for Python applications

Project description

OTEL Observability Package

Pytest Pylint Upload Python Package

A unified OpenTelemetry observability package for Python applications that provides easy-to-use logging, metrics, and tracing with best practices.

Features

  • Unified Configuration: Configure all observability components through environment variables or programmatic configuration
  • Multiple Exporters: Support for OTLP (gRPC), HTTP, and Console exporters
  • Thread-Safe: Singleton pattern ensures thread-safe initialization
  • Easy Integration: Simple API for logging, metrics, and tracing
  • Decorators: Built-in decorators for automatic tracing and logging

Installation

From PyPI

pip install otel-observability

From Source

git clone https://github.com/Touzi-Mortadha/otel-observability.git
cd otel-observability
pip install -e .

Quick Start

Basic Usage with Environment Variables

from otel_observability import initialize_observability, get_logger, get_metrics, get_traces

# Initialize observability (reads from environment variables)
manager = initialize_observability()

# Get a logger
logger = get_logger(__name__)
logger.info("Application started")

# Get a meter for metrics
meter = get_metrics("my_app")
request_counter = meter.create_counter("requests_total", description="Total requests")
request_counter.add(1, {"endpoint": "/api"})

# Get a tracer for distributed tracing
tracer = get_traces("my_app")
with tracer.start_as_current_span("process_request") as span:
    span.set_attribute("user.id", "123")
    logger.info("Processing request")

Programmatic Configuration

from otel_observability import ObservabilityManager, ObservabilityConfig

# Create custom configuration
config = ObservabilityConfig(
    app_name="my-app",
    component="test-component",
    otlp_endpoint="localhost:4317",  # OTLP gRPC endpoint
    log_level=LogLevel.INFO,
    insecure=True,
)

# Initialize with custom config
manager = ObservabilityManager(config)
manager.initialize_all()

# Use the manager directly
logger = manager.get_logger(__name__)
meter = manager.get_meter("my_app")
tracer = manager.get_tracer("my_app")

Using Decorators

from otel_observability import ObservabilityDecorators

@ObservabilityDecorators.trace_method()
@ObservabilityDecorators.log_execution()
def process_data(data):
    """Process data with automatic tracing and logging."""
    logger.info(f"Processing data: {data}")
    return {"processed": True, **data}

result = process_data({"input": "test"})

Configuration

Environment Variables

Variable Description Default
OTEL_APP_NAME App name for resource attributes unknown-service
OTEL_COMPONENT_NAME service name for resource attributes unknown-component
OTEL_GRPC_URL OTLP gRPC endpoint URL None
OTEL_HTTP_URL Base HTTP URL for OTLP HTTP exporters None
OTEL_HTTP_LOGS_URL Specific HTTP URL for logs {OTEL_HTTP_URL}/v1/logs
OTEL_HTTP_TRACES_URL Specific HTTP URL for traces {OTEL_HTTP_URL}/v1/traces
OTEL_HTTP_METRICS_URL Specific HTTP URL for metrics {OTEL_HTTP_URL}/v1/metrics
OTEL_INSECURE Use insecure connection for gRPC true
LOG_LEVEL Log level (DEBUG, INFO, WARNING, ERROR, CRITICAL) INFO
OTEL_METRIC_EXPORT_INTERVAL_MS Metrics export interval in milliseconds 60000
ENABLE_CONSOLE_DEBUG Enable console output for debugging false

Programmatic Configuration

Create an ObservabilityConfig instance with the following parameters:

  • app_name: Your app name (required)
  • component: Your service name (required)
  • otlp_endpoint: OTLP gRPC endpoint URL
  • http_logs_url: HTTP endpoint for logs
  • http_traces_url: HTTP endpoint for traces
  • http_metrics_url: HTTP endpoint for metrics
  • insecure: Use insecure connection (default: True)
  • log_level: Log level (default: LogLevel.INFO)
  • metric_export_interval_ms: Metrics export interval (default: 60000)
  • enable_console_debug: Enable console debugging (default: False)

API Reference

Core Functions

  • initialize_observability(): Initialize all components and return manager
  • get_logger(name): Get a configured logger instance
  • get_metrics(name, version): Get a meter for creating metrics
  • get_traces(name, version): Get a tracer for creating spans

ObservabilityManager

The main manager class providing:

  • get_logger(name): Get logger by name
  • get_meter(name, version): Get meter by name and version
  • get_tracer(name, version): Get tracer by name and version
  • create_counter(): Create a counter metric
  • create_histogram(): Create a histogram metric
  • shutdown(): Gracefully shutdown all providers

ObservabilityDecorators

  • @trace_method(): Automatically trace method execution
  • @log_execution(): Automatically log method execution

Examples

Flask Application

from flask import Flask
from otel_observability import initialize_observability, get_logger, ObservabilityDecorators

app = Flask(__name__)
manager = initialize_observability()
logger = get_logger(__name__)

@app.route('/')
@ObservabilityDecorators.trace_method()
def hello():
    logger.info("Hello endpoint called")
    return "Hello World!"

if __name__ == '__main__':
    app.run()

FastAPI Application

from fastapi import FastAPI
from otel_observability import initialize_observability, get_logger, get_traces

app = FastAPI()
manager = initialize_observability()
logger = get_logger(__name__)
tracer = get_traces("fastapi_app")

@app.get("/")
async def read_root():
    with tracer.start_as_current_span("read_root"):
        logger.info("Root endpoint called")
        return {"Hello": "World"}

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

otel_observability-0.1.4.tar.gz (16.4 kB view details)

Uploaded Source

Built Distribution

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

otel_observability-0.1.4-py3-none-any.whl (13.1 kB view details)

Uploaded Python 3

File details

Details for the file otel_observability-0.1.4.tar.gz.

File metadata

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

File hashes

Hashes for otel_observability-0.1.4.tar.gz
Algorithm Hash digest
SHA256 7ec3dbb1d572da2c58ca58b9eced6ca9ce7a39479392b3c1ce9364d243351f55
MD5 3bafb63c7c37bf15b177c00897ed87a3
BLAKE2b-256 61857b63000ff7d1fd0b5859bbf0e15e4f3cf9a369ee812d5b79b184aec91660

See more details on using hashes here.

Provenance

The following attestation bundles were made for otel_observability-0.1.4.tar.gz:

Publisher: python-publish.yml on Touzi-Mortadha/otel-observability

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

File details

Details for the file otel_observability-0.1.4-py3-none-any.whl.

File metadata

File hashes

Hashes for otel_observability-0.1.4-py3-none-any.whl
Algorithm Hash digest
SHA256 978fbc3aadc3379de2161823ee1778a095726e6e4ee68da24b0c688d6d7a4a9d
MD5 4bcb224fcb1d080191b650f6fdb253cd
BLAKE2b-256 b900b52fd5505c3407e7c6e23e60719b613b7ba928fb6fc3fe1d2cb41b5fff16

See more details on using hashes here.

Provenance

The following attestation bundles were made for otel_observability-0.1.4-py3-none-any.whl:

Publisher: python-publish.yml on Touzi-Mortadha/otel-observability

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