Skip to main content

Real-time API monitoring for Flask/FastAPI with async, zero-blocking logging

Project description

api-watch-dog

Real-time API monitoring for Flask/FastAPI with zero-blocking async logging

PyPI version Python 3.7+ License: MIT

A lightweight, developer-focused tool that streams your API requests, responses, and metadata to a beautiful real-time dashboard. Perfect for debugging, development, and understanding your API traffic.

api-watch-dog Dashboard


Features

  • Zero Performance Impact - Fire-and-forget async logging that never blocks your API
  • Real-time Streaming - WebSocket-powered dashboard shows requests as they happen
  • Auto-Start Dashboard - Just import and use, dashboard starts automatically
  • Full Visibility - Method, path, status, timing, headers, request/response data
  • Filter by Status - Quickly filter requests by status code
  • Request Statistics - Visual metrics and charts
  • Minimal UI - Clean, fast dashboard focused on what matters
  • Multi-Framework - Works with Flask and FastAPI
  • Production Ready - Standalone mode for Docker/Kubernetes
  • Optimized Dependencies - Only install what you need

Quick Start

Installation

For Flask:

pip install api-watch-dog[flask]

For FastAPI:

pip install api-watch-dog[fastapi]

For both:

pip install api-watch-dog[all]

Flask Integration (Auto-Start)

from flask import Flask
from apiwatchdog import ApiWatcher
from apiwatchdog.middleware_flask import FlaskWatchdogMiddleware

app = Flask(__name__)

# Dashboard auto-starts
api_watcher = ApiWatcher(service_name='my-flask-app')
FlaskWatchdogMiddleware(app, api_watcher)

@app.route('/api/users')
def get_users():
    return {"users": [...]}

if __name__ == '__main__':
    app.run(port=5000)

Run it:

python app.py

Open dashboard:

http://localhost:22222

FastAPI Integration

from fastapi import FastAPI
from apiwatchdog import ApiWatcher
from apiwatchdog.middleware_fastapi import FastAPIWatchdogMiddleware

app = FastAPI()

# Dashboard auto-starts
api_watcher = ApiWatcher(service_name='my-fastapi-app')
app.add_middleware(FastAPIWatchdogMiddleware, watcher=api_watcher)

@app.get("/api/users")
async def get_users():
    return {"users": [...]}

Run it:

uvicorn app:app --port 8000

📊 Dashboard Features

Real-time Request Monitoring

  • ✅ Live streaming of API requests
  • ✅ Color-coded HTTP methods (GET, POST, PUT, DELETE)
  • ✅ Status code highlighting (success/error)
  • ✅ Response time tracking
  • ✅ Service name badges (multi-service support)

Filters & Search

  • Filter by status code (2xx, 3xx, 4xx, 5xx, All)
  • Sort by newest, oldest, fastest, sloweset, status(high-low)
  • Filter by HTTP method

Request Details

  • Full request/response bodies
  • Query parameters
  • Headers (sensitive headers filtered)
  • Timestamp and duration

Use Cases

Development & Debugging

# See exactly what's hitting your API in real-time
# No more print() debugging!

API Testing

# Watch your integration tests run
# Verify request/response data instantly

Microservices Monitoring

# Monitor traffic between multiple services
# Debug complex request flows

Configuration

Basic Options

api_watcher = ApiWatcher(
    service_name='my-app',           # Service identifier
    max_history=1000,                # Requests to keep in memory
    dashboard_host='localhost',      # Dashboard host
    dashboard_port=22222,            # Dashboard port
    auto_start_dashboard=True        # Auto-start if not running
)

Middleware Options

Flask:

FlaskWatchdogMiddleware(
    app, 
    api_watcher,
    capture_request_body=True,   # Log request bodies
    capture_response_body=True   # Log response bodies
)

FastAPI:

app.add_middleware(
    FastAPIWatchdogMiddleware,
    watcher=api_watcher,
    capture_request_body=True,   # Log request bodies
    capture_response_body=True   # Log response bodies
)

Production Deployment

Standalone Mode

For production, run the dashboard as a separate service:

Terminal 1: Start Dashboard

python -m apiwatchdog

Terminal 2: Start Your App

from apiwatchdog import ApiWatcher

api_watcher = ApiWatcher(
    service_name='my-app',
    auto_start_dashboard=False  # Don't auto-start in production
)

Docker Compose

services:
  apiwatchdog:
    image: theisaac/api-watch-dog:latest
    container_name: apiwatchdog
    ports:
      - "22222:22222"
    restart: unless-stopped
    environment:
      - PYTHONUNBUFFERED=1
      - WATCHDOG_USERNAME=admin
      - WATCHDOG_PASSWORD=admin
    command: python -m apiwatchdog

Service code:

import os
from apiwatchdog import ApiWatcher

api_watcher = ApiWatcher(
    service_name=os.getenv('SERVICE_NAME', 'api-service'),
    dashboard_host=os.getenv('WATCHDOG_HOST', 'localhost'),
    dashboard_port=int(os.getenv('WATCHDOG_PORT', 22222)),
    auto_start_dashboard=False
)

How It Works

Flask/FastAPI Request
        ↓
   Middleware intercepts
        ↓
   Queue.put_nowait() (non-blocking, <0.1ms)
        ↓
   App continues normally
        ↓
Background Async Worker
        ↓
HTTP POST to Dashboard
        ↓
Dashboard broadcasts via WebSocket
        ↓
Browser UI updates in real-time

Zero blocking! Your API never waits for logging.


Requirements

  • Python 3.7+
  • aiohttp 3.8+ (always required)
  • Flask 2.0+ (optional - only for Flask integration)
  • FastAPI 0.68+ & Starlette 0.14+ (optional - only for FastAPI integration)

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

api_watch-0.1.0.tar.gz (96.1 kB view details)

Uploaded Source

Built Distribution

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

api_watch-0.1.0-py3-none-any.whl (19.5 kB view details)

Uploaded Python 3

File details

Details for the file api_watch-0.1.0.tar.gz.

File metadata

  • Download URL: api_watch-0.1.0.tar.gz
  • Upload date:
  • Size: 96.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.0

File hashes

Hashes for api_watch-0.1.0.tar.gz
Algorithm Hash digest
SHA256 96d8bfc47a3263aa2d1fd7211e6e022949cdd0f83ee225458eeefd3dd8a12406
MD5 cf5c4199c01bdc69ab92406ab01f4fc1
BLAKE2b-256 00b3a9e1c5c29ca42ff8ed7935b65a3bd69028f3f5e8e02e3b843c6aeaabf85f

See more details on using hashes here.

File details

Details for the file api_watch-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: api_watch-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 19.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.0

File hashes

Hashes for api_watch-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 dfdd4545eb981155016945c8c9fbe13606ea9a418e6e986345ca36bb48865770
MD5 90f69062956d4ea50633345e66131df7
BLAKE2b-256 16207e32ff046991b52aa0fe27bcd52d8aebad95233a5599342c9aca6474c205

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