62 lines
1.2 KiB
Go
62 lines
1.2 KiB
Go
package health
|
|
|
|
import (
|
|
"context"
|
|
"time"
|
|
)
|
|
|
|
type Status string
|
|
|
|
const (
|
|
StatusHealthy Status = "healthy"
|
|
StatusDegraded Status = "degraded"
|
|
StatusUnhealthy Status = "unhealthy"
|
|
)
|
|
|
|
type Result struct {
|
|
Status Status `json:"status"`
|
|
Message string `json:"message,omitempty"`
|
|
Latency time.Duration `json:"latency"`
|
|
Timestamp time.Time `json:"timestamp"`
|
|
Details map[string]any `json:"details,omitempty"`
|
|
}
|
|
|
|
type Checker interface {
|
|
Name() string
|
|
Check(ctx context.Context) Result
|
|
}
|
|
|
|
type OverallResult struct {
|
|
Status Status `json:"status"`
|
|
Timestamp time.Time `json:"timestamp"`
|
|
Version string `json:"version"`
|
|
Services map[string]Result `json:"services"`
|
|
}
|
|
|
|
func determineOverallStatus(results map[string]Result) Status {
|
|
hasUnhealthy := false
|
|
hasSMTPUnhealthy := false
|
|
hasDegraded := false
|
|
|
|
for name, result := range results {
|
|
switch result.Status {
|
|
case StatusUnhealthy:
|
|
if name == "smtp" {
|
|
hasSMTPUnhealthy = true
|
|
} else {
|
|
hasUnhealthy = true
|
|
}
|
|
case StatusDegraded:
|
|
hasDegraded = true
|
|
}
|
|
}
|
|
|
|
if hasUnhealthy {
|
|
return StatusUnhealthy
|
|
}
|
|
if hasDegraded || hasSMTPUnhealthy {
|
|
return StatusDegraded
|
|
}
|
|
return StatusHealthy
|
|
}
|