Files
healthlog/cmd/healthlog/healthcheck.go
T
av 41f2f05f2f добавлен приём пакетов Health Auto Export
- POST /api/v1/ingest: токен, лимит тела, gzip, durable-запись тела в сырой
  архив, учёт доставки в SQLite
- код ответа отражает доставку, а не разбор: битый JSON — 400, непонятое
  содержимое — 200, данные уже сохранены и доразберутся позже
- сохраняется полный набор заголовков запроса с вычисткой секретов по имени
  и по совпадению значения с токеном
2026-08-01 12:37:17 +03:00

56 lines
1.4 KiB
Go

package main
import (
"context"
"flag"
"fmt"
"net/http"
"strings"
"time"
"git.vakhrushev.me/av/healthlog/internal/config"
)
func runHealthcheck(args []string) error {
fs := flag.NewFlagSet("healthcheck", flag.ContinueOnError)
cfgPath := fs.String("config", config.DefaultPath, "путь к config.toml")
timeout := fs.Duration("timeout", 5*time.Second, "таймаут запроса")
if err := fs.Parse(args); err != nil {
return fmt.Errorf("parse flags: %w", err)
}
cfg, err := config.Load(*cfgPath)
if err != nil {
return err
}
ctx, cancel := context.WithTimeout(context.Background(), *timeout)
defer cancel()
url := "http://" + localAddr(cfg.Server.Addr) + "/healthz"
req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil)
if err != nil {
return fmt.Errorf("build request: %w", err)
}
resp, err := http.DefaultClient.Do(req)
if err != nil {
return fmt.Errorf("healthz: %w", err)
}
defer func() { _ = resp.Body.Close() }()
if resp.StatusCode != http.StatusOK {
return fmt.Errorf("healthz: статус %d", resp.StatusCode)
}
return nil
}
// localAddr превращает адрес прослушивания в адрес для обращения к себе:
// ":8080" слушает все интерфейсы, но стучаться надо в конкретный.
func localAddr(addr string) string {
if strings.HasPrefix(addr, ":") {
return "127.0.0.1" + addr
}
return addr
}