Pulse/internal/api
rcourtman dcd5f52684 feat: improve alert system performance, UX, and edge case handling
Implement 5 medium/low priority improvements identified in systematic review:

UX IMPROVEMENTS:
- Notify existing critical alerts when activating from pending_review state
  Previously: critical alerts during observation window would never notify
  Now: users receive notifications for active critical alerts after activation
  Implementation: Added NotifyExistingAlert() method and logic in ActivateAlerts()

PERFORMANCE OPTIMIZATIONS:
- Replace per-alert cleanup goroutines with periodic batch cleanup
  Prevents spawning 1000s of goroutines during alert flapping
  recentlyResolved entries now cleaned up once per minute instead of 1 goroutine per alert
- Simplify GetActiveAlerts() implementation
  Removed intermediate map copy, holds lock slightly longer but operation is fast
  Cleaner code with reduced memory allocation

CONFIGURATION VALIDATION:
- Validate timezone in quiet hours configuration
  Invalid timezones now disable quiet hours with error log instead of silent fallback
  Prevents unexpected behavior when timezone is typo'd or invalid

GRACEFUL SHUTDOWN:
- Add 100ms delay in Stop() for background goroutine cleanup
  Reduces risk of state corruption during shutdown
  Allows escalation checker and periodic save to exit cleanly

Technical details:
- internal/alerts/alerts.go: Added NotifyExistingAlert(), optimized cleanup patterns
- internal/api/alerts.go: Enhanced ActivateAlerts() to notify existing critical alerts
- Removed ~20 lines of goroutine spawning code
- Added periodic cleanup for recentlyResolved map
- All changes preserve backward compatibility

Testing: Verified compilation with 'go build -o /dev/null ./...'
2025-10-21 11:05:45 +00:00
..
alerts.go feat: improve alert system performance, UX, and edge case handling 2025-10-21 11:05:45 +00:00
alerts_test.go Allow printable alert IDs for acknowledgements (#550) 2025-10-14 16:48:22 +00:00
auth.go feat: enhance sensor proxy with improved cluster discovery and SSH management 2025-10-17 11:43:26 +00:00
config_handlers.go fix: correct fmt.Sprintf argument alignment in PVE setup script 2025-10-20 21:58:37 +00:00
csrf_store.go chore: tidy repo formatting and linting 2025-09-29 20:19:18 +00:00
demo_middleware.go fix CI errors: remove unused imports and format Go code 2025-09-30 19:59:55 +00:00
diagnostics.go feat: enhance sensor proxy with improved cluster discovery and SSH management 2025-10-17 11:43:26 +00:00
DO_NOT_EDIT_FRONTEND_HERE.md enhance: improve mock data realism and alert system 2025-09-02 21:11:01 +00:00
docker_agents.go feat: add docker agent command handling 2025-10-15 19:27:19 +00:00
frontend_embed.go feat: add OIDC single sign-on 2025-09-29 10:22:27 +00:00
guest_metadata.go chore: tidy repo formatting and linting 2025-09-29 20:19:18 +00:00
middleware.go chore: tidy repo formatting and linting 2025-09-29 20:19:18 +00:00
notifications.go Add Apprise notification integration (#570) 2025-10-18 16:39:39 +00:00
oidc_handlers.go feat: add OIDC logout URL support and improve UX 2025-10-01 10:59:22 +00:00
oidc_service.go improve: add comprehensive debug logging for OIDC troubleshooting 2025-09-30 18:45:30 +00:00
rate_limit_config.go Fix X-RateLimit-Limit header value 2025-10-19 11:43:03 +02:00
rate_limit_config_test.go test: add X-RateLimit-Limit header regression test 2025-10-20 15:10:59 +00:00
ratelimit.go chore: tidy repo formatting and linting 2025-09-29 20:19:18 +00:00
README.md enhance: improve mock data realism and alert system 2025-09-02 21:11:01 +00:00
recovery_tokens.go chore: tidy repo formatting and linting 2025-09-29 20:19:18 +00:00
router.go fix: skip update check for source builds and show appropriate UI message 2025-10-21 10:08:00 +00:00
router_integration_test.go security: complete Phase 1 sensor proxy hardening 2025-10-20 15:13:37 +00:00
security.go fix: resolve OIDC authentication issues with DISABLE_AUTH and improve UX 2025-10-01 10:53:19 +00:00
security_oidc.go feat: add professional logging with runtime configuration and performance optimization 2025-10-20 15:13:38 +00:00
security_setup_fix.go feat: enhance runtime configuration and system settings management 2025-10-20 17:41:19 +00:00
security_tokens.go feat: add docker agent command handling 2025-10-15 19:27:19 +00:00
session_store.go chore: tidy repo formatting and linting 2025-09-29 20:19:18 +00:00
settings.go chore: tidy repo formatting and linting 2025-09-29 20:19:18 +00:00
system_settings.go feat: improve discovery with progress tracking, validation, and structured errors 2025-10-20 22:29:30 +00:00
types.go fix: skip update check for source builds and show appropriate UI message 2025-10-21 10:08:00 +00:00
updates.go fix: resolve Docker container permission and path errors in v4.22.0-rc.4 2025-10-10 18:17:38 +00:00

Internal API Package

This directory contains the API server implementation for Pulse.

Important Note About frontend-modern/

The frontend-modern/ subdirectory that appears here is:

  • AUTO-GENERATED during builds
  • NOT the source code - just a build artifact
  • IN .gitignore - never committed
  • REQUIRED BY GO - The embed directive needs it here

Frontend Development Location

👉 Edit frontend files at: /opt/pulse/frontend-modern/src/

Why This Structure?

Go's //go:embed directive has limitations:

  1. Cannot use ../ paths to access parent directories
  2. Cannot follow symbolic links
  3. Must embed files within the Go module

This is a known Go limitation and our structure works around it.