12 KiB
SQL Query Monitoring and Loop Detection System
Overview
This comprehensive SQL monitoring system has been implemented to identify and resolve the SQL script loop issue that was causing DDOS-like behavior on your server. The system provides detailed logging, performance monitoring, and automatic loop detection to help identify the root cause of problematic database operations.
Features
🔍 Comprehensive SQL Query Logging
- Detailed Query Tracking: Every SQL query is logged with timing, parameters, and execution context
- Performance Metrics: Automatic tracking of query execution times, row counts, and resource usage
- Connection State Monitoring: Tracks database connection open/close operations with timing
- Error Logging: Comprehensive error logging with stack traces and context information
🚨 Automatic Loop Detection
- Pattern Recognition: Identifies repeated query patterns that may indicate infinite loops
- Frequency Analysis: Monitors query execution frequency and detects abnormally high rates
- Performance Thresholds: Automatically flags slow queries and high-frequency operations
- Real-time Alerts: Immediate notification when potential loops are detected
📊 Performance Monitoring
- Query Execution Statistics: Tracks execution counts, average times, and performance trends
- Resource Usage Monitoring: Monitors memory, CPU, and I/O usage during database operations
- Connection Pool Monitoring: Tracks database connection pool health and usage
- Transaction Monitoring: Monitors transaction duration and rollback rates
🎯 Smart Alerting System
- Configurable Thresholds: Customizable thresholds for slow queries, high frequency, and error rates
- Multi-level Alerts: Different alert levels (Info, Warning, Error, Critical) based on severity
- Contextual Information: Alerts include repository name, method name, and query patterns
- Automatic Escalation: Critical issues are automatically escalated with detailed diagnostics
Components
1. SqlQueryLogger
Location: src/Managing.Infrastructure.Database/PostgreSql/SqlQueryLogger.cs
Provides comprehensive logging for individual database operations:
- Operation start/completion logging
- Query execution timing and parameters
- Connection state changes
- Error handling and exception logging
- Performance issue detection
2. SqlLoopDetectionService
Location: src/Managing.Infrastructure.Database/PostgreSql/SqlLoopDetectionService.cs
Advanced loop detection and performance monitoring:
- Real-time query pattern analysis
- Execution frequency tracking
- Performance threshold monitoring
- Automatic cleanup of old tracking data
- Configurable detection rules
3. BaseRepositoryWithLogging
Location: src/Managing.Infrastructure.Database/PostgreSql/BaseRepositoryWithLogging.cs
Base class for repositories with integrated monitoring:
- Automatic query execution tracking
- Performance monitoring for all database operations
- Error handling and logging
- Loop detection integration
4. Enhanced ManagingDbContext
Location: src/Managing.Infrastructure.Database/PostgreSql/ManagingDbContext.cs
Extended DbContext with monitoring capabilities:
- Query execution tracking
- Performance metrics collection
- Loop detection integration
- Statistics and health monitoring
5. SqlMonitoringController
Location: src/Managing.Api/Controllers/SqlMonitoringController.cs
REST API endpoints for monitoring and management:
- Real-time query statistics
- Alert management
- Performance metrics
- Health monitoring
- Configuration management
API Endpoints
Get Query Statistics
GET /api/SqlMonitoring/statistics
Returns comprehensive query execution statistics including:
- Loop detection statistics
- Context execution counts
- Active query patterns
- Performance metrics
Get Alerts
GET /api/SqlMonitoring/alerts
Returns current alerts and potential issues:
- High frequency queries
- Slow query patterns
- Performance issues
- Loop detection alerts
Clear Tracking Data
POST /api/SqlMonitoring/clear-tracking
Clears all tracking data and resets monitoring counters.
Get Query Details
GET /api/SqlMonitoring/query-details/{repositoryName}/{methodName}
Returns detailed information about specific query patterns.
Get Monitoring Health
GET /api/SqlMonitoring/health
Returns overall monitoring system health status.
Configuration
SqlMonitoringSettings
Location: src/Managing.Infrastructure.Database/PostgreSql/SqlMonitoringSettings.cs
Comprehensive configuration options:
- TrackingWindow: Time window for query tracking (default: 5 minutes)
- MaxExecutionsPerWindow: Maximum executions per window (default: 10)
- SlowQueryThresholdMs: Slow query threshold (default: 1000ms)
- HighFrequencyThreshold: High frequency threshold (default: 20 executions/minute)
- EnableDetailedLogging: Enable detailed SQL logging (default: true)
- EnableLoopDetection: Enable loop detection (default: true)
- EnablePerformanceMonitoring: Enable performance monitoring (default: true)
Usage Examples
1. Using Enhanced Repository
public class MyRepository : BaseRepositoryWithLogging, IMyRepository
{
public MyRepository(ManagingDbContext context, ILogger<MyRepository> logger, SqlLoopDetectionService loopDetectionService)
: base(context, logger, loopDetectionService)
{
}
public async Task<User> GetUserAsync(string name)
{
return await ExecuteWithLoggingAsync(async () =>
{
// Your database operation here
return await _context.Users.FirstOrDefaultAsync(u => u.Name == name);
}, nameof(GetUserAsync), ("name", name));
}
}
2. Manual Query Tracking
// Track a specific query execution
_context.TrackQueryExecution("GetUserByName", TimeSpan.FromMilliseconds(150), "UserRepository", "GetUserAsync");
3. Monitoring API Usage
# Get current statistics
curl -X GET "https://your-api/api/SqlMonitoring/statistics"
# Get alerts
curl -X GET "https://your-api/api/SqlMonitoring/alerts"
# Clear tracking data
curl -X POST "https://your-api/api/SqlMonitoring/clear-tracking"
Logging Output Examples
Query Execution Log
[SQL-OP-START] a1b2c3d4 | PostgreSqlUserRepository.GetUserByNameAsync | Started at 14:30:15.123
[SQL-CONNECTION] a1b2c3d4 | PostgreSqlUserRepository.GetUserByNameAsync | Connection OPENED (took 5ms)
[SQL-QUERY] a1b2c3d4 | PostgreSqlUserRepository.GetUserByNameAsync | Executed in 25ms | Rows: 1
[SQL-CONNECTION] a1b2c3d4 | PostgreSqlUserRepository.GetUserByNameAsync | Connection CLOSED (took 2ms)
[SQL-OP-COMPLETE] a1b2c3d4 | PostgreSqlUserRepository.GetUserByNameAsync | Completed in 32ms | Queries: 1 | Result: User
Loop Detection Alert
[SQL-LOOP-DETECTED] e5f6g7h8 | PostgreSqlTradingRepository.GetPositionsAsync | Pattern 'GetPositionsAsync()' executed 15 times | Possible infinite loop!
[SQL-LOOP-ALERT] Potential infinite loop detected in PostgreSqlTradingRepository.GetPositionsAsync with pattern 'GetPositionsAsync()'
Performance Warning
[SQL-PERFORMANCE] PostgreSqlTradingRepository | GetPositionsAsync took 2500ms (threshold: 1000ms)
[SQL-QUERY-DETAILS] i9j0k1l2 | Query: SELECT * FROM Positions WHERE Status = @status | Parameters: {"status":"Active"}
Troubleshooting
Common Issues and Solutions
1. High Query Frequency
Symptoms: Multiple queries executing rapidly
Detection: [SQL-LOOP-DETECTED] logs with high execution counts
Solution:
- Check for recursive method calls
- Verify loop conditions in business logic
- Review async/await patterns
2. Slow Query Performance
Symptoms: Queries taking longer than expected
Detection: [SQL-PERFORMANCE] warnings
Solution:
- Review query execution plans
- Check database indexes
- Optimize query parameters
3. Connection Issues
Symptoms: Connection timeouts or pool exhaustion
Detection: [SQL-CONNECTION] error logs
Solution:
- Review connection management
- Check connection pool settings
- Verify proper connection disposal
4. Memory Issues
Symptoms: High memory usage during database operations Detection: Memory monitoring alerts Solution:
- Review query result set sizes
- Implement pagination
- Check for memory leaks in entity tracking
Integration Steps
1. Update Existing Repositories
Replace existing repository implementations with the enhanced base class:
// Before
public class MyRepository : IMyRepository
{
private readonly ManagingDbContext _context;
// ...
}
// After
public class MyRepository : BaseRepositoryWithLogging, IMyRepository
{
public MyRepository(ManagingDbContext context, ILogger<MyRepository> logger, SqlLoopDetectionService loopDetectionService)
: base(context, logger, loopDetectionService)
{
}
// ...
}
2. Update Dependency Injection
The services are automatically registered in Program.cs:
SqlLoopDetectionServiceas Singleton- Enhanced
ManagingDbContextwith monitoring - All repositories with logging capabilities
3. Configure Monitoring Settings
Add configuration to appsettings.json:
{
"SqlMonitoring": {
"TrackingWindow": "00:05:00",
"MaxExecutionsPerWindow": 10,
"SlowQueryThresholdMs": 1000,
"HighFrequencyThreshold": 20,
"EnableDetailedLogging": true,
"EnableLoopDetection": true,
"EnablePerformanceMonitoring": true
}
}
Monitoring Dashboard
Key Metrics to Monitor
- Query Execution Count: Track total queries per minute
- Average Execution Time: Monitor query performance trends
- Error Rate: Track database error frequency
- Connection Pool Usage: Monitor connection health
- Loop Detection Alerts: Immediate notification of potential issues
Alert Thresholds
- Critical: >50 queries/minute, >5 second execution time
- Warning: >20 queries/minute, >1 second execution time
- Info: Normal operation metrics
Best Practices
1. Repository Design
- Always inherit from
BaseRepositoryWithLogging - Use
ExecuteWithLoggingAsyncfor all database operations - Include meaningful parameter names in logging calls
- Handle exceptions properly with logging
2. Performance Optimization
- Monitor slow queries regularly
- Implement proper indexing strategies
- Use pagination for large result sets
- Avoid N+1 query problems
3. Error Handling
- Log all database errors with context
- Implement proper retry mechanisms
- Use circuit breaker patterns for external dependencies
- Monitor error rates and trends
4. Security Considerations
- Avoid logging sensitive data in query parameters
- Use parameterized queries to prevent SQL injection
- Implement proper access controls for monitoring endpoints
- Regular security audits of database operations
Conclusion
This comprehensive SQL monitoring system provides the tools needed to identify and resolve the SQL script loop issue. The system offers:
- Real-time monitoring of all database operations
- Automatic loop detection with configurable thresholds
- Performance tracking with detailed metrics
- Comprehensive logging for debugging and analysis
- REST API endpoints for monitoring and management
- Configurable settings for different environments
The system is designed to be non-intrusive while providing maximum visibility into database operations, helping you quickly identify and resolve performance issues and potential infinite loops.