feat: Hub monitoring takeover — event push system + config cleanup (v0.21.0)
Replace external Healthchecks.io with Hub-native event system. Controller now pushes structured events via POST /api/v1/event with typed detail structs. Hub handles dead man's switch, notification dispatch, and cooldowns. Phase 5: PushEvent() core method, 21 event types, expanded notification settings (11 toggles), Hub connection monitoring on dashboard, alerts. Phase 6: Deprecation log for ping UUIDs, pinger kept for transition. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -197,9 +197,15 @@ func main() {
|
||||
logger.Println("[INFO] Metrics collector started (60s interval)")
|
||||
}
|
||||
|
||||
// --- Initialize health pinger ---
|
||||
// --- Initialize health pinger (legacy, will be removed) ---
|
||||
pinger := monitor.NewPinger(&cfg.Monitoring, logger)
|
||||
|
||||
// Deprecation notice for ping UUIDs
|
||||
uuids := cfg.Monitoring.PingUUIDs
|
||||
if uuids.Heartbeat != "" || uuids.SystemHealth != "" || uuids.DBDump != "" || uuids.Backup != "" || uuids.BackupIntegrity != "" {
|
||||
logger.Println("[INFO] Healthchecks ping UUIDs configured but no longer used — monitoring is now handled by the Hub")
|
||||
}
|
||||
|
||||
// --- Initialize backup manager ---
|
||||
var backupMgr *backup.Manager
|
||||
stackProv := &stackAdapter{
|
||||
@@ -241,11 +247,7 @@ func main() {
|
||||
})
|
||||
// Check for post-update state (did a previous update succeed or fail?)
|
||||
if state := updater.VerifyStartup(); state != nil {
|
||||
if state.Status == "success" {
|
||||
notifier.NotifyUpdateSuccess(state.PreviousVersion, state.TargetVersion)
|
||||
} else if state.Status == "failed" {
|
||||
notifier.NotifyUpdateFailed(state.TargetVersion, state.Error)
|
||||
}
|
||||
notifier.NotifyControllerUpdated(state.PreviousVersion, state.TargetVersion, state.Status == "success")
|
||||
}
|
||||
logger.Printf("[INFO] Self-update enabled (check every %s, auto-update: %v, auto-update time: %s)",
|
||||
cfg.SelfUpdate.CheckInterval, cfg.SelfUpdate.AutoUpdate, cfg.SelfUpdate.AutoUpdateTime)
|
||||
@@ -302,6 +304,16 @@ func main() {
|
||||
var hubPusher *report.Pusher
|
||||
if cfg.Hub.URL != "" && cfg.Hub.APIKey != "" {
|
||||
hubPusher = report.NewPusher(&cfg.Hub, logger)
|
||||
// Wire hub push status into alert manager for dashboard alerts
|
||||
alertMgr.SetHubPushStatus(func() web.HubPushStatusData {
|
||||
s := hubPusher.GetStatus()
|
||||
return web.HubPushStatusData{
|
||||
LastAttempt: s.LastAttempt,
|
||||
LastSuccess: s.LastSuccess,
|
||||
LastError: s.LastError,
|
||||
Consecutive: s.Consecutive,
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// Backup daily jobs
|
||||
@@ -310,6 +322,8 @@ func main() {
|
||||
err := backupMgr.RunDBDumps(ctx)
|
||||
if err != nil {
|
||||
notifier.NotifyDBDumpFailed("Adatbázis mentés sikertelen", err.Error())
|
||||
} else {
|
||||
notifier.NotifyDBDumpCompleted(notify.DBDumpDetails{})
|
||||
}
|
||||
return err
|
||||
})
|
||||
@@ -317,6 +331,8 @@ func main() {
|
||||
err := backupMgr.RunBackup(ctx)
|
||||
if err != nil {
|
||||
notifier.NotifyBackupFailed("Biztonsági mentés sikertelen", err.Error())
|
||||
} else {
|
||||
notifier.NotifyBackupCompleted(notify.BackupDetails{})
|
||||
}
|
||||
// Phase 3: Chain cross-drive backups immediately after restic (regardless of restic success)
|
||||
// Daily jobs run every night; weekly jobs only on Sunday
|
||||
@@ -345,6 +361,8 @@ func main() {
|
||||
err := backupMgr.RunIntegrityCheck(ctx)
|
||||
if err != nil {
|
||||
notifier.NotifyIntegrityFailed("Mentés integritás ellenőrzés sikertelen", err.Error())
|
||||
} else {
|
||||
notifier.NotifyIntegrityOK("Mentés integritás ellenőrzés sikeres")
|
||||
}
|
||||
return err
|
||||
})
|
||||
@@ -454,6 +472,9 @@ func main() {
|
||||
go func() {
|
||||
time.Sleep(5 * time.Second) // Let all subsystems fully initialize
|
||||
|
||||
// Push controller startup event to Hub
|
||||
notifier.NotifyControllerStarted(Version)
|
||||
|
||||
// Heartbeat ping
|
||||
pinger.Ping(cfg.Monitoring.PingUUIDs.Heartbeat, "startup")
|
||||
logger.Println("[INFO] Startup heartbeat ping sent")
|
||||
@@ -533,7 +554,7 @@ func main() {
|
||||
go func() {
|
||||
prefs := sett.GetNotificationPrefs()
|
||||
if prefs.Email != "" {
|
||||
if err := notifier.SyncPreferences(prefs.Email, prefs.EnabledEvents); err != nil {
|
||||
if err := notifier.SyncPreferences(prefs.Email, prefs.EnabledEvents, prefs.CooldownHours); err != nil {
|
||||
logger.Printf("[WARN] Failed to sync notification preferences on startup: %v", err)
|
||||
}
|
||||
}
|
||||
@@ -547,11 +568,22 @@ func main() {
|
||||
}()
|
||||
|
||||
// --- Initialize API router ---
|
||||
apiRouter := api.NewRouter(cfg, *configPath, sett, stackMgr, syncer, cpuCollector, backupMgr, crossDriveRunner, metricsStore, updater, logger)
|
||||
apiRouter := api.NewRouter(cfg, *configPath, sett, stackMgr, syncer, cpuCollector, backupMgr, crossDriveRunner, metricsStore, updater, notifier, logger)
|
||||
|
||||
// --- Initialize web server ---
|
||||
webServer := web.NewServer(cfg, stackMgr, cpuCollector, backupMgr, crossDriveRunner, sched, sett, alertMgr, notifier, updater, logger, Version)
|
||||
webServer.SetStorageWatchdog(storageWatchdog)
|
||||
if hubPusher != nil {
|
||||
webServer.SetHubPushStatus(func() web.HubPushStatusData {
|
||||
s := hubPusher.GetStatus()
|
||||
return web.HubPushStatusData{
|
||||
LastAttempt: s.LastAttempt,
|
||||
LastSuccess: s.LastSuccess,
|
||||
LastError: s.LastError,
|
||||
Consecutive: s.Consecutive,
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// --- Initialize drive migrator ---
|
||||
driveMigrator := &storage.DriveMigrator{
|
||||
|
||||
Reference in New Issue
Block a user