mix selecto.add_timeouts (selecto_mix v0.4.2)

Adds a multi-layer query timeout defense system to protect your database from overload.

This task implements a comprehensive defense strategy including:

  • PostgreSQL statement_timeout configuration
  • Ecto connection pool timeout configuration
  • QueryTimeoutMonitor with circuit breaker pattern
  • Application supervision tree integration

Examples

# Add with default settings (30s timeout, 90% circuit breaker threshold)
mix selecto.add_timeouts

# Add with custom timeout
mix selecto.add_timeouts --timeout 60000

# Add with custom circuit breaker threshold
mix selecto.add_timeouts --circuit-threshold 0.8

# Preview changes without applying
mix selecto.add_timeouts --dry-run

Options

  • --timeout - Default query timeout in milliseconds (default: 30000)
  • --test-timeout - Test query timeout in milliseconds (default: 15000)
  • --circuit-threshold - Pool utilization threshold to open circuit (default: 0.9)
  • --check-interval - Health check interval in milliseconds (default: 5000)
  • --dry-run - Show what would be changed without applying
  • --force - Overwrite existing QueryTimeoutMonitor module
  • --skip-config - Skip config file modifications
  • --skip-monitor - Skip QueryTimeoutMonitor generation
  • --skip-supervision - Skip adding monitor to supervision tree

What Gets Modified

Configuration Files:

  • config/dev.exs - Adds database timeouts and PostgreSQL parameters
  • config/test.exs - Adds shorter timeouts for tests
  • config/runtime.exs - Adds production timeout configuration with env vars

Generated Files:

  • lib/APP_NAME/query_timeout_monitor.ex - Circuit breaker GenServer

Modified Files:

  • lib/APP_NAME/application.ex - Adds QueryTimeoutMonitor to supervision tree

Defense Layers

The system implements multiple defense layers:

  1. PostgreSQL Level: statement_timeout kills queries at database
  2. Ecto Level: Connection pool timeouts (query, connect, queue)
  3. Application Level: Generated QueryTimeoutMonitor for overload protection
  4. Circuit Breaker: Blocks queries when pool saturated
  5. Complexity Analysis: Pre-execution query validation (if enabled)

Usage After Installation

Check circuit breaker status:

YourApp.QueryTimeoutMonitor.allow_query?()
YourApp.QueryTimeoutMonitor.circuit_state()
YourApp.QueryTimeoutMonitor.stats()

Record query metrics:

YourApp.QueryTimeoutMonitor.record_timeout()
YourApp.QueryTimeoutMonitor.record_slow_query(duration_ms)
YourApp.QueryTimeoutMonitor.record_query(duration_ms)

Environment Variables (Production)

Set these in your production environment:

QUERY_TIMEOUT=30000          # Query execution timeout
STATEMENT_TIMEOUT=30000      # PostgreSQL statement timeout
POOL_SIZE=10                 # Connection pool size