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-runOptions
--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 parametersconfig/test.exs- Adds shorter timeouts for testsconfig/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:
- PostgreSQL Level:
statement_timeoutkills queries at database - Ecto Level: Connection pool timeouts (query, connect, queue)
- Application Level: Generated
QueryTimeoutMonitorfor overload protection - Circuit Breaker: Blocks queries when pool saturated
- 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