Skip to main content

PerfWatch 🚀

Production-Ready Performance Monitoring for Python Web Applications

Python 3.8+ License: MIT Framework Support Maintained PyPI version

PerfWatch is a comprehensive performance monitoring and optimization tool that helps developers identify, analyze, and fix performance bottlenecks in production Python applications. Get real-time insights, actionable recommendations, and detailed profiling data—all through an intuitive web dashboard.

Author: Shahabaz Alam
Email: shahabazalam1@gmail.com
GitHub: @shahabazalam


🎯 Live Demo & Screenshots

📸 Screenshots coming soon! Star this repo to get notified when demo images are added.

Want to see PerfWatch in action? Check out the documentation for setup instructions and examples.


📋 Table of Contents


🎯 About PerfWatch

What Problem Does It Solve?

Modern web applications face critical performance challenges that are difficult to diagnose in production:

  • Hidden N+1 Queries: Database queries that silently multiply with each iteration, causing exponential slowdowns
  • Memory Leaks: Gradual memory consumption that crashes servers under load
  • Slow Endpoints: APIs that perform well in development but timeout in production
  • Query Optimization: Missing indexes and inefficient queries that degrade user experience
  • CPU Bottlenecks: Computational hotspots that consume server resources

The Challenge: Traditional monitoring tools either provide high-level metrics without actionable insights, or require extensive setup and infrastructure changes.

The Solution: PerfWatch integrates seamlessly into your existing application with minimal configuration, providing deep performance insights and AI-powered recommendations through an elegant web dashboard.

Who Will Benefit?

🧑‍💻 Backend Developers

  • Identify and fix performance issues before they reach production
  • Get specific, actionable recommendations (e.g., "Add index on user_id column")
  • Understand exactly which functions and queries are slow

👨‍💼 Engineering Managers

  • Monitor application health across all endpoints
  • Track performance trends over time
  • Make data-driven decisions about optimization priorities

🚀 DevOps Engineers

  • Diagnose production issues with detailed profiling data
  • Optimize server resource utilization
  • Reduce infrastructure costs by identifying inefficiencies

🏢 Startups & Small Teams

  • No need for expensive APM tools or dedicated monitoring infrastructure
  • Self-hosted solution with complete data ownership
  • Fast setup with immediate value

How It Helps Developers

1. Immediate Problem Detection

# PerfWatch automatically detects this N+1 query:
for post in Post.objects.all():
    print(post.author.name)  # ⚠️ N+1 detected!

# And suggests the fix:
# "Use select_related('author') to reduce 100 queries to 1"

2. Actionable Recommendations

  • "Add index on users.email - Query time: 234ms → 12ms"
  • "Cache this result for 5 minutes - Reduce load by 80%"
  • "Use bulk_create() instead of loop - 15x faster"

3. Visual Performance Insights

  • Interactive function call trees showing execution flow
  • Memory allocation tracking with precise leak detection
  • Query timeline with execution durations
  • CPU usage profiling per function

4. Zero-Overhead Profiling

  • < 3ms latency impact per request
  • Async data collection doesn't block responses
  • Configurable sampling (profile 10% of requests in production)

5. Production-Ready Dashboard

  • Real-time metrics with auto-refresh
  • Session-based authentication
  • Filter by severity, timeframe, and endpoints
  • Paginated results for large-scale applications

✨ Key Features

🔍 Intelligent Performance Analysis

Automatic Detection of 6+ Performance Issues:

  1. N+1 Query Detection - Identifies database query loops with fix suggestions
  2. Memory Leak Detection - Tracks excessive memory allocation patterns
  3. CPU Bottleneck Analysis - Pinpoints computational hotspots
  4. Query Optimization - Detects missing indexes, SELECT *, and inefficient patterns
  5. Slow Function Execution - Identifies time-consuming operations
  6. Duplicate Query Detection - Finds identical queries executed multiple times

