fetch_ml/internal/api/health.go

82 lines
2.2 KiB
Go

package api
import (
"encoding/json"
"net/http"
"time"
)
// HealthStatus represents the health status of the service
type HealthStatus struct {
Status string `json:"status"`
Timestamp time.Time `json:"timestamp"`
Checks map[string]string `json:"checks,omitempty"`
}
// HealthHandler handles /health requests
type HealthHandler struct {
server *Server
}
// NewHealthHandler creates a new health check handler
func NewHealthHandler(s *Server) *HealthHandler {
return &HealthHandler{server: s}
}
// Health performs a basic health check
func (h *HealthHandler) Health(w http.ResponseWriter, r *http.Request) {
status := HealthStatus{
Status: "healthy",
Timestamp: time.Now().UTC(),
Checks: make(map[string]string),
}
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusOK)
_ = json.NewEncoder(w).Encode(status)
}
// Liveness performs a liveness probe (is the service running?)
func (h *HealthHandler) Liveness(w http.ResponseWriter, r *http.Request) {
// Simple liveness check - if we can respond, we're alive
status := HealthStatus{
Status: "alive",
Timestamp: time.Now().UTC(),
}
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusOK)
_ = json.NewEncoder(w).Encode(status)
}
// Readiness performs a readiness probe (is the service ready to accept traffic?)
func (h *HealthHandler) Readiness(w http.ResponseWriter, r *http.Request) {
status := HealthStatus{
Status: "ready",
Timestamp: time.Now().UTC(),
Checks: make(map[string]string),
}
// Check Redis connection (if queue is configured)
if h.server.taskQueue != nil {
// Simple check - if queue exists, assume it's ready
status.Checks["queue"] = "ok"
}
// Check experiment manager
if h.server.expManager != nil {
status.Checks["experiments"] = "ok"
}
// If all checks pass, we're ready
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusOK)
_ = json.NewEncoder(w).Encode(status)
}
// RegisterHealthRoutes registers health check routes
func (h *HealthHandler) RegisterRoutes(mux *http.ServeMux) {
mux.HandleFunc("/health", h.Health)
mux.HandleFunc("/health/live", h.Liveness)
mux.HandleFunc("/health/ready", h.Readiness)
}