Skip to main content

TPS Agent

Python 3.8+ License: MIT PyPI version

A comprehensive Python library for measuring, throttling, and managing TPS (Transactions Per Second) in distributed applications. TPS Agent provides flexible strategies for collecting metrics and supports database-driven throttling with Grafana dashboard integration.

✨ Features

Core Functionality

  • 🎯 Simple Decorators: @measure_tps, @throttle, @hierarchical_throttle, @db_throttle
  • ⚡ Async Support: Works with both sync and async functions
  • 🔄 Multiple Strategies: Collector, PostgreSQL, Prometheus, Hybrid strategies
  • 📊 Real-time Monitoring: Live metrics collection and visualization
  • 🛡️ Intelligent Throttling: Gateway + Endpoint level controls with wait capability

Advanced Features

  • 🗄️ Database-driven Limits: Dynamic TPS limits stored in PostgreSQL
  • 📈 Grafana Integration: Pre-built dashboards with TPS recommendations
  • ⏱️ Wait-on-Limit: Smart waiting up to 30 minutes instead of immediate failures
  • 🎛️ Hierarchical Controls: Gateway → Endpoint throttling cascade
  • 📋 TPS Recommendations: AI-powered optimal TPS suggestions based on historical data
  • 🔧 Zero Configuration: Works out of the box with sensible defaults

📦 Installation

pip install tps-agent

Optional Dependencies

# For PostgreSQL strategy
pip install tps-agent[postgresql]

# For Prometheus integration  
pip install tps-agent[prometheus]

# For all features
pip install tps-agent[all]

🚀 Quick Start

1. Basic Usage with Collector Strategy

from tps_agent import configure_agent, measure_tps, throttle

# Configure once at application startup
configure_agent(
    collector_url="http://tps-collector:8080",
    server_id="web-server-1"
)

@measure_tps(gateway="payment_api")
def process_payment(amount):
    # Your payment processing logic
    return {"status": "success", "amount": amount}

@throttle(gateway="external_api", max_tps=100)
@measure_tps(gateway="external_api")
def call_external_service():
    # This will be throttled to max 100 TPS
    # and metrics will be collected
    return requests.get("https://api.example.com/data")

2. PostgreSQL Strategy with Database-Driven Throttling

from tps_agent import configure_strategy_agent, PostgreSQLStrategy, db_throttle

# Configure PostgreSQL strategy
strategy = PostgreSQLStrategy(
    server_id="web-server-1",
    # Database connection via environment variables
    # TPS_DB_HOST, TPS_DB_PASSWORD, etc.
)
configure_strategy_agent(strategy)

# Database-driven throttling - limits stored in PostgreSQL
@db_throttle(
    gateway="critical-service",
    endpoint="process_payment",
    wait_on_limit=True,        # Wait up to 30 minutes when throttled
    max_wait_seconds=1800
)
def process_critical_payment(amount):
    # TPS limits automatically retrieved from database
    # Defaults to 1000 TPS, configurable via database
    return {"status": "processed", "amount": amount}

3. Hierarchical Throttling

from tps_agent import hierarchical_throttle

@hierarchical_throttle(
    gateway="firmbank-gateway",
    endpoint="withdrawal_transfer",
    gateway_max_tps=200,       # Gateway-level limit
    endpoint_max_tps=50,       # Endpoint-level limit  
    wait_on_limit=True,        # Wait when limits exceeded
    max_wait_seconds=300       # Max 5 minutes wait
)
def withdrawal_transfer(amount, account):
    # Both gateway AND endpoint limits must be satisfied
    return {"status": "transferred", "amount": amount}

🏗️ Architecture

Strategy Pattern

TPS Agent uses a flexible strategy pattern to support different backend systems:

  • CollectorStrategy: Send metrics to centralized TPS Collector server
  • PostgreSQLStrategy: Store metrics directly in PostgreSQL database
  • PrometheusStrategy: Export metrics to Prometheus
  • HybridStrategy: Combine multiple strategies

Database Schema (PostgreSQL)

-- Automatic TPS limits management
CREATE TABLE tps_limits (
    gateway VARCHAR(255) NOT NULL,
    endpoint VARCHAR(255),              -- NULL for gateway-level limits
    max_tps INTEGER DEFAULT 1000,
    enabled BOOLEAN DEFAULT true,
    UNIQUE (gateway, endpoint)
);

-- Metrics storage
CREATE TABLE tps_metrics (
    gateway VARCHAR(255) NOT NULL,
    endpoint VARCHAR(255) NOT NULL,
    timestamp TIMESTAMPTZ NOT NULL,
    duration_ms FLOAT NOT NULL,
    success BOOLEAN NOT NULL
);

📊 Grafana Dashboard

TPS Recommendations Dashboard