🎨 Modern Web Dashboard

  • Real-Time Monitoring - 30-second auto-refresh with live metrics
  • Interactive Tree View - Visualize function call hierarchies
  • Performance Analysis - AI-powered recommendations for each issue
  • Advanced Filtering - By severity (Critical/Warning/Normal), timeframe, and endpoints
  • Responsive Design - Works seamlessly on desktop, tablet, and mobile
  • Secure Authentication - Session-based with 15-minute idle timeout

🔧 Multi-Framework Support

  • ✅ Django - Full ORM integration with automatic query tracking
  • ✅ Flask - SQLAlchemy support with query profiling
  • ✅ FastAPI - Async/await compatible with complete lifecycle tracking

📊 Comprehensive Metrics

  • Response time tracking (avg, min, max, p95, p99)
  • Database query analysis with execution times
  • Memory usage profiling (before/after, delta, peak)
  • CPU utilization monitoring (user time, system time)
  • Function-level execution timelines
  • Request/response payload inspection

🗄️ Flexible Database Support

  • SQLite - Zero-config default (perfect for development)
  • PostgreSQL - Production-grade with advanced features
  • MySQL - Enterprise compatibility

📦 Installation

pip install az-perfwatch

Requirements:

  • Python 3.8 or higher
  • One of: Django 3.2+, Flask 2.0+, or FastAPI 0.68+

Optional Dependencies:

# For PostgreSQL support
pip install psycopg2-binary

# For MySQL support
pip install mysql-connector-python

⚡ Quick Start

Step 1: Initialize PerfWatch

# Create configuration file
perfwatch create-default-config

# Initialize database
perfwatch migrate

# Create dashboard user
perfwatch create-user
# Username: admin
# Password: [your-secure-password]

Step 2: Integrate with Your Framework

Choose your framework and follow the integration guide:

Step 3: Access Dashboard

Start your application and navigate to:

  • Django: http://localhost:8000/perfwatch/dashboard/
  • Flask: http://localhost:5000/perfwatch/dashboard/
  • FastAPI: http://localhost:8000/perfwatch/dashboard/

Login with the credentials you created in Step 1.


🔌 Framework Integration

Django Setup

1. Install AZ-PerfWatch

pip install az-perfwatch

2. Add Middleware

# settings.py
MIDDLEWARE = [
    'perfwatch.adapters.django_adapter.PerfWatchDjangoMiddleware',
    # ... other middleware
]

3. Add Dashboard URLs

# urls.py
from django.urls import path, include

urlpatterns = [
    path('perfwatch/', include('perfwatch.dashboard.urls')),
    # ... your other URLs
]

4. Configure Database (Optional)

perfwatch create-default-config

Edit perfwatch.conf in your project root:

[db]
engine = "sqlite"  # or "postgresql" or "mysql"
path = "./perfwatch.db"

# For PostgreSQL:
# engine = "postgresql"
# host = "localhost"
# port = 5432
# name = "perfwatch"
# user = "admin"
# password = "your_password"

[profiling]
enabled = true

[thresholds]
function_ms = 100
query_ms = 50

5. Run Migrations

python manage.py migrate
perfwatch apply-config
perfwatch migrate
perfwatch create-user

6. Use @profile Decorator

from perfwatch import profile

@profile
def my_view(request):
    users = User.objects.all()
    return render(request, 'users.html', {'users': users})

class MyAPIView(APIView):
    @profile
    def get(self, request):
        # Your code here
        return Response(data)

7. Access Dashboard

http://localhost:8000/perfwatch/dashboard/

Flask Setup

1. Install Dependencies

pip install az-perfwatch flask sqlalchemy

2. Initialize PerfWatch

from flask import Flask
from perfwatch import integrate_flask_app

app = Flask(__name__)

# Initialize PerfWatch
integrate_flask_app(app)

3. Configure Settings (Optional)

