- Fix error return value checks (errcheck) - Fix unused parameters by using underscore prefix - Add missing package comments to all packages - Fix context key type issue in middleware (use typed contextKey) - Replace deprecated trace.NewNoopTracerProvider with noop.NewTracerProvider - Fix embedded field selector in database client - Remove trailing whitespace - Remove revive linter (as requested) to avoid stuttering warnings for public API interfaces All linting and formatting checks now pass.
74 lines
1.7 KiB
Go
74 lines
1.7 KiB
Go
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)
|
|
}
|