@@ -6,10 +6,17 @@ import (
6
6
"net/http"
7
7
"time"
8
8
9
+ logger "github.com/rs/zerolog"
10
+
9
11
"github.com/prometheus/client_golang/prometheus/promhttp"
10
12
"go.uber.org/zap"
11
13
)
12
14
15
+ // ReadinessChecker defines the interface for checking readiness status
16
+ type ReadinessChecker interface {
17
+ CheckReadiness () error
18
+ }
19
+
13
20
type PrometheusServer struct {
14
21
svr * http.Server
15
22
@@ -18,6 +25,8 @@ type PrometheusServer struct {
18
25
interval time.Duration
19
26
20
27
quit chan struct {}
28
+
29
+ readinessChecker ReadinessChecker
21
30
}
22
31
23
32
func NewPrometheusServer (addr string , interval time.Duration , logger * zap.Logger ) * PrometheusServer {
@@ -39,6 +48,37 @@ func NewPrometheusServer(addr string, interval time.Duration, logger *zap.Logger
39
48
}
40
49
}
41
50
51
+ // SetReadinessChecker sets the readiness checker implementation
52
+ func (ps * PrometheusServer ) SetReadinessChecker (rc ReadinessChecker ) {
53
+ ps .readinessChecker = rc
54
+
55
+ // Add the readiness endpoint only after the checker is set
56
+ if mux , ok := ps .svr .Handler .(* http.ServeMux ); ok {
57
+ mux .HandleFunc ("/health" , ps .readinessHandler )
58
+ ps .logger .Info ("Readiness endpoint registered at /health" )
59
+ }
60
+ }
61
+
62
+ // readinessHandler handles the /health endpoint requests
63
+ func (ps * PrometheusServer ) readinessHandler (w http.ResponseWriter , r * http.Request ) {
64
+ if ps .readinessChecker == nil {
65
+ ps .logger .Error ("Readiness checker not configured" )
66
+ http .Error (w , "Readiness checker not configured" , http .StatusInternalServerError )
67
+ return
68
+ }
69
+
70
+ if err := ps .readinessChecker .CheckReadiness (); err != nil {
71
+ ps .logger .Error ("Readiness check failed" , zap .Error (err ))
72
+ http .Error (w , err .Error (), http .StatusServiceUnavailable )
73
+ return
74
+ }
75
+
76
+ w .WriteHeader (http .StatusOK )
77
+ if _ , err := w .Write ([]byte ("Healthy" )); err != nil {
78
+ logger .Ctx (r .Context ()).Err (err ).Msg ("failed to write response" )
79
+ }
80
+ }
81
+
42
82
func (ps * PrometheusServer ) Start () {
43
83
ps .logger .Info ("Starting Prometheus server" ,
44
84
zap .String ("address" , ps .svr .Addr ))
0 commit comments