Skip to content

Commit 127d4de

Browse files
committed
refactor app status reporter
1 parent 1a9266c commit 127d4de

4 files changed

Lines changed: 120 additions & 60 deletions

File tree

appstatus/appstatus.go

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
package appstatus
2+
3+
import (
4+
"errors"
5+
"sync"
6+
)
7+
8+
var errAlreadyRegistered = errors.New("service already registered")
9+
10+
type StatusReporter interface {
11+
GetServiceReporter(serviceName string) (ServiceStatusReporter, error)
12+
IsReady() bool
13+
IsAlive() bool
14+
}
15+
16+
type ServiceStatusReporter interface {
17+
Ready() // service is up
18+
NotReady() // temporary outage; expecting recovery
19+
Dead() // service is down
20+
}
21+
22+
type statusReporter struct {
23+
sync.RWMutex
24+
alive bool
25+
ready map[string]bool
26+
}
27+
28+
type serviceReporter struct {
29+
statusReporter *statusReporter
30+
serviceName string
31+
}
32+
33+
// ---------------------------------------------------------------
34+
35+
func New() StatusReporter {
36+
return &statusReporter{
37+
ready: make(map[string]bool),
38+
alive: true,
39+
}
40+
}
41+
42+
func (s *statusReporter) GetServiceReporter(serviceName string) (ServiceStatusReporter, error) {
43+
s.Lock()
44+
defer s.Unlock()
45+
if _, found := s.ready[serviceName]; found {
46+
return nil, errAlreadyRegistered
47+
}
48+
s.ready[serviceName] = false
49+
return &serviceReporter{
50+
statusReporter: s,
51+
serviceName: serviceName,
52+
}, nil
53+
}
54+
55+
func (s *statusReporter) Ready(name string) {
56+
s.Lock()
57+
defer s.Unlock()
58+
s.ready[name] = true
59+
}
60+
61+
func (s *statusReporter) NotReady(name string) {
62+
s.Lock()
63+
defer s.Unlock()
64+
s.ready[name] = false
65+
}
66+
67+
func (s *statusReporter) Dead() {
68+
s.Lock()
69+
defer s.Unlock()
70+
s.alive = false
71+
}
72+
73+
func (s *statusReporter) IsReady() bool {
74+
s.RLock()
75+
defer s.RUnlock()
76+
for _, ready := range s.ready {
77+
if !ready {
78+
return false
79+
}
80+
}
81+
return true
82+
}
83+
84+
func (s *statusReporter) IsAlive() bool {
85+
s.RLock()
86+
defer s.RUnlock()
87+
return s.alive
88+
}
89+
90+
func (s *serviceReporter) Ready() {
91+
s.statusReporter.Lock()
92+
defer s.statusReporter.Unlock()
93+
s.statusReporter.ready[s.serviceName] = true
94+
}
95+
96+
func (s *serviceReporter) NotReady() {
97+
s.statusReporter.Lock()
98+
defer s.statusReporter.Unlock()
99+
s.statusReporter.ready[s.serviceName] = false
100+
}
101+
102+
func (s *serviceReporter) Dead() {
103+
s.statusReporter.Lock()
104+
defer s.statusReporter.Unlock()
105+
s.statusReporter.alive = false
106+
}
Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package podstatus
1+
package appstatus
22

33
import (
44
"context"
@@ -12,15 +12,20 @@ import (
1212
"github.com/bhmj/goblocks/log"
1313
)
1414

15+
type AppStatus interface {
16+
IsReady() bool
17+
IsAlive() bool
18+
}
19+
1520
type HealthcheckServer struct {
16-
server *http.Server
17-
statusReporter PodStatus
18-
logger log.MetaLogger
19-
port int
21+
server *http.Server
22+
appStatus AppStatus
23+
logger log.MetaLogger
24+
port int
2025
}
2126

22-
func NewHealthcheckServer(logger log.MetaLogger, port int, statusReporter PodStatus) *HealthcheckServer {
23-
health := &HealthcheckServer{statusReporter: statusReporter, logger: logger, port: port}
27+
func NewHealthcheckServer(logger log.MetaLogger, port int, appStatus AppStatus) *HealthcheckServer {
28+
health := &HealthcheckServer{appStatus: appStatus, logger: logger, port: port}
2429
router := http.NewServeMux()
2530
router.HandleFunc("GET /ready", health.ReadyHandler)
2631
router.HandleFunc("GET /alive", health.AliveHandler)
@@ -60,7 +65,7 @@ func (s *HealthcheckServer) ReadyHandler(w http.ResponseWriter, r *http.Request)
6065
defer r.Body.Close()
6166
_, _ = io.Copy(io.Discard, r.Body)
6267

63-
if s.statusReporter.IsReady() {
68+
if s.appStatus.IsReady() {
6469
w.WriteHeader(http.StatusOK)
6570
} else {
6671
w.WriteHeader(http.StatusInternalServerError)
@@ -71,7 +76,7 @@ func (s *HealthcheckServer) AliveHandler(w http.ResponseWriter, r *http.Request)
7176
defer r.Body.Close()
7277
_, _ = io.Copy(io.Discard, r.Body)
7378

74-
if s.statusReporter.IsAlive() {
79+
if s.appStatus.IsAlive() {
7580
w.WriteHeader(http.StatusOK)
7681
} else {
7782
w.WriteHeader(http.StatusInternalServerError)

podstatus/pod_status.go

Lines changed: 0 additions & 6 deletions
This file was deleted.

podstatus/status_reporter.go

Lines changed: 0 additions & 45 deletions
This file was deleted.

0 commit comments

Comments
 (0)