ai-templates
Version:
CLI tool for generating AI templates for different frameworks and tools
444 lines (361 loc) • 10.8 kB
Markdown
# Production Debugging Guide - Frontend (React)
This command helps you debug issues in production environments safely and effectively.
## Step 1: Initial Assessment
### Check Service Health
```bash
# Basic health check
curl -s https://api.example.com/health | jq .
# Detailed health with dependencies
curl -s https://api.example.com/health/detailed | jq .
# Check specific endpoints
for endpoint in users orders payments; do
echo "Checking /api/$endpoint:"
curl -s -o /dev/null -w "%{http_code} - %{time_total}s\n" https://api.example.com/api/$endpoint
done
```
### Quick Diagnostics
```bash
# Get current metrics
curl -s https://api.example.com/metrics | grep -E "(up|http_requests_total|error_rate)"
# Check recent deployments
kubectl rollout history deployment/backend-api -n production
# View running pods
kubectl get pods -n production -l app=backend
```
## Step 2: Log Analysis
### Centralized Logging
```bash
# Tail production logs (Kubernetes)
kubectl logs -f deployment/backend-api -n production --tail=100
# Get logs from all pods
kubectl logs -n production -l app=backend --tail=50
# Search for errors in last hour
kubectl logs deployment/backend-api -n production --since=1h | grep -i error
# Export logs for analysis
kubectl logs deployment/backend-api -n production --since=24h > production-logs-$(date +%Y%m%d).log
```
### Log Aggregation Queries
```javascript
// ElasticSearch/Kibana queries
{
"query": {
"bool": {
"must": [
{ "match": { "level": "error" } },
{ "range": { "@timestamp": { "gte": "now-1h" } } }
]
}
},
"aggs": {
"error_types": {
"terms": { "field": "error.type" }
}
}
}
// CloudWatch Insights
fields @timestamp, level, message, error.stack
| filter level = "error"
| stats count() by error.type
| sort count desc
```
### Common Log Patterns
```bash
# Database connection errors
grep -i "connection refused\|timeout\|ECONNREFUSED" logs.txt
# Memory issues
grep -i "heap\|memory\|OOM" logs.txt
# Rate limiting
grep -i "rate limit\|429\|too many requests" logs.txt
# Authentication failures
grep -i "unauthorized\|401\|invalid token" logs.txt
```
## Step 3: Performance Debugging
### Real-time Monitoring
```bash
# CPU and Memory usage (Kubernetes)
kubectl top pods -n production
kubectl top nodes
# Watch resource usage
watch -n 2 'kubectl top pods -n production | grep backend'
# Database connections
kubectl exec -it backend-api-xxx -n production -- \
psql $DATABASE_URL -c "SELECT count(*) FROM pg_stat_activity;"
```
### APM Integration
```typescript
// Add debug endpoints (protect these!)
app.get('/debug/health/detailed', {
preHandler: app.authenticate,
handler: async (request, reply) => {
const health = {
uptime: process.uptime(),
memory: process.memoryUsage(),
cpu: process.cpuUsage(),
connections: {
database: await checkDatabaseHealth(),
redis: await checkRedisHealth(),
external: await checkExternalServices()
}
};
return health;
}
});
```
### Performance Profiling in Production
```bash
# Enable profiling temporarily
kubectl set env deployment/backend-api NODE_OPTIONS="--inspect=0.0.0.0:9229" -n production
# Port forward for debugging
kubectl port-forward deployment/backend-api 9229:9229 -n production
# Connect Chrome DevTools to chrome://inspect
# Disable after debugging
kubectl set env deployment/backend-api NODE_OPTIONS- -n production
```
## Step 4: Database Debugging
### Query Performance
```sql
-- Find slow queries (PostgreSQL)
SELECT
query,
mean_exec_time,
calls,
total_exec_time
FROM pg_stat_statements
WHERE mean_exec_time > 100
ORDER BY mean_exec_time DESC
LIMIT 10;
-- Check current connections
SELECT
pid,
usename,
application_name,
client_addr,
state,
query_start,
state_change,
query
FROM pg_stat_activity
WHERE state != 'idle'
ORDER BY query_start;
-- Kill long-running queries
SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE state != 'idle'
AND query_start < now() - interval '10 minutes';
```
### Connection Pool Issues
```bash
# Check connection pool stats
kubectl exec -it backend-api-xxx -n production -- node -e "
const db = require('./dist/db');
console.log({
total: db.client.pool.max,
used: db.client.pool.numUsed(),
free: db.client.pool.numFree(),
waiting: db.client.pool.numPendingAcquires()
});
"
```
## Step 5: Memory Debugging
### Memory Leak Detection
```bash
# Take heap snapshot
kubectl exec -it backend-api-xxx -n production -- \
kill -USR2 $(pgrep -f "node.*server.js")
# Download heap dump
kubectl cp production/backend-api-xxx:/app/heapdump-*.heapsnapshot ./
# Analyze with Chrome DevTools or clinic.js
```
### Memory Usage Analysis
```javascript
// Add memory monitoring endpoint
app.get('/debug/memory', {
preHandler: [app.authenticate, app.requireRole('admin')],
handler: async (request, reply) => {
const usage = process.memoryUsage();
return {
rss: `${Math.round(usage.rss / 1024 / 1024)} MB`,
heapTotal: `${Math.round(usage.heapTotal / 1024 / 1024)} MB`,
heapUsed: `${Math.round(usage.heapUsed / 1024 / 1024)} MB`,
external: `${Math.round(usage.external / 1024 / 1024)} MB`,
arrayBuffers: `${Math.round(usage.arrayBuffers / 1024 / 1024)} MB`
};
}
});
```
## Step 6: Request Tracing
### Distributed Tracing
```typescript
// Implement request tracing
app.addHook('onRequest', async (request, reply) => {
request.traceId = request.headers['x-trace-id'] || generateTraceId();
reply.header('x-trace-id', request.traceId);
// Log with trace ID
request.log = request.log.child({ traceId: request.traceId });
});
// Trace specific request
curl -H "X-Trace-ID: debug-$(date +%s)" https://api.example.com/api/problematic-endpoint
```
### Debug Specific User
```bash
# Enable debug logging for specific user
kubectl exec -it backend-api-xxx -n production -- node -e "
const redis = require('./dist/redis');
redis.set('debug:user:123', '1', 'EX', 3600);
"
# In application code
if (await redis.get(`debug:user:${userId}`)) {
request.log.level = 'debug';
}
```
## Step 7: Live Debugging Techniques
### Remote Debugging (Use with Caution!)
```bash
# SSH tunnel to production pod
kubectl exec -it backend-api-xxx -n production -- /bin/sh
# Inside pod - check processes
ps aux | grep node
netstat -tulpn
df -h
free -m
# Check environment
env | grep -E "(DATABASE|REDIS|API)" | sed 's/=.*/=***/'
```
### Feature Flag Debugging
```typescript
// Toggle features for debugging
app.post('/debug/feature-flags', {
preHandler: [app.authenticate, app.requireRole('admin')],
handler: async (request, reply) => {
const { feature, enabled, duration = 3600 } = request.body;
await redis.setex(`feature:${feature}`, duration, enabled ? '1' : '0');
return { feature, enabled, duration };
}
});
```
## Step 8: Error Investigation
### Error Tracking
```javascript
// Sentry error investigation
const Sentry = require('@sentry/node');
// Add breadcrumbs for context
Sentry.addBreadcrumb({
category: 'debug',
message: 'Investigating production issue',
level: 'info',
data: { endpoint: request.url }
});
// Capture additional context
Sentry.configureScope((scope) => {
scope.setTag('debug_session', true);
scope.setContext('system', {
memory: process.memoryUsage(),
uptime: process.uptime()
});
});
```
### Common Production Issues
#### 1. Memory Leaks
```javascript
// Detect potential leaks
const heapUsed = [];
setInterval(() => {
const usage = process.memoryUsage().heapUsed / 1024 / 1024;
heapUsed.push(usage);
if (heapUsed.length > 60) {
heapUsed.shift();
// Check if memory is consistently increasing
const trend = heapUsed.slice(-10).reduce((a, b, i) => a + (b - heapUsed[heapUsed.length - 11 + i]), 0);
if (trend > 50) { // 50MB increase over 10 minutes
logger.warn('Potential memory leak detected', { trend, current: usage });
}
}
}, 10000);
```
#### 2. Connection Pool Exhaustion
```javascript
// Monitor and alert
setInterval(async () => {
const poolStats = {
used: db.client.pool.numUsed(),
free: db.client.pool.numFree(),
waiting: db.client.pool.numPendingAcquires()
};
if (poolStats.waiting > 5) {
logger.error('Database connection pool exhausted', poolStats);
// Consider increasing pool size or investigating slow queries
}
}, 5000);
```
## Step 9: Incident Response
### Create Incident Report
```bash
# Gather system state
mkdir -p incidents/$(date +%Y%m%d-%H%M%S)
cd incidents/$(date +%Y%m%d-%H%M%S)
# Collect diagnostics
kubectl describe pods -n production > pods.txt
kubectl top pods -n production > resources.txt
kubectl logs deployment/backend-api -n production --since=1h > logs.txt
curl -s https://api.example.com/metrics > metrics.txt
# Database state
kubectl exec -it backend-api-xxx -n production -- \
psql $DATABASE_URL -c "\l+" > databases.txt
```
### Emergency Procedures
```bash
# Scale up if needed
kubectl scale deployment/backend-api --replicas=5 -n production
# Restart pods (rolling)
kubectl rollout restart deployment/backend-api -n production
# Emergency maintenance mode
kubectl set env deployment/backend-api MAINTENANCE_MODE=true -n production
```
## Step 10: Post-Incident Analysis
### Generate Debug Report
```markdown
# Production Debug Report
## Incident Summary
- **Time**: $(date)
- **Duration**: X minutes
- **Impact**: X% of users affected
- **Root Cause**: [Identified cause]
## Timeline
- HH:MM - Issue detected
- HH:MM - Investigation started
- HH:MM - Root cause identified
- HH:MM - Fix deployed
- HH:MM - Service restored
## Findings
1. What went wrong
2. Why it went wrong
3. How it was fixed
## Action Items
- [ ] Implement monitoring for X
- [ ] Add alerting for Y
- [ ] Document procedure Z
## Logs and Evidence
- See attached files
```
## Debug Commands Cheatsheet
```bash
# Quick health check
curl -s https://api.example.com/health | jq .
# Get error count
kubectl logs deployment/backend-api -n production --since=1h | grep -c ERROR
# Check database connections
kubectl exec -it backend-api-xxx -n production -- \
psql $DATABASE_URL -c "SELECT count(*) FROM pg_stat_activity;"
# Memory usage
kubectl top pods -n production | grep backend
# Recent errors with context
kubectl logs deployment/backend-api -n production --since=10m | grep -B2 -A2 ERROR
# Request rate
curl -s https://api.example.com/metrics | grep http_requests_total
# Restart pod
kubectl delete pod backend-api-xxx -n production
# Enable debug logging (temporary)
kubectl set env deployment/backend-api LOG_LEVEL=debug -n production
# Disable debug logging
kubectl set env deployment/backend-api LOG_LEVEL=info -n production
```