mirror of
https://github.com/prosolis/gogobee.git
synced 2026-07-16 08:52:42 +00:00
roster: a quietly-succeeding ticker looks exactly like a dead one
The push logged nothing on success, so during the first deploy an empty board and a silent log were indistinguishable from a ticker that never started — and the debug went looking for a bug that wasn't there. (The snapshot was simply 2 minutes out; the first tick hadn't fired yet.) Logging every push at INFO would be noise forever. Log the transitions instead: the first time it works, the moment it breaks, and when it recovers.
This commit is contained in:
@@ -51,6 +51,14 @@ func (p *AdventurePlugin) peteRosterTicker() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// rosterPushOK tracks the last push's outcome so we can log the transitions and
|
||||||
|
// nothing else. A push every 2 minutes forever is far too noisy to log at INFO,
|
||||||
|
// but total silence is worse: a ticker that is succeeding quietly looks exactly
|
||||||
|
// like one that never started, and that ambiguity already cost an operator a
|
||||||
|
// wrong-turn debug during the first deploy. So: say something the first time it
|
||||||
|
// works, say something when it breaks, say something when it recovers.
|
||||||
|
var rosterPushOK bool
|
||||||
|
|
||||||
func (p *AdventurePlugin) pushRoster() {
|
func (p *AdventurePlugin) pushRoster() {
|
||||||
snap, err := buildRosterSnapshot(time.Now().UTC())
|
snap, err := buildRosterSnapshot(time.Now().UTC())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -59,11 +67,24 @@ func (p *AdventurePlugin) pushRoster() {
|
|||||||
}
|
}
|
||||||
ctx, cancel := context.WithTimeout(context.Background(), rosterPushTimeout)
|
ctx, cancel := context.WithTimeout(context.Background(), rosterPushTimeout)
|
||||||
defer cancel()
|
defer cancel()
|
||||||
|
|
||||||
if err := peteclient.PushRoster(ctx, snap); err != nil {
|
if err := peteclient.PushRoster(ctx, snap); err != nil {
|
||||||
// Not an error worth shouting about: the next tick retries by simply
|
// The failure itself is not alarming — the next tick retries by simply
|
||||||
// being a fresher snapshot, and if we stay down Pete's board correctly
|
// being a fresher snapshot, and if we stay down Pete's board correctly
|
||||||
// stops claiming to be live.
|
// stops claiming to be live. Only the *transition* is worth a line.
|
||||||
slog.Warn("roster: push failed, dropping snapshot", "err", err)
|
if rosterPushOK {
|
||||||
|
slog.Warn("roster: push failed, board will go stale on Pete", "err", err)
|
||||||
|
} else {
|
||||||
|
slog.Debug("roster: push failed, dropping snapshot", "err", err)
|
||||||
|
}
|
||||||
|
rosterPushOK = false
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if !rosterPushOK {
|
||||||
|
slog.Info("roster: board accepted by Pete — live adventurer board is publishing",
|
||||||
|
"adventurers", len(snap.Adventurers))
|
||||||
|
rosterPushOK = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user