The PostgreSQL strategy includes pre-built Grafana dashboards with:

  • Gateway Statistics: Success rates, request counts, performance metrics
  • Endpoint Statistics: Individual endpoint performance analysis
  • TPS Recommendations: AI-powered optimal TPS suggestions
    • Ultra Conservative TPS (85% of baseline) 🟢
    • Recommended Optimal TPS (95% of baseline) 🟡
    • Recommended Max TPS (99% of baseline) 🔴
  • Real-time Monitoring: Live TPS, response times, error rates

Dashboard Import

{
  "dashboard": "grafana/dashboards/tps-external-db.json",
  "datasource": "PostgreSQL TPS Database"
}

🔧 Configuration

Environment Variables (PostgreSQL Strategy)

# Database Connection
TPS_DB_HOST=localhost
TPS_DB_PORT=5432
TPS_DB_NAME=tps_monitoring
TPS_DB_USER=tps_user
TPS_DB_PASSWORD=your_password

# Agent Settings
TPS_SERVER_ID=web-server-1
TPS_BATCH_SIZE=100
TPS_FLUSH_INTERVAL=30
TPS_MAX_QUEUE_SIZE=10000

Programmatic Configuration

from tps_agent import PostgreSQLStrategy, configure_strategy_agent

strategy = PostgreSQLStrategy(
    server_id="my-service",
    database_url="postgresql://user:pass@localhost/tps_monitoring",
    batch_size=50,
    flush_interval=15,
    max_queue_size=5000
)

# Auto-creates database tables and indexes
configure_strategy_agent(strategy)

💡 Usage Examples

Dynamic TPS Limit Management

# Get current TPS limits
limits = strategy.get_tps_limits(gateway="payment-api")
print(f"Current limits: {limits}")

# Update TPS limits
strategy.update_tps_limit("payment-api", None, 500, True)           # Gateway limit
strategy.update_tps_limit("payment-api", "process_payment", 100, True)  # Endpoint limit

# Get active limits for throttling
active = strategy.get_active_tps_limits()
print(f"Gateway limits: {active['gateway_limits']}")
print(f"Endpoint limits: {active['endpoint_limits']}")

Error Handling

from tps_agent import ThrottleException

@db_throttle(gateway="external-api", wait_on_limit=False)
def call_external_api():
    try:
        return requests.get("https://api.example.com/data")
    except ThrottleException as e:
        logger.warning(f"API throttled: {e}")
        return {"error": "rate_limited", "retry_after": 60}

🧪 Testing

# Run tests
pytest

# With coverage
pytest --cov=tps_agent

# Integration tests (requires PostgreSQL)
pytest tests/integration/

📈 Performance

  • Low Overhead: < 1ms per decorated function call
  • Efficient Batching: Configurable batch sizes for optimal performance
  • Connection Pooling: PostgreSQL strategy uses connection pools
  • Async Support: Non-blocking operation with async/await
  • Memory Efficient: Automatic cleanup of old metrics

🤝 Contributing

We welcome contributions! Please see our Contributing Guide for details.

📄 License

This project is licensed under the MIT License - see the LICENSE file for details.

🆘 Support

🗺️ Roadmap

  • Redis Strategy: Redis-based metrics storage and throttling
  • Slack Integration: Real-time alerts and TPS limit adjustments
  • REST API: HTTP API for managing TPS limits
  • Machine Learning: Advanced TPS prediction based on traffic patterns
  • Multi-tenant: Support for multiple applications in single instance

Made with ❤️ for high-performance distributed systems

Metadata

Release files for tps-agent 2.2.1

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

Source distribution (sdist)

Source distribution for tps-agent 2.2.1
File Size Uploaded
tps_agent-2.2.1.tar.gz 37.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for tps-agent 2.2.1
File Interpreter ABI Platform
tps_agent-2.2.1-py3-none-any.whl Python 3 none any Details

Total release size: 74.4 kB

Release files / tps_agent-2.2.1.tar.gz

Download URL tps_agent-2.2.1.tar.gz
Size 37.2 kB
Tags Source
SHA-256 checksum
How to use checksums
4c08d85cf7a663829d30728bb1a39cf63bbd6ef637d271c6364294968cf3f90c
BLAKE2b-256 checksum
How to use checksums
601822b64cfaac2fd743554dbd6667fba65e43a0dc846de6810cf1b41e5a049d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.7

Release files / tps_agent-2.2.1-py3-none-any.whl

Download URL tps_agent-2.2.1-py3-none-any.whl
Size 37.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
df174c905ed2437f3fa3136225a0b8183f777daca38a9379421af94f9bed7207
BLAKE2b-256 checksum
How to use checksums
b64aa5d2b472c3063a92d5284fa9b3de47c805c9991be06a21d6681c72f4a9c2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.13.7

Release history Release notifications | RSS feed

This release

2.2.1 This release

2 release files

2.2.0

2 release files

2.1.1

2 release files

2.1.0

2 release files

2.0.0

2 release files

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