57 lines
1.4 KiB
Go
57 lines
1.4 KiB
Go
package health
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/loveuer/go-alived/pkg/config"
|
|
"github.com/loveuer/go-alived/pkg/logger"
|
|
)
|
|
|
|
func CreateChecker(cfg *config.HealthChecker) (Checker, error) {
|
|
configMap, ok := cfg.Config.(map[string]interface{})
|
|
if !ok {
|
|
return nil, fmt.Errorf("invalid config for checker %s", cfg.Name)
|
|
}
|
|
|
|
switch cfg.Type {
|
|
case "tcp":
|
|
return NewTCPChecker(cfg.Name, configMap)
|
|
case "http", "https":
|
|
return NewHTTPChecker(cfg.Name, configMap)
|
|
case "ping", "icmp":
|
|
return NewPingChecker(cfg.Name, configMap)
|
|
case "script":
|
|
return NewScriptChecker(cfg.Name, configMap)
|
|
default:
|
|
return nil, fmt.Errorf("unsupported checker type: %s", cfg.Type)
|
|
}
|
|
}
|
|
|
|
func LoadFromConfig(cfg *config.Config, log *logger.Logger) (*Manager, error) {
|
|
manager := NewManager(log)
|
|
|
|
for _, healthCfg := range cfg.Health {
|
|
checker, err := CreateChecker(&healthCfg)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to create checker %s: %w", healthCfg.Name, err)
|
|
}
|
|
|
|
monitorCfg := &CheckerConfig{
|
|
Name: healthCfg.Name,
|
|
Type: healthCfg.Type,
|
|
Interval: healthCfg.Interval,
|
|
Timeout: healthCfg.Timeout,
|
|
Rise: healthCfg.Rise,
|
|
Fall: healthCfg.Fall,
|
|
Config: healthCfg.Config.(map[string]interface{}),
|
|
}
|
|
|
|
monitor := NewMonitor(checker, monitorCfg, log)
|
|
manager.AddMonitor(monitor)
|
|
|
|
log.Info("loaded health checker: %s (type=%s)", healthCfg.Name, healthCfg.Type)
|
|
}
|
|
|
|
return manager, nil
|
|
}
|