Skip to content

Examples & integrations

HTTPX (sync)

  • Snippet: docs/snippets/httpx_sync_retry.py
  • Shows per-class strategies (tighter backoff for 429s) and metric hook logging.
  • Run: uv pip install httpx then uv run python docs/snippets/httpx_sync_retry.py.

requests (sync)

  • Snippet: docs/snippets/requests_retry.py
  • Uses http_classifier with requests and emits metrics.
  • Run: uv pip install requests then uv run python docs/snippets/requests_retry.py.

HTTPX (async)

  • Snippet: docs/snippets/httpx_async_retry.py
  • Same shape as sync, with AsyncRetryPolicy and httpx.AsyncClient.
  • Run: uv pip install httpx then uv run python docs/snippets/httpx_async_retry.py.

Async worker loop

  • Snippet: docs/snippets/async_worker_retry.py
  • Simulates a message worker with retries and metrics per message.
  • Run: uv run python docs/snippets/async_worker_retry.py.

Async Postgres (asyncpg)

  • Snippet: docs/snippets/asyncpg_retry.py
  • Uses sqlstate_classifier to map SQLSTATE codes and retries with asyncpg.
  • Run: uv pip install asyncpg and set ASYNC_PG_DSN, then uv run python docs/snippets/asyncpg_retry.py.

PyODBC + SQLSTATE classifier

  • Snippet: docs/snippets/pyodbc_classifier.py provides a SQLSTATE→ErrorClass mapper (also available as sqlstate_classifier in redress.extras).
  • Snippet: docs/snippets/pyodbc_retry.py shows batched row fetch under retry.
  • Run: uv pip install pyodbc and set PYODBC_CONN_STR, then uv run python docs/snippets/pyodbc_retry.py.

FastAPI proxy with retries

  • Snippet: docs/snippets/fastapi_downstream.py
  • Wraps a downstream call with retries and exposes /metrics counters.
  • Run: uv pip install "fastapi[standard]" httpx then uv run uvicorn docs.snippets.fastapi_downstream:app --reload.
  • Shape:
from fastapi import FastAPI, HTTPException
from redress import RetryPolicy, default_classifier
from redress.strategies import decorrelated_jitter

app = FastAPI()
policy = RetryPolicy(classifier=default_classifier, strategy=decorrelated_jitter(max_s=2.0))

@app.get("/proxy")
def proxy():
    def _call():
        resp = httpx.get("https://httpbin.org/status/500", timeout=3.0)
        resp.raise_for_status()
        return resp.text
    try:
        return {"body": policy.call(_call, operation="proxy_downstream")}
    except Exception as exc:
        raise HTTPException(status_code=502, detail=str(exc))

FastAPI middleware with per-endpoint policies

  • Snippet: docs/snippets/fastapi_middleware.py
  • Middleware applies a retry policy to requests; includes a proxy endpoint.
  • Run: uv pip install "fastapi[standard]" httpx then uv run uvicorn docs.snippets.fastapi_middleware:app --reload.
  • Shape:
from fastapi import FastAPI, Request, Response
from redress import RetryPolicy
from redress.extras import http_classifier
from redress.strategies import decorrelated_jitter

app = FastAPI()

def make_policy(op: str) -> RetryPolicy:
    return RetryPolicy(
        classifier=http_classifier,
        strategy=decorrelated_jitter(max_s=2.0),
        max_attempts=4,
        deadline_s=8.0,
    )

@app.middleware("http")
async def retry_middleware(request: Request, call_next) -> Response:
    policy = make_policy(request.url.path)
    return await policy.call(lambda: call_next(request), operation=request.url.path)

Benchmarks (pyperf)

  • Snippet: docs/snippets/bench_retry.py
  • Measures bare sync retry overhead with pyperf runners.
  • Run: uv pip install .[dev] then uv run python docs/snippets/bench_retry.py.