Skip to main content

SQL profiler middleware for FastAPI

Project description

FastAPI-Silk

Lightweight SQL profiling middleware for FastAPI + SQLAlchemy
Track query count, database time, and total request time per request.

PyPI Downloads CI Python License

Installation | Quick Start | How It Works | Development

Why FastAPI-Silk

Capability Details
SQL instrumentation setup_sql_profiler(engine) hooks into SQLAlchemy engine events (before_cursor_execute / after_cursor_execute) so SQL executed through that engine is captured per request.
Request-level metrics Adds X-DB-Queries, X-DB-Time, and X-Total-Time response headers.
Slow query visibility Logs queries slower than 0.1s to stdout for quick diagnostics.
Context isolation Uses contextvars for per-request query storage.
Minimal setup One profiler setup call + one middleware registration.

Installation

pip install fastapi-silk

PyPI: https://pypi.org/project/fastapi-silk/

Quick Start

from fastapi import FastAPI
from sqlalchemy import create_engine, text

from fastapi_silk import SQLDebugMiddleware, setup_sql_profiler, silk_router

app = FastAPI()
engine = create_engine("sqlite:///./app.db")

# Profiles SQL that goes through this engine
setup_sql_profiler(engine)
app.add_middleware(SQLDebugMiddleware)

# For the UI use
app.include_router(silk_router)

@app.get("/health")
def health() -> dict[str, bool]:
    with engine.connect() as conn:
        conn.execute(text("SELECT 1"))
    return {"ok": True}

Example response headers:

X-DB-Queries: 1
X-DB-Time: 0.0012s
X-Total-Time: 0.0049s

How It Works

flowchart LR
  A[Incoming request] --> B[SQLDebugMiddleware starts request timer]
  B --> C[Endpoint runs SQL through profiled SQLAlchemy Engine]
  C --> D[setup_sql_profiler listeners capture query start/end]
  D --> E[Query data stored in request-local context]
  E --> F[Middleware sets X-DB-Queries, X-DB-Time, X-Total-Time]

Requirements

Item Requirement
Python >=3.8 (CI runs 3.10 through 3.14)
Framework FastAPI
Database layer SQLAlchemy Engine

Code Convention / Style

  • Use Ruff for linting and formatting.
  • Use MyPy (strict mode) for type checks.
  • Keep changes small and typed where possible.

Development

Install dev dependencies and run checks:

uv sync --locked --all-extras --dev
make ci
python -m pytest

make ci runs:

  • Ruff lint/format checks
  • MyPy strict type checks

Contributing

  1. Create a branch from development (for example, feature/<name> or fix/<name>).
  2. Keep the pull request focused on a single change.
  3. Add or update tests when behavior changes.
  4. Run checks locally (make ci and python -m pytest).
  5. Open a PR with a clear summary of what changed, why, and how it was tested.

Scope

FastAPI-Silk focuses on SQL profiling and request timing headers. It does not provide a built-in dashboard UI.

License

GNU General Public License v3.0 (GPL-3.0). See LICENSE.

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

fastapi_silk-1.0.5.tar.gz (112.8 kB view details)

Uploaded Source

Built Distribution

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

fastapi_silk-1.0.5-py3-none-any.whl (18.7 kB view details)

Uploaded Python 3

File details

Details for the file fastapi_silk-1.0.5.tar.gz.

File metadata

  • Download URL: fastapi_silk-1.0.5.tar.gz
  • Upload date:
  • Size: 112.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for fastapi_silk-1.0.5.tar.gz
Algorithm Hash digest
SHA256 2405d500b7e8a9ef5d18639f179496bc11110b4618d50ce07b731a089bc98b57
MD5 fa7aa2108bb5871f37c9089068d7cc05
BLAKE2b-256 460ba9383d69e422a81b6ba954e395f04cbff7fefbb8bf540b9604b634529dd9

See more details on using hashes here.

Provenance

The following attestation bundles were made for fastapi_silk-1.0.5.tar.gz:

Publisher: publish.yml on Nikolaev3Artem/fastapi-silk

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file fastapi_silk-1.0.5-py3-none-any.whl.

File metadata

  • Download URL: fastapi_silk-1.0.5-py3-none-any.whl
  • Upload date:
  • Size: 18.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for fastapi_silk-1.0.5-py3-none-any.whl
Algorithm Hash digest
SHA256 a971ef333cab4e9a6b501bf2baa108c6a6173566ad05fab2ef86cba2ff4d5cc8
MD5 333a7dc67f9401214cfb6150a46517b2
BLAKE2b-256 c8f69d5139ee3a86e426b850d243e0f9fa4a9e45f5b51b84618e31f9d48a52f1

See more details on using hashes here.

Provenance

The following attestation bundles were made for fastapi_silk-1.0.5-py3-none-any.whl:

Publisher: publish.yml on Nikolaev3Artem/fastapi-silk

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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