perfwatch create-default-config
# edit config.py
PERFWATCH_DB_URL = 'sqlite:///./perfwatch.db'
# Or PostgreSQL: 'postgresql://user:pass@localhost/perfwatch'

perfwatch apply-config

4. Run Database Migration

perfwatch migrate
perfwatch create-user

5. Use @profile Decorator

from perfwatch import profile

@app.route('/users')
@profile
def get_users():
    users = User.query.all()
    return jsonify([u.to_dict() for u in users])

@profile
def expensive_operation():
    # Your code here
    pass

6. Run Your App

flask run
# Dashboard: http://localhost:5000/perfwatch/dashboard/

FastAPI Setup

1. Install Dependencies

pip install az-perfwatch fastapi uvicorn sqlalchemy

2. Complete Integration

from fastapi import FastAPI
from perfwatch import integrate_fastapi, profile

# Create FastAPI app
app = FastAPI(title="My API")

# Integrate PerfWatch (adds middleware + dashboard)
integrate_fastapi(app)

# Your routes
@app.get("/")
async def root():
    return {"message": "Hello World"}

@app.get("/users")
@profile
async def get_users():
    # Your code here
    users = await User.get_all()
    return users

# Profile async functions
@profile
async def fetch_data():
    # Your async code
    pass

3. Configure Database (Optional)

perfwatch create-default-config

Edit perfwatch.conf in project root:

[db]
engine = "sqlite"
path = "./perfwatch.db"

[profiling]
enabled = true

4. Initialize Database

perfwatch migrate
perfwatch create-user

5. Run Your App

uvicorn main:app --reload
# Dashboard: http://localhost:8000/perfwatch/dashboard/

Note: PerfWatch automatically mounts the dashboard at /perfwatch/ when using integrate_fastapi().


⚙️ Configuration

PerfWatch uses a TOML configuration file (perfwatch.conf) for all settings.

Configuration File Structure

# perfwatch.conf

# ========================================
# Database Configuration
# ========================================
[db]
engine = "sqlite"  # Options: sqlite, postgresql, mysql

# SQLite Configuration (when engine = "sqlite")
path = "./perfwatch.db"

# PostgreSQL Configuration (when engine = "postgresql")
# host = "localhost"
# port = 5432
# name = "perfwatch"
# user = "admin"
# password = "your_password"

# MySQL Configuration (when engine = "mysql")
# host = "localhost"
# port = 3306
# name = "perfwatch"
# user = "admin"
# password = "your_password"

# ========================================
# Performance Thresholds
# ========================================
[thresholds]
function_ms = 100  # Functions slower than 100ms = warning
query_ms = 50      # Queries slower than 50ms = warning

# ========================================
# Profiling Settings
# ========================================
[profiling]
enabled = true     # Enable/disable profiling globally

Database Configuration Examples

SQLite (Default - No Setup Required)

[db]
engine = "sqlite"
path = "./perfwatch.db"

PostgreSQL (Recommended for Production)

[db]
engine = "postgresql"
host = "localhost"
port = 5432
name = "perfwatch"
user = "perfwatch_user"
password = "secure_password_here"

MySQL

[db]
engine = "mysql"
host = "localhost"
port = 3306
name = "perfwatch"
user = "perfwatch_user"
password = "secure_password_here"

Applying Configuration Changes

After editing perfwatch.conf:

perfwatch apply-config

🖥️ CLI Commands

PerfWatch provides a comprehensive command-line interface for setup, management, and monitoring.

Configuration Management

Create default configuration file

perfwatch create-default-config

Creates perfwatch.conf with default settings (SQLite database, profiling enabled).

Show current configuration

perfwatch show-config

Displays all current configuration values.

Apply configuration changes

perfwatch apply-config

Applies changes after editing perfwatch.conf.


Database Management

Initialize database (create tables)

perfwatch migrate

Creates all required database tables. Must be run before first use.

Check setup status

perfwatch embed-status

Output:

