Skip to main content

⏱️ fastapi-timer

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

Current version: 0.1.4

✨ 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: 1998.94ms
  geocoding - downstream1: 1236.11ms
  weather - downstream2: 738.61ms
  application: 24.22ms

🛠️ 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.4.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.4-py3-none-any.whl (3.6 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: fastapi_timer-0.1.4.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.4.tar.gz
Algorithm Hash digest
SHA256 5557b26bd8fa74e481d9327b05bcfa91dc4cd12b8199496423926e1dae12524c
MD5 c7583baaa4b563de34d18f5620cedd5f
BLAKE2b-256 965d8f05eac3d78ed2833ea7deb254bcc3c720285321b05852373b29030cb529

See more details on using hashes here.

File details

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

File metadata

  • Download URL: fastapi_timer-0.1.4-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.4-py3-none-any.whl
Algorithm Hash digest
SHA256 b81bcf1618c2f871937ed8edc8ac4b6268d1ed8153be4f37a217d96cde0b2e9c
MD5 ec1e1583abf3f50a5e7db3488bc6ca00
BLAKE2b-256 1de466f3aa053b8f7f18e7e67139dca9d0a20fc6a0ec5df08492fb8a86a4724c

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