Performance Monitoring

Performance monitoring strategies:

Frontend Performance Metrics

// Core Web Vitals monitoring
const observer = new PerformanceObserver((list) => {
  for (const entry of list.getEntries()) {
    if (entry.entryType === 'largest-contentful-paint') {
      console.log('LCP:', entry.startTime);
    }
    if (entry.entryType === 'first-input') {
      console.log('FID:', entry.processingStart - entry.startTime);
    }
  }
});

observer.observe({ entryTypes: ['largest-contentful-paint', 'first-input'] });

// Custom performance marks
performance.mark('api-call-start');
await fetchData();
performance.mark('api-call-end');
performance.measure('api-call-duration', 'api-call-start', 'api-call-end');

Backend Performance Monitoring

// Express middleware for request timing
const performanceMiddleware = (req, res, next) => {
  const start = Date.now();
  
  res.on('finish', () => {
    const duration = Date.now() - start;
    console.log(`${req.method} ${req.url} - ${duration}ms`);
    
    // Log slow requests
    if (duration > 1000) {
      console.warn(`Slow request: ${req.method} ${req.url} - ${duration}ms`);
    }
  });
  
  next();
};

Database Performance

-- Monitor slow queries
SELECT query, mean_time, calls, total_time
FROM pg_stat_statements
ORDER BY mean_time DESC
LIMIT 10;

-- Check index usage
SELECT schemaname, tablename, indexname, idx_scan, idx_tup_read
FROM pg_stat_user_indexes
ORDER BY idx_scan DESC;

Key Metrics to Track

  • Response time (p50, p95, p99)
  • Throughput (requests per second)
  • Error rate
  • CPU and memory usage
  • Database query performance
  • Cache hit rates

Alerting Thresholds

  • Response time > 2 seconds
  • Error rate > 1%
  • CPU usage > 80%
  • Memory usage > 85%
  • Database connections > 80% of pool