✓ Profiler module available
✓ Config file found at perfwatch.conf
✓ DB file exists at /path/to/perfwatch.db
✓ Profiling is currently ACTIVE

User Management

Create new dashboard user (interactive)

perfwatch create-user

Prompts for username, email, full name, and password (hidden input).

Create user with specific username

perfwatch create-user --username admin

Prompts only for email, full name, and password.

List all users

perfwatch users-list

Output:

📊 Users in database (2):
  Username: admin
  Status:   ✓ Active
  Email:    admin@example.com
  Name:     System Administrator
  Created:  2025-11-04T10:30:00

  Username: developer
  Status:   ✓ Active
  Email:    dev@example.com
  Name:     John Doe
  Created:  2025-11-04T11:15:00

📊 Dashboard Features

Overview Section

Performance Summary Cards:

  • 🔴 Critical APIs - Endpoints with response time > 1000ms or > 10 queries
  • 🟡 Warning APIs - Endpoints with response time > 500ms or > 5 queries
  • 🟢 Normal APIs - Well-performing endpoints
  • 📊 Total Tracked - Complete coverage statistics

Real-Time Metrics:

  • Average response time across all endpoints
  • Peak response time in selected timeframe
  • Total database queries executed
  • Memory usage trends

Slowest APIs Table

Features:

  • Sortable Columns - Click headers to sort by response time, queries, etc.
  • Pagination - Choose 10/20/50/100 items per page
  • Search - Filter endpoints by name or pattern
  • Time Filters - Last 1h/6h/24h/7d or custom date range
  • Severity Badges - Visual indicators for critical/warning/normal status

Action Buttons:

  • 🧠 Memory - View memory allocation details
  • ℹ️ Details - Complete request/response inspection
  • 🌳 Tree - Interactive function call tree
  • 📈 Analysis - AI-powered performance recommendations

Memory Metrics Drawer

Displays:

  • Memory before/after/delta (in MB)
  • Peak memory usage during request
  • Object creation/destruction counts
  • Garbage collection statistics
  • CPU usage (user time, system time)
  • I/O operations (read/write bytes)

API Details Modal

Request Information:

  • HTTP method and endpoint
  • Request headers and body
  • Client IP and user agent
  • Timestamp and duration

Response Information:

  • Status code
  • Response headers and body
  • Content type and size

Execution Timeline:

  • Function call hierarchy
  • Individual function execution times
  • Database queries with SQL and parameters
  • Memory allocation per function

Performance Analysis

Automatic Issue Detection:

  1. N+1 Query Patterns
  2. Excessive Memory Allocation
  3. CPU-Intensive Operations
  4. Missing Database Indexes
  5. Inefficient Query Patterns
  6. Duplicate Queries

For Each Issue, PerfWatch Provides:

  • Clear description of the problem
  • Performance impact (time wasted, resources consumed)
  • Multiple actionable suggestions with code examples
  • Priority level (Critical/Warning/Info)

Example Analysis Output:

🔴 N+1 Query Detected in get_users()
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
⚠️ 50 queries in loop - wasting 1,234ms

Suggestions:
1. Use select_related('profile') to reduce queries
2. Add prefetch_related('groups') for many-to-many
3. Consider caching user data for 5 minutes

Code Example:
# Before (50 queries)
users = User.objects.all()
for user in users:
    print(user.profile.bio)  # ❌ N+1

# After (1 query)
users = User.objects.select_related('profile').all()
for user in users:
    print(user.profile.bio)  # ✅ Optimized

Interactive Tree View

Features:

  • Expandable/collapsible function nodes
  • Color-coded execution times (green/yellow/red)
  • Real-time statistics at each level
  • Query execution embedded in tree
  • Source code location links

Tree Statistics:

  • Total function calls
  • Total database queries
  • Cumulative execution time
  • Memory allocation per node

🎯 Use Cases

1. Identify N+1 Queries

Problem:

