fix: healthcheck не должен зависеть от полноты конфига
HEALTHCHECK в образе запускается отдельным процессом без -config и без секретов, поэтому валидация конфига делала контейнер unhealthy при полностью рабочем демоне. Проверка /healthz перенесена до разбора ошибки Load, который и при ошибке возвращает конфиг со значениями по умолчанию. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2 files changed
+19
-4
No files matched your search
@@ -39,10 +39,9 @@ func run() int {
|
|||||||
}
|
}
|
||||||
|
|
||||||
cfg, err := config.Load(*configPath, os.Getenv, config.OSReadFile)
|
cfg, err := config.Load(*configPath, os.Getenv, config.OSReadFile)
|
||||||
if err != nil {
|
// Проверка здоровья намеренно идёт ДО разбора ошибки конфигурации: HEALTHCHECK в образе
|
||||||
fmt.Fprintln(os.Stderr, "ошибка конфигурации:", err)
|
// запускается как отдельный процесс, без -config и без секретов, и ему нужен только адрес
|
||||||
return 2
|
// /healthz. Load возвращает конфиг с значениями по умолчанию даже при ошибке.
|
||||||
}
|
|
||||||
if *healthcheck {
|
if *healthcheck {
|
||||||
if err := health.Probe(cfg.Listen, 3*time.Second); err != nil {
|
if err := health.Probe(cfg.Listen, 3*time.Second); err != nil {
|
||||||
fmt.Fprintln(os.Stderr, err)
|
fmt.Fprintln(os.Stderr, err)
|
||||||
@@ -50,6 +49,10 @@ func run() int {
|
|||||||
}
|
}
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
if err != nil {
|
||||||
|
fmt.Fprintln(os.Stderr, "ошибка конфигурации:", err)
|
||||||
|
return 2
|
||||||
|
}
|
||||||
|
|
||||||
log := newLogger(cfg)
|
log := newLogger(cfg)
|
||||||
log.Info("запуск", "version", version, "zones", cfg.Zones, "ip", cfg.IP, "ttl", cfg.TTL,
|
log.Info("запуск", "version", version, "zones", cfg.Zones, "ip", cfg.IP, "ttl", cfg.TTL,
|
||||||
|
|||||||
@@ -138,3 +138,15 @@ func TestSecretMissingFile(t *testing.T) {
|
|||||||
t.Fatal("ожидалась ошибка")
|
t.Fatal("ожидалась ошибка")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Load обязан возвращать пригодный Listen даже при ошибке: на этом построена проверка
|
||||||
|
// здоровья в контейнере — HEALTHCHECK запускается без -config и без секретов.
|
||||||
|
func TestLoadReturnsDefaultListenOnError(t *testing.T) {
|
||||||
|
cfg, err := Load("", func(string) string { return "" }, OSReadFile)
|
||||||
|
if err == nil {
|
||||||
|
t.Fatal("ожидали ошибку: не заданы ни конфиг, ни креды")
|
||||||
|
}
|
||||||
|
if cfg.Listen != ":9090" {
|
||||||
|
t.Fatalf("Listen = %q, ожидали значение по умолчанию :9090", cfg.Listen)
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in new issue
Block a user