Skip to main content

⏱️ fastapi-timer

Lightweight FastAPI middleware for measuring API response time and downstream operation latency.

Current version: 0.1.3

✨ Features

  • ⏱️ Measure total API response time
  • 🌐 Measure latency of any downstream operation
  • 📊 See application vs downstream latency
  • ⚡ Designed for async FastAPI applications
  • 🪶 Lightweight and simple
  • 🚫 No database required
  • 🚫 No response headers

🚀 Why fastapi-timer?

When a FastAPI API is slow, it can be difficult to tell whether the time is being spent inside your application or waiting for a downstream service.

Without instrumentation, you might repeatedly write timing code:

import time

start = time.perf_counter()

response = await client.get("https://example.com")

elapsed = (time.perf_counter() - start) * 1000
print(f"Downstream latency: {elapsed:.2f}ms")

fastapi-timer provides a simple way to do this:

async with request.state.timer.track("downstream"):
    response = await client.get("https://example.com")

The middleware then logs:

GET /example
  total: 460.98ms
  downstream: 459.97ms
  application: 1.01ms

📊 What does it measure?

  • 🕐 total — complete API response time
  • 🌐 downstream — time spent in a tracked downstream operation
  • ⚙️ application — remaining application processing time

📦 Installation

Using uv:

uv add fastapi-timer

Using pip :

pip install fastapi-timer

🚀 Usage

Add the middleware to your FastAPI application:

from fastapi import FastAPI, Request

from fastapi_timer import TimingMiddleware

app = FastAPI()

app.add_middleware(TimingMiddleware)

Track any downstream async operation:

import httpx

@app.get("/example")
async def example(request: Request):
    timer = request.state.timer

    async with timer.track("downstream"):
        async with httpx.AsyncClient() as client:
            response = await client.get("https://example.com")

    return response.json()

🌤️ Example

A complete working example using a weather API is available in:

examples/weather.py

The weather API is only an example. fastapi-timer can be used with any downstream async operation, including external APIs, microservices, and other network calls.

Run the example locally:

uv run uvicorn examples.weather:app --reload

Then request weather for a city:

curl "http://127.0.0.1:8000/weather?city=Chennai"

Example output:

GET /weather
  total: 2445.45ms
  downstream: 777.26ms
  application: 1668.18ms

🛠️ Development

Install development dependencies:

uv sync

Run tests:

uv run pytest

Run tests with console output:

uv run pytest -s

Build the package:

uv build

📋 Requirements

  • 🐍 Python 3.12+
  • ⚡ FastAPI 0.141.1+

📄 License

MIT License

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

fastapi_timer-0.1.3.tar.gz (2.5 kB view details)

Uploaded Source

Built Distribution

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

fastapi_timer-0.1.3-py3-none-any.whl (3.6 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: fastapi_timer-0.1.3.tar.gz
  • Upload date:
  • Size: 2.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.12.9

File hashes

Hashes for fastapi_timer-0.1.3.tar.gz
Algorithm Hash digest
SHA256 c5494648ff6545dddcd7560d7bdebe5bbdd4b2c4ca2c6ebfbf62c1cf6666529c
MD5 f48f31088743dde3cfc66181d6910d0a
BLAKE2b-256 b56b3d04e49091d63b595a7cf84dc602a81993b36a0a8897ce8312e319dae3f1

See more details on using hashes here.

File details

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

File metadata

  • Download URL: fastapi_timer-0.1.3-py3-none-any.whl
  • Upload date:
  • Size: 3.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.12.9

File hashes

Hashes for fastapi_timer-0.1.3-py3-none-any.whl
Algorithm Hash digest
SHA256 24e52ce0595301403329b2e797ed905d07f431cddb2676f918cb3f7f40d4e809
MD5 0ae2edc2d54616b2147a28c07ec20683
BLAKE2b-256 61bf3b8c405b6d89da937e511624809bae1c04129215685659f3a5b433ba6b99

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 Sentry Error logging StatusPage Status page