@profile
def get_blog_posts():
    posts = Post.objects.all()
    for post in posts:
        author = post.author  # ❌ N+1 query - one query per post!
        print(f"{post.title} by {author.name}")

PerfWatch Detection:

🔴 N+1 Query Detected
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
⚠️ 100 database queries in loop
⏱️ Wasted time: 2,340ms

Suggestion: Use select_related('author')
Impact: Reduce 100 queries → 1 query

Solution:

@profile
def get_blog_posts_optimized():
    # ✅ Single query with JOIN
    posts = Post.objects.select_related('author').all()
    for post in posts:
        print(f"{post.title} by {post.author.name}")

2. Monitor Memory Leaks

2. Monitor Memory Leaks

Problem:

@profile
def process_large_dataset():
    data = []
    for i in range(1000000):
        data.append(create_large_object())  # ❌ Memory keeps growing
    return data

PerfWatch Detection:

🔴 Excessive Memory Allocation
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
⚠️ Memory increased by 1,234 MB during request
⚠️ Peak memory: 1,500 MB

Suggestions:
1. Use generator/yield instead of loading all data
2. Process data in batches of 1000 items
3. Clear intermediate data structures

Solution:

@profile
def process_large_dataset_optimized():
    # ✅ Use generator - constant memory
    def generate_data():
        for i in range(1000000):
            yield create_large_object()
    
    return process_in_batches(generate_data())

3. Optimize Slow Queries

Problem:

@profile
def search_users(email_pattern):
    # ❌ No index on email column
    users = User.objects.filter(email__icontains=email_pattern)
    return users

PerfWatch Detection:

🔴 Missing Database Index
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
⚠️ Query time: 1,234ms
⚠️ Table scan on 50,000 rows

Suggestion: Add index on email column
Migration:
    CREATE INDEX idx_users_email ON users(email);
Expected improvement: 1,234ms → 15ms (98% faster)

4. Detect Duplicate Queries

Problem:

@profile
def dashboard_view():
    user_count = User.objects.count()  # Query 1
    # ... some code ...
    total_users = User.objects.count()  # Query 2 (duplicate!)
    # ... more code ...
    all_users = User.objects.count()   # Query 3 (duplicate!)

PerfWatch Detection:

🟡 Duplicate Queries Detected
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
⚠️ Same query executed 3 times
⚠️ Wasted time: 145ms

Suggestion: Cache the result
# Calculate once
user_count = User.objects.count()
# Reuse everywhere

📈 Performance Impact

PerfWatch is designed to have minimal overhead in production environments.

Overhead Benchmarks

Metric Impact Details
Response Time +2-3ms Per profiled request
Memory Usage +8-12 MB Per application instance
CPU Usage +0.5-0.8% During data collection
Database Load Minimal Async writes, batched inserts

Optimization Strategies

1. Sampling Mode (Recommended for High-Traffic Apps)

# perfwatch.conf
[profiling]
enabled = true
sample_rate = 0.1  # Profile only 10% of requests

2. Selective Profiling

# Only profile specific critical endpoints
@profile
def critical_payment_endpoint():
    pass

# Don't profile health checks, static files
def health_check():  # No @profile
    return {"status": "ok"}

3. Async Data Collection

  • All database writes happen asynchronously
  • Doesn't block request/response cycle
  • Batch inserts reduce DB load

Real-World Performance Tests

Test Environment:

  • Django REST API with PostgreSQL
  • 10,000 requests per minute
  • AWS EC2 t3.medium (2 vCPU, 4GB RAM)

Results with PerfWatch Enabled:

Average Response Time: 45ms → 48ms (+3ms / +6.7%)
Memory Usage: 180MB → 192MB (+12MB / +6.7%)
CPU Usage: 12% → 12.8% (+0.8%)
Error Rate: 0% (no change)

✅ Negligible impact with full monitoring

📚 Examples

Complete Example Applications

Check the examples/ directory for fully working applications:

1. FastAPI Example (example_fastapi_app.py)

