feat: add observability endpoints and request logging (P3 Group C)
Implemented P3 issues #24, #35, and #22:
**#24: Metrics/Observability**
- Created web/metrics.go with Metrics struct using atomic counters
- Added /metrics endpoint returning JSON snapshot of system and app metrics
- Added /health endpoint for simple health checks with uptime
- Tracked: uptime, Go version, goroutines, memory (alloc/total/sys)
- Tracked: requests (total/active), emails sent, feeds fetched, items seen
- Tracked: active configs, errors total, rate limit hits
**#35: HTTP Request Logging**
- Added loggingMiddleware in web/server.go
- Logs: method, path, status code, duration (ms), remote_addr
- Uses loggingResponseWriter wrapper to capture HTTP status codes
- Tracks active requests via metrics (increment/decrement)
- Increments error counter for 5xx responses
- Middleware chain: logging → rate limiting → handlers
**#22: Standardize Logging Levels**
- Changed 23 log calls from Error → Warn in web/handlers.go
- Error reserved for critical failures (panics, failed migrations)
- Warn used for expected/recoverable failures (DB reads, template errors)
- Changed: 14 DB operations, 6 template renders, 2 response encodings, 1 delete token
💘 Generated with Crush
Assisted-by: Copilot: Claude Sonnet 4.5 via Crush <crush@charm.land>