Skip to content

High-performance async HTTP logging handler for Datadog with batching, retry logic, and comprehensive error handling

License

Notifications You must be signed in to change notification settings

enlyft/datadog-async-handler

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

6 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Datadog Async Handler

PyPI version Python versions License: MIT Code style: ruff

A modern, high-performance Python logging handler that sends logs directly to Datadog via HTTP API with asynchronous batching, retry logic, and comprehensive error handling.

✨ Features

  • πŸš€ High Performance: Asynchronous batching and background processing
  • πŸ”„ Reliable Delivery: Automatic retry with exponential backoff
  • πŸ“Š Batching: Configurable batch size and flush intervals
  • 🏷️ Rich Metadata: Automatic service, environment, and custom tag support
  • πŸ”§ Easy Integration: Drop-in replacement for standard logging handlers
  • 🌐 Multi-Site Support: Works with all Datadog sites (US, EU, etc.)
  • πŸ“ Type Safe: Full type hints and mypy compatibility
  • ⚑ Modern: Built with Python 3.9+ and latest best practices

πŸš€ Quick Start

Installation

pip install datadog-async-handler

Basic Usage

import logging
from datadog_http_handler import DatadogHTTPHandler

# Configure the handler
handler = DatadogHTTPHandler(
    api_key="your-datadog-api-key",  # or set DD_API_KEY env var
    service="my-application",
    source="python",
    tags="env:production,team:backend"
)

# Set up logging
logger = logging.getLogger(__name__)
logger.addHandler(handler)
logger.setLevel(logging.INFO)

# Start logging!
logger.info("Application started successfully", extra={
    "user_id": "12345",
    "action": "startup"
})

Environment Variables

The handler automatically picks up standard Datadog environment variables:

export DD_API_KEY="your-api-key"
export DD_SERVICE="my-application"
export DD_ENV="production"
export DD_VERSION="1.2.3"
export DD_TAGS="team:backend,component:api"
export DD_SITE="datadoghq.com"  # or datadoghq.eu, ddog-gov.com, etc.

πŸ“– Documentation

Configuration Options

Parameter Type Default Description
api_key str None Datadog API key (required)
site str "datadoghq.com" Datadog site
service str None Service name
source str "python" Log source
hostname str None Hostname
tags str None Comma-separated tags
batch_size int 10 Number of logs per batch
flush_interval_seconds float 5.0 Batch flush interval
timeout_seconds float 10.0 Request timeout
max_retries int 3 Maximum retry attempts

Framework Integration Examples

Django

# settings.py
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'datadog': {
            'class': 'datadog_http_handler.DatadogHTTPHandler',
            'api_key': 'your-api-key',
            'service': 'django-app',
            'source': 'django',
        },
    },
    'root': {
        'handlers': ['datadog'],
        'level': 'INFO',
    },
}

FastAPI

import logging
from fastapi import FastAPI
from datadog_http_handler import DatadogHTTPHandler

app = FastAPI()

# Configure logging
handler = DatadogHTTPHandler(service="fastapi-app", source="fastapi")
logging.getLogger().addHandler(handler)
logging.getLogger().setLevel(logging.INFO)

@app.get("/")
async def root():
    logging.info("API endpoint called", extra={"endpoint": "/"})
    return {"message": "Hello World"}

Flask

import logging
from flask import Flask
from datadog_http_handler import DatadogHTTPHandler

app = Flask(__name__)

# Configure logging
handler = DatadogHTTPHandler(service="flask-app", source="flask")
app.logger.addHandler(handler)
app.logger.setLevel(logging.INFO)

@app.route("/")
def hello():
    app.logger.info("Flask endpoint called", extra={"endpoint": "/"})
    return "Hello World!"

πŸ”§ Development

Setup

# Clone the repository
git clone https://github.com/enlyft/datadog-http-handler.git
cd datadog-http-handler

# Install UV (modern Python package manager)
curl -LsSf https://astral.sh/uv/install.sh | sh

# Install dependencies
uv pip install -e ".[dev]"

# Install pre-commit hooks
pre-commit install

Running Tests

# Run all tests
hatch run test

# Run with coverage
hatch run test-cov

# Run specific tests
hatch run test tests/test_handler.py::test_basic_logging

Code Quality

# Format code
hatch run format

# Lint code
hatch run lint

# Type checking
hatch run type-check

# Run all checks
hatch run all

🀝 Contributing

We welcome contributions! Please see our Contributing Guide for details.

  1. Fork the repository
  2. Create a feature branch
  3. Make your changes
  4. Add tests
  5. Run the test suite
  6. Submit a pull request

πŸ“‹ Requirements

  • Python 3.9+
  • datadog-api-client>=2.0.0

πŸ“„ License

This project is licensed under the MIT License - see the LICENSE file for details.

πŸ”— Links

πŸ†š Comparison with Other Solutions

Feature datadog-async-handler datadog-http-handler python-datadog datadog-logger
Async Batching βœ… ❌ ❌ ❌
Retry Logic βœ… ❌ ❌ ❌
Type Hints βœ… ❌ ❌ ❌
Modern Python βœ… (3.9+) ❌ (3.6+) ❌ (2.7+) ❌ (3.6+)
Official API Client βœ… ❌ ❌ ❌
Background Processing βœ… ❌ ❌ ❌
Memory Efficient βœ… ❌ ❌ ❌
Active Maintenance βœ… ❌ (2019) βœ… ❌
Comprehensive Tests βœ… ❌ βœ… ❌

Made with ❀️ for the Python and Datadog communities.

About

High-performance async HTTP logging handler for Datadog with batching, retry logic, and comprehensive error handling

Topics

Resources

License

Contributing

Stars

Watchers

Forks

Packages

No packages published

Languages