Skip to main content

Common python code used in out backend services.

Project description

dcc-backend-common

PyPI version 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.8.tar.gz (221.6 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.8-py3-none-any.whl (24.2 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: dcc_backend_common-0.1.8.tar.gz
  • Upload date:
  • Size: 221.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.7 {"installer":{"name":"uv","version":"0.11.7","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.8.tar.gz
Algorithm Hash digest
SHA256 662c720423d32da6b694de91323e5129fd44d6f7fdcd174df5c6c1622e3e5103
MD5 171a81e63d5f0ad00b1dcb9020bdb72a
BLAKE2b-256 a33d33b22639c02d7d51d9e80699fb3531fb87d5b15c1c6e6873c4aaa6852613

See more details on using hashes here.

File details

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

File metadata

  • Download URL: dcc_backend_common-0.1.8-py3-none-any.whl
  • Upload date:
  • Size: 24.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.7 {"installer":{"name":"uv","version":"0.11.7","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.8-py3-none-any.whl
Algorithm Hash digest
SHA256 ab639e2bc28991e6dd516340f1fc2a2114f6a197c5d413354ab439f13b9306a4
MD5 6c65a652bc475cce8962cbb03e2767ba
BLAKE2b-256 281d941b4b0f699eb541b4e254fb71537ba4571622a8a22ad906ca20a1040a44

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