from fastapi import FastAPI
from perfwatch import integrate_fastapi, profile

app = FastAPI()
integrate_fastapi(app)

@app.get("/users")
@profile
async def get_users():
    # Simulated N+1 query
    users = await User.get_all()
    for user in users:
        profile = await user.get_profile()
    return users

Run it:

python example_fastapi_app.py
# Visit: http://localhost:8000/perfwatch/dashboard/

2. Flask Example (example_flask_app.py)

from flask import Flask
from perfwatch import integrate_flask_app, profile

app = Flask(__name__)
integrate_flask_app(app)

@app.route('/posts')
@profile
def get_posts():
    posts = Post.query.all()
    # N+1 query automatically detected
    for post in posts:
        author = post.author.name
    return jsonify(posts)

Run it:

python example_flask_app.py
# Visit: http://localhost:5000/perfwatch/dashboard/

🤝 Contributing

We welcome contributions! Here's how you can help:

Development Setup

# Clone repository
git clone https://github.com/yourusername/perfwatch.git
cd perfwatch

# Create virtual environment
python -m venv env
source env/bin/activate  # On Windows: env\Scripts\activate

# Install dependencies
pip install -e ".[dev]"

Contribution Guidelines

  1. Fork the repository and create your feature branch

    git checkout -b feature/amazing-feature
    
  2. Make your changes with clear, commented code

  3. Add tests for new functionality

    pytest tests/test_your_feature.py
    
  4. Update documentation (README, docstrings, examples)

  5. Commit your changes

    git commit -m "Add amazing feature"
    
  6. Push to your fork

    git push origin feature/amazing-feature
    
  7. Open a Pull Request with description of changes

Areas for Contribution

  • 🐛 Bug fixes and issue reports
  • 📝 Documentation improvements
  • ✨ New framework adapters (Tornado, Sanic, etc.)
  • 🎨 UI/UX enhancements
  • 🧪 Additional test coverage
  • 🌍 Internationalization (i18n)

📄 License

MIT License

Copyright (c) 2025 PerfWatch Contributors

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.


🎯 Roadmap

Version 1.1 (Q1 2026)

  • Export performance reports (PDF/CSV)
  • Custom alert thresholds per endpoint
  • Comparison view (before/after optimization)
  • Dark/Light theme toggle

Version 1.2 (Q2 2026)

  • Slack/Email/Webhook alerting
  • Custom dashboard widgets
  • API for programmatic access
  • Historical trend analysis (30/60/90 days)

Version 2.0 (Q3 2026)

  • Distributed tracing support
  • Kubernetes integration
  • Grafana/Prometheus exporter
  • Multi-tenant support
  • Advanced ML-based anomaly detection

💬 Support & Community

Get Help

Stay Updated

  • ⭐ Star the repo to show support
  • 👁️ Watch for updates and releases
  • 🐦 Follow @perfwatch on Twitter (coming soon)

Resource Link
📦 Installation pip install az-perfwatch
📚 Documentation docs.perfwatch.io (coming soon)
🐛 Issues GitHub Issues
💬 Discussions GitHub Discussions
📝 Changelog CHANGELOG.md
🤝 Contributing CONTRIBUTING.md (coming soon)

🙏 Acknowledgments

PerfWatch is built with love using these amazing open-source projects:

  • Web Frameworks: Django, Flask, FastAPI
  • Database: SQLite, PostgreSQL, MySQL
  • UI: Tailwind CSS, Font Awesome
  • Utilities: Click, TOML, Passlib

Special thanks to all contributors and the Python community!


Made with ❤️ by the PerfWatch Team

Helping developers build faster, more efficient applications

⬆ Back to Top

Optimize Query Performance

PerfWatch automatically suggests:

  • Adding indexes for slow queries
  • Avoiding SELECT *
  • Optimizing LIKE patterns
  • Reducing JOIN complexity

📊 Dashboard Features

