Skip to main content

Drop-in ASGI/WSGI middleware for endpoint timing with Server-Timing headers.

Project description

philiprehberger-api-timer

Tests PyPI version Last updated

philiprehberger-api-timer

Drop-in ASGI/WSGI middleware for endpoint timing with Server-Timing headers.

Installation

pip install philiprehberger-api-timer

Usage

ASGI (FastAPI, Starlette)

from fastapi import FastAPI
from philiprehberger_api_timer import ASGITimerMiddleware

app = FastAPI()
app.add_middleware(ASGITimerMiddleware, slow_threshold_ms=500)

WSGI (Flask, Django)

from flask import Flask
from philiprehberger_api_timer import WSGITimerMiddleware

app = Flask(__name__)
app.wsgi_app = WSGITimerMiddleware(app.wsgi_app, slow_threshold_ms=500)

Custom Logger

import logging
from philiprehberger_api_timer import ASGITimerMiddleware

logger = logging.getLogger("my_api")
app.add_middleware(ASGITimerMiddleware, logger=logger, include_header=False)

Exclude Paths

from philiprehberger_api_timer import ASGITimerMiddleware

app.add_middleware(
    ASGITimerMiddleware,
    exclude_paths=["/health", "/metrics"],  # bypass timing entirely
)

Custom Header Name

from philiprehberger_api_timer import WSGITimerMiddleware

app.wsgi_app = WSGITimerMiddleware(app.wsgi_app, header_name="X-Request-Time")

Export to Prometheus / statsd via metric_callback

from philiprehberger_api_timer import ASGITimerMiddleware

def record(method: str, path: str, status: int, elapsed_ms: float) -> None:
    histogram.labels(method=method, path=path, status=status).observe(elapsed_ms)

app.add_middleware(ASGITimerMiddleware, metric_callback=record)

The callback fires once per non-excluded request after the response has been sent. Exceptions raised inside the callback are caught and logged so they cannot break the response.

What It Does

  • Adds Server-Timing header to every response (e.g., Server-Timing: total;dur=42.5)
  • Logs a WARNING for requests exceeding the slow threshold
  • Zero configuration required — just add the middleware

API

Function / Class Description
ASGITimerMiddleware(app, logger=None, slow_threshold_ms=500, include_header=True, header_name="Server-Timing", exclude_paths=None, metric_callback=None) ASGI middleware
WSGITimerMiddleware(app, logger=None, slow_threshold_ms=500, include_header=True, header_name="Server-Timing", exclude_paths=None, metric_callback=None) WSGI middleware
MetricCallback Type alias for (method, path, status, elapsed_ms) -> None

Development

pip install -e .
python -m pytest tests/ -v

Support

If you find this project useful:

Star the repo

🐛 Report issues

💡 Suggest features

❤️ Sponsor development

🌐 All Open Source Projects

💻 GitHub Profile

🔗 LinkedIn Profile

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

philiprehberger_api_timer-0.3.0.tar.gz (191.7 kB view details)

Uploaded Source

Built Distribution

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

philiprehberger_api_timer-0.3.0-py3-none-any.whl (5.5 kB view details)

Uploaded Python 3

File details

Details for the file philiprehberger_api_timer-0.3.0.tar.gz.

File metadata

File hashes

Hashes for philiprehberger_api_timer-0.3.0.tar.gz
Algorithm Hash digest
SHA256 552b87edc23af9254e7e950445441f5c4a608e99d06e9b2cf44e3e10da09a7fd
MD5 9d519dfa4dc29c50adeec5eb7a68d713
BLAKE2b-256 055cb400ad8fddb6f5ca16fb8cbacc85f3502ac8fc48e4fe18dee6c6c462c00c

See more details on using hashes here.

File details

Details for the file philiprehberger_api_timer-0.3.0-py3-none-any.whl.

File metadata

File hashes

Hashes for philiprehberger_api_timer-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 0e000e7bedf4c8adba275d7e4d77f56a190504b8416d456dbb51cb1a26cd7a01
MD5 37e7ddeba1e7e8d8091384463815fdac
BLAKE2b-256 d0ef07b72c6cdcf6813618108d8eb13656d9b5871e039e180dd8bd58549d3037

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