package observability import ( "edge-infra.dev/pkg/lib/fog" ) type logger interface { Info(msg string, keysAndValues ...interface{}) } // StateLogger stores the state of the cluster when it was last logged type StateLogger struct { firstLog bool lastState bool log logger } // NewStateLogger creates a new StateLogger with the given log level func NewStateLogger(level int) StateLogger { return StateLogger{ firstLog: true, log: fog.New(fog.WithLevel(level)).WithName("etcd-manager-state-logger").WithValues("routine", "logger"), } } // HasStateChanged returns true if the state has changed since the last time it was logged func (sl *StateLogger) HasStateChanged(state bool) bool { return state != sl.lastState } // Log the current state of the cluster func (sl *StateLogger) Log(state bool) { var msg string switch state { case true: msg = "cluster is healthy" case false: msg = "cluster is unhealthy" } sl.log.Info(msg, "healthy", state) sl.lastState = state } // LogIfStateChanged logs the current state of the cluster if it has changed since // the last time it was logged func (sl *StateLogger) LogIfStateChanged(state bool) { if sl.HasStateChanged(state) || sl.firstLog { sl.Log(state) } sl.firstLog = false }