...
1 package observability
2
3 import (
4 "edge-infra.dev/pkg/lib/fog"
5 )
6
7 type logger interface {
8 Info(msg string, keysAndValues ...interface{})
9 }
10
11
12 type StateLogger struct {
13 firstLog bool
14 lastState bool
15 log logger
16 }
17
18
19 func NewStateLogger(level int) StateLogger {
20 return StateLogger{
21 firstLog: true,
22 log: fog.New(fog.WithLevel(level)).WithName("etcd-manager-state-logger").WithValues("routine", "logger"),
23 }
24 }
25
26
27 func (sl *StateLogger) HasStateChanged(state bool) bool {
28 return state != sl.lastState
29 }
30
31
32 func (sl *StateLogger) Log(state bool) {
33 var msg string
34
35 switch state {
36 case true:
37 msg = "cluster is healthy"
38 case false:
39 msg = "cluster is unhealthy"
40 }
41
42 sl.log.Info(msg, "healthy", state)
43
44 sl.lastState = state
45 }
46
47
48
49 func (sl *StateLogger) LogIfStateChanged(state bool) {
50 if sl.HasStateChanged(state) || sl.firstLog {
51 sl.Log(state)
52 }
53 sl.firstLog = false
54 }
55
View as plain text