Skip to main content

Common python code used in out backend services.

Project description

dcc-backend-common

Commit activity License

Common utilities and components for backend services developed by the Data Competence Center Basel-Stadt.

Overview

dcc-backend-common is a Python library that provides shared functionality for backend services, including:

  • FastAPI Health Probes: Kubernetes-ready health check endpoints (liveness, readiness, startup)
  • Structured Logging: Integration with structlog for consistent logging across services
  • Configuration Management: Environment-based configuration with python-dotenv
  • DSPy Utilities: Helpers for DSPy modules, streaming listeners, metrics, and dataset preparation

Installation

Basic Installation (uv)

uv add dcc-backend-common

With FastAPI Support

uv add "dcc-backend-common[fastapi]"

Requirements

  • Python 3.12 or higher
  • Dependencies:
    • dspy>=3.0.4
    • python-dotenv>=1.0.1
    • structlog>=25.1.0

Optional Dependencies

  • FastAPI extras: aiohttp>=3.13.2, fastapi>=0.115,<1.0

Features

FastAPI Health Probes

The library provides Kubernetes-ready health check endpoints that follow best practices for container orchestration:

Example Usage

from fastapi import FastAPI
from dcc_backend_common.fastapi_health_probes import health_probe_router

app = FastAPI()

# Define external service dependencies
service_dependencies = [
    {
        "name": "database",
        "health_check_url": "http://postgres:5432/health",
        "api_key": None  # Optional API key for authenticated health checks
    },
    {
        "name": "external-api",
        "health_check_url": "https://api.example.com/health",
        "api_key": "your-api-key-here"
    }
]

# Include health probe router
app.include_router(health_probe_router(service_dependencies))

Available Endpoints

1. Liveness Probe (GET /health/liveness)
  • Purpose: Checks if the application process is running and not deadlocked
  • Kubernetes Action: If this fails, the container is killed and restarted
  • Response: Returns uptime in seconds
  • Rule: Keep it simple. Do NOT check databases or external dependencies here
{
  "status": "up",
  "uptime_seconds": 123.45
}
2. Readiness Probe (GET /health/readiness)
  • Purpose: Checks if the app is ready to handle user requests
  • Kubernetes Action: If this fails, traffic stops being sent to this pod
  • Response: Returns status of all configured service dependencies
  • Rule: Check critical dependencies here (databases, external APIs, etc.)
{
  "status": "ready",
  "checks": {
    "database": "healthy",
    "external-api": "healthy"
  }
}

If a dependency fails:

{
  "status": "unhealthy",
  "checks": {
    "database": "error: Connection refused",
    "external-api": "unhealthy (status: 503)"
  },
  "error": "Service unavailable"
}
3. Startup Probe (GET /health/startup)
  • Purpose: Checks if the application has finished initialization
  • Kubernetes Action: Blocks liveness/readiness probes until this returns 200
  • Response: Returns startup timestamp
  • Rule: Useful for apps that need to load large ML models or caches on boot
{
  "status": "started",
  "timestamp": "2025-12-04T10:30:00.000000+00:00"
}

Features

  • Automatic Logging Suppression: Health check endpoints are automatically excluded from access logs to reduce noise
  • Dependency Health Checks: Readiness probe checks external service dependencies with configurable timeouts (5 seconds default)
  • Authentication Support: Optional API key support for authenticated health checks
  • Kubernetes-Ready: HTTP status codes follow Kubernetes conventions (200 = healthy, 503 = unhealthy)

Structured Logging

  • Initialize structured logging with init_logger(), which auto-selects JSON output in production (IS_PROD=true) and colored console output otherwise.
  • Retrieve loggers via get_logger(__name__). A request_id and timestamp are added automatically.

Application Configuration

Load strongly-typed configuration from environment variables:

from dcc_backend_common.config.app_config import AppConfig

config = AppConfig.from_env()
print(config)  # secrets are redacted in __str__

Required variables: CLIENT_URL, HMAC_SECRET, OPENAI_API_KEY, LLM_URL, DOCLING_URL, WHISPER_URL, OCR_URL. Missing values raise AppConfigError.

Development

Setup

  1. Clone the repository:
git clone https://github.com/DCC-BS/backend-common.git
cd backend-common
  1. Install development dependencies:
uv sync --group dev --all-extras  # include all extras for local dev

Running Tests

uv run pytest

Code Quality

This project uses:

  • Ruff: For linting and formatting
  • Pre-commit: For automated code quality checks
  • Tox: For testing across multiple Python versions

Run linting:

uv run ruff check .

Run pre-commit hooks:

uv run pre-commit run --all-files

Releasing

This project uses GitHub Actions for automated releases to PyPI.

To release a new version:

  1. Update the version: Update the version field in pyproject.toml.
  2. Commit and push: Commit the version change and push it to the main branch.
  3. Trigger the workflow:
    • Navigate to the Actions tab in the GitHub repository.
    • Select the Publish to PyPI workflow.
    • Click Run workflow.
  4. Automated steps: The workflow will:
    • Automatically detect the version using uv version --short.
    • Create and push a git tag (e.g., v0.1.0).
    • Build the package with uv build.
    • Publish to PyPI using Trusted Publishing.

Contributing

See CONTRIBUTING.md for details on how to contribute to this project.

License

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

Authors

Links

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

dcc_backend_common-0.1.3.tar.gz (217.5 kB view details)

Uploaded Source

Built Distribution

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

dcc_backend_common-0.1.3-py3-none-any.whl (21.1 kB view details)

Uploaded Python 3

File details

Details for the file dcc_backend_common-0.1.3.tar.gz.

File metadata

  • Download URL: dcc_backend_common-0.1.3.tar.gz
  • Upload date:
  • Size: 217.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.9.27 {"installer":{"name":"uv","version":"0.9.27","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for dcc_backend_common-0.1.3.tar.gz
Algorithm Hash digest
SHA256 2e96398a914ed119afff1ed1bed02431ec9b95871fadb5e86af0280d8caa4ee1
MD5 edeada4c996cff5ff360e9e3e3b06126
BLAKE2b-256 1dd81ec3892b8d87c7be32615002d9d130e9170760b7ca8eaa6e7c95839ab797

See more details on using hashes here.

File details

Details for the file dcc_backend_common-0.1.3-py3-none-any.whl.

File metadata

  • Download URL: dcc_backend_common-0.1.3-py3-none-any.whl
  • Upload date:
  • Size: 21.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.9.27 {"installer":{"name":"uv","version":"0.9.27","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for dcc_backend_common-0.1.3-py3-none-any.whl
Algorithm Hash digest
SHA256 576892def5a664f38bacd97b142e24e487ca42b78c20a8b876da5b2230d5e2bc
MD5 33b71e40a600f6dd2507663095567ef5
BLAKE2b-256 d6febe0dc9fe80dd49a438c65e76406cd31ac26ba14a5ab701a9ac7a70a8ab35

See more details on using hashes here.

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