Database Monitoring
This guide covers database performance monitoring tools available to System Admins for ensuring optimal system performance.
Overview
System Admins have access to comprehensive database performance monitoring tools to ensure optimal system performance and identify potential issues before they impact users. The monitoring system provides real-time insights into query performance, N+1 patterns, and optimization opportunities.
Accessing Performance Metrics
Via Admin API
Use the dedicated performance endpoints:
- GET
/api/admin/database/performance
- Get current performance metrics - POST
/api/admin/database/performance/reset
- Reset metrics to start fresh monitoring
Both endpoints require System Admin authentication and return JSON responses.
Example Usage
Check current performance:
curl -H "Cookie: your-session-cookie" \
http://localhost:4000/api/admin/database/performance
Reset metrics after optimization:
curl -X POST \
-H "Cookie: your-session-cookie" \
http://localhost:4000/api/admin/database/performance/reset
Understanding Performance Metrics
Summary Metrics
- Total Queries: All database queries executed since last reset
- Slow Queries: Queries taking 100-500ms (yellow flag)
- Very Slow Queries: Queries taking >500ms (red flag)
- Average Execution Time: Overall query performance indicator
- N+1 Patterns: Detected inefficient query patterns
Performance Details
The system tracks:
- Slowest Query Patterns: Top 10 queries by execution time
- Most Frequent Queries: Top 10 queries by execution count
- N+1 Detection: Requests with suspiciously high query counts
Query Pattern Analysis
Each tracked query includes:
- Normalized Pattern: SQL with parameters replaced by placeholders
- Execution Count: How many times the query was run
- Average Duration: Mean execution time in milliseconds
- Total Duration: Cumulative execution time
- Last Executed: Timestamp of most recent execution
Performance Optimization Workflow
1. Establish Baseline
Before making changes:
# Reset metrics to start fresh
curl -X POST -H "Cookie: your-session" \
http://localhost:4000/api/admin/database/performance/reset
# Let system run under normal load for a period
# Then check performance
curl -H "Cookie: your-session" \
http://localhost:4000/api/admin/database/performance
2. Identify Issues
Look for:
- Slow Queries: High average execution times
- N+1 Patterns: High query counts per request
- Frequent Queries: Opportunities for caching
- Missing Indexes: Queries on non-indexed columns
3. Apply Optimizations
Common optimizations:
- Add Database Indexes: For frequently filtered columns
- Fix N+1 Queries: Use
include
orselect
in Prisma queries - Optimize Query Logic: Reduce unnecessary data fetching
- Implement Caching: For frequently accessed data
4. Measure Impact
After changes:
# Reset metrics to measure impact
curl -X POST -H "Cookie: your-session" \
http://localhost:4000/api/admin/database/performance/reset
# Monitor improved performance
curl -H "Cookie: your-session" \
http://localhost:4000/api/admin/database/performance
Monitoring Best Practices
Regular Monitoring Schedule
- Daily: Check for new slow queries during peak usage
- Weekly: Review N+1 patterns and frequent queries
- Monthly: Reset metrics and establish new baselines
- After Deployments: Monitor impact of code changes
Performance Thresholds
Acceptable Performance:
- Average execution time: <50ms
- Slow queries: <5% of total
- Very slow queries: <1% of total
- N+1 patterns: 0 detected
Warning Thresholds:
- Average execution time: 50-100ms
- Slow queries: 5-10% of total
- Very slow queries: 1-3% of total
- N+1 patterns: 1-2 detected
Critical Thresholds:
- Average execution time: >100ms
- Slow queries: >10% of total
- Very slow queries: >3% of total
- N+1 patterns: >2 detected
Automated Recommendations
The system provides automated optimization suggestions:
- Index Recommendations: For frequently filtered columns
- N+1 Detection: With specific query patterns to fix
- Caching Opportunities: For frequently executed queries
- Query Optimization: For slow-performing patterns
Database Index Management
Current Indexes
The system includes optimized indexes for:
- Event-scoped queries:
incidents.eventId
,userRoles.scopeId
- User-scoped queries:
incidents.reporterId
,incidents.assignedResponderId
- Status filtering:
incidents.state
,incidents.severity
- Time-based queries:
incidents.createdAt
,incidents.updatedAt
- Composite indexes: Multi-column queries for complex filtering
Adding New Indexes
When the performance monitor suggests new indexes:
- Identify the query pattern from performance metrics
- Analyze the WHERE clauses to determine index columns
- Add index to Prisma schema:
model Incident {
// ...existing fields...
@@index([eventId, state])
@@index([reporterId, createdAt])
} - Create migration:
docker-compose exec backend npx prisma migrate dev --name add-performance-indexes
- Monitor impact using performance metrics
Index Maintenance
Regular Tasks:
- Analyze index usage: Identify unused indexes
- Monitor index size: Track storage impact
- Update statistics: Refresh database statistics
- Reorganize indexes: Optimize index fragmentation
Troubleshooting Performance Issues
Common Issues and Solutions
High N+1 Query Count:
- Symptom: Many similar queries executed in sequence
- Cause: Missing
include
in Prisma queries - Solution: Add proper
include
statements to fetch related data
Slow Event-Scoped Queries:
- Symptom: Event dashboard loading slowly
- Cause: Missing indexes on event-related tables
- Solution: Add composite indexes for event + filter combinations
Memory Usage Spikes:
- Symptom: High memory consumption during queries
- Cause: Large result sets without pagination
- Solution: Implement proper pagination and query limits
Connection Pool Exhaustion:
- Symptom: "Too many connections" errors
- Cause: Long-running queries or connection leaks
- Solution: Optimize slow queries and check connection management
Performance Investigation Steps
-
Check Performance Metrics:
curl -H "Cookie: your-session" \
http://localhost:4000/api/admin/database/performance -
Identify Slow Queries:
- Look for queries with high average execution time
- Focus on frequently executed slow queries first
-
Analyze Query Patterns:
- Check for N+1 patterns in request traces
- Look for missing indexes in slow queries
- Identify opportunities for query optimization
-
Test Optimizations:
- Create test environment with similar data volume
- Apply proposed optimizations
- Measure performance improvements
Database Health Monitoring
Connection Monitoring
Connection Pool Status:
- Active Connections: Currently executing queries
- Idle Connections: Available for new queries
- Pool Utilization: Percentage of pool in use
Connection Metrics:
- Average Connection Time: Time to establish connections
- Connection Errors: Failed connection attempts
- Connection Timeouts: Queries exceeding time limits
Storage Monitoring
Database Size:
- Total Database Size: Overall storage usage
- Table Sizes: Storage per table
- Index Sizes: Storage used by indexes
- Growth Rate: Storage increase over time
Maintenance Alerts:
- Storage Threshold: Alert when storage exceeds limits
- Growth Projection: Predict storage needs
- Cleanup Opportunities: Identify data for archival
Performance Reporting
Regular Reports
Daily Performance Summary:
- Query count and average execution time
- Top 5 slowest queries
- N+1 pattern detection results
- Connection pool utilization
Weekly Performance Review:
- Performance trends over time
- Index usage analysis
- Storage growth patterns
- Optimization recommendations
Monthly Performance Analysis:
- Baseline performance comparison
- Capacity planning recommendations
- Performance optimization roadmap
- Database maintenance schedule
Custom Queries
For advanced analysis, System Admins can run custom performance queries:
-- Find tables with missing indexes
SELECT schemaname, tablename, attname
FROM pg_stats
WHERE n_distinct > 100 AND correlation < 0.1;
-- Analyze query performance by table
SELECT
schemaname,
tablename,
seq_scan,
seq_tup_read,
idx_scan,
idx_tup_fetch
FROM pg_stat_user_tables
ORDER BY seq_tup_read DESC;
Integration with Monitoring Tools
External Monitoring
Recommended Tools:
- Grafana: Visual dashboards for performance metrics
- Prometheus: Time-series database for metric collection
- DataDog: Comprehensive application and database monitoring
- New Relic: Application performance monitoring
Integration Points:
- Performance API: Export metrics to external systems
- Database Logs: Parse PostgreSQL logs for analysis
- Custom Metrics: Add application-specific performance indicators
Alerting
Performance Alerts:
- Slow Query Threshold: Alert when queries exceed time limits
- N+1 Detection: Notify when inefficient patterns are detected
- Connection Pool: Alert on high utilization or errors
- Storage Limits: Warn when approaching storage capacity
Next Steps
For comprehensive system administration:
- Security Monitoring: See Security Overview
- System Configuration: Review System Settings
- Event Management: Check Event Management
- Overall System Health: Monitor using System Configuration