feat: design a separate package for health check
This commit is contained in:
54
internal/health/composite.go
Normal file
54
internal/health/composite.go
Normal file
@@ -0,0 +1,54 @@
|
||||
package health
|
||||
|
||||
import (
|
||||
"context"
|
||||
"sync"
|
||||
"time"
|
||||
)
|
||||
|
||||
type CompositeChecker struct {
|
||||
checkers []Checker
|
||||
}
|
||||
|
||||
func NewCompositeChecker(checkers ...Checker) *CompositeChecker {
|
||||
return &CompositeChecker{
|
||||
checkers: checkers,
|
||||
}
|
||||
}
|
||||
|
||||
func (c *CompositeChecker) AddChecker(checker Checker) {
|
||||
c.checkers = append(c.checkers, checker)
|
||||
}
|
||||
|
||||
func (c *CompositeChecker) Check(ctx context.Context) OverallResult {
|
||||
results := make(map[string]Result)
|
||||
var mu sync.Mutex
|
||||
var wg sync.WaitGroup
|
||||
|
||||
for _, checker := range c.checkers {
|
||||
wg.Add(1)
|
||||
go func(ch Checker) {
|
||||
defer wg.Done()
|
||||
|
||||
result := ch.Check(ctx)
|
||||
|
||||
mu.Lock()
|
||||
results[ch.Name()] = result
|
||||
mu.Unlock()
|
||||
}(checker)
|
||||
}
|
||||
|
||||
wg.Wait()
|
||||
|
||||
return OverallResult{
|
||||
Status: determineOverallStatus(results),
|
||||
Timestamp: time.Now().UTC(),
|
||||
Services: results,
|
||||
}
|
||||
}
|
||||
|
||||
func (c *CompositeChecker) CheckWithVersion(ctx context.Context, version string) OverallResult {
|
||||
result := c.Check(ctx)
|
||||
result.Version = version
|
||||
return result
|
||||
}
|
||||
Reference in New Issue
Block a user