package health import ( "context" "sync" "git.dcentral.systems/toolz/goplt/pkg/health" ) // Registry manages health checkers. type Registry struct { checkers map[string]health.HealthChecker mu sync.RWMutex } // NewRegistry creates a new health check registry. func NewRegistry() *Registry { return &Registry{ checkers: make(map[string]health.HealthChecker), } } // Register registers a health checker with the given name. func (r *Registry) Register(name string, checker health.HealthChecker) { r.mu.Lock() defer r.mu.Unlock() r.checkers[name] = checker } // Check performs health checks for all registered checkers. func (r *Registry) Check(ctx context.Context) health.HealthStatus { r.mu.RLock() defer r.mu.RUnlock() components := make([]health.ComponentStatus, 0, len(r.checkers)) overallStatus := health.StatusHealthy for name, checker := range r.checkers { err := checker.Check(ctx) status := health.StatusHealthy errorMsg := "" if err != nil { status = health.StatusUnhealthy errorMsg = err.Error() overallStatus = health.StatusUnhealthy } components = append(components, health.ComponentStatus{ Name: name, Status: status, Error: errorMsg, }) } return health.HealthStatus{ Status: overallStatus, Components: components, } } // LivenessCheck performs a basic liveness check (no dependencies). func (r *Registry) LivenessCheck(_ context.Context) health.HealthStatus { // Liveness is always healthy if the service is running return health.HealthStatus{ Status: health.StatusHealthy, } } // ReadinessCheck performs a readiness check (includes dependency checks). func (r *Registry) ReadinessCheck(ctx context.Context) health.HealthStatus { return r.Check(ctx) }