Overview Section

  • Critical APIs: Endpoints with severe performance issues
  • Warning APIs: Endpoints needing attention
  • Normal APIs: Well-performing endpoints
  • Total APIs Tracked: Complete coverage statistics

API Details Modal

  • Complete function execution timeline
  • Query details with execution times
  • Memory allocation tracking
  • CPU usage statistics

Performance Analysis

  • Automatic issue detection (6+ types)
  • Multiple actionable suggestions per issue
  • Priority-based recommendations
  • Code-level optimization hints

Pagination & Filtering

  • Adjustable page sizes (10, 20, 50, 100)
  • Smart page navigation with ellipsis
  • Severity-based filtering
  • Timeframe selection (1h, 6h, 24h, 7d)
  • Endpoint search functionality

🔧 Configuration

PerfWatch can be configured using environment variables or configuration files.

📈 Performance Impact

PerfWatch is designed to have minimal overhead in production:

  • Async database writes - Non-blocking performance data storage
  • Efficient memory tracking - Negligible memory overhead
  • Optimized query analysis - Smart query pattern detection
  • Negligible response time impact - < 5ms per request
  • Configurable sampling - Monitor subset of requests in high-traffic apps

Benchmark Results

Application Type Avg Overhead Memory Overhead CPU Overhead
Django REST API 3.2ms 12 MB 0.8%
Flask API 2.8ms 10 MB 0.6%
FastAPI 2.1ms 8 MB 0.5%

Based on 10,000 requests per second

🛠️ CLI Commands

PerfWatch provides a comprehensive CLI for setup, configuration, and monitoring.

Quick Setup Commands

# Complete workflow for first-time setup
perfwatch create-default-config  # Step 1: Create config
perfwatch migrate                # Step 2: Create database
perfwatch create-user            # Step 3: Create user
perfwatch embed-status           # Step 4: Verify setup

Configuration Commands

# Show current configuration
perfwatch show-config

# Create default configuration file (perfwatch.conf)
perfwatch create-default-config

# Apply configuration changes after editing perfwatch.conf
perfwatch apply-config

🤝 Contributing

We welcome contributions! Please check out our contributing guidelines.

📝 License

MIT License

Copyright (c) 2025 Shahabaz Alam

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.


  • PostgreSQL & MySQL support
  • Export reports to PDF/CSV
  • Slack/Email alerting
  • Custom metric tracking
  • Distributed tracing
  • Kubernetes integration
  • Grafana/Prometheus integration

💬 Support

Get Help

Connect


Made with ❤️ by Shahabaz Alam

Empowering developers to build faster, more efficient applications

Metadata

Release files for az-perfwatch 1.0.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for az-perfwatch 1.0.2
File Size Uploaded Provenance
az_perfwatch-1.0.2.tar.gz 104.4 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for az-perfwatch 1.0.2
File Interpreter ABI Platform
az_perfwatch-1.0.2-py3-none-any.whl Python 3 none any Details

Total release size: 198.8 kB

Release files / az_perfwatch-1.0.2.tar.gz

Download URL az_perfwatch-1.0.2.tar.gz
Size 104.4 kB
Tags Source
SHA-256 checksum
How to use checksums
9ac522fec992d5abc4de56ff72472999eef345a941545c4c91417ff854f7ca90
BLAKE2b-256 checksum
How to use checksums
fc307c7b6942d918c159fc06d513ca8ccbb145b5565a4b410a2e91ac16ba336d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.5

Release files / az_perfwatch-1.0.2-py3-none-any.whl

Download URL az_perfwatch-1.0.2-py3-none-any.whl
Size 94.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
85c13c54f47e27daaeeab14f1245ee9c3e135805ae66b46b7992a5d4d5a642e9
BLAKE2b-256 checksum
How to use checksums
4cecc8c5aa444cffab7974aec511cff60b409bbfd7744e61b618e37e3c7b31a6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.5

Security for az-perfwatch 1.0.2

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page