main.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. // Command admind is the admin HTTP API + (later) UI host. Tenant CRUD,
  2. // DLQ inspection, replay, audit log. M0: /health, /metrics, /v1/ping.
  3. package main
  4. import (
  5. "context"
  6. "encoding/json"
  7. "net/http"
  8. "os"
  9. "os/signal"
  10. "syscall"
  11. "time"
  12. "git3.techno-world.net/lrosales/broad-announce/internal/config"
  13. "git3.techno-world.net/lrosales/broad-announce/internal/httpserver"
  14. "git3.techno-world.net/lrosales/broad-announce/internal/observability"
  15. )
  16. func main() {
  17. cfg, err := config.LoadCommon("admind")
  18. if err != nil {
  19. os.Stderr.WriteString("config: " + err.Error() + "\n")
  20. os.Exit(1)
  21. }
  22. logger := observability.Init(cfg.Env, cfg.LogLevel, "admind")
  23. logger.Info("starting", "env", cfg.Env, "addr", cfg.HTTPAddr)
  24. ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM)
  25. defer stop()
  26. reg, _ := observability.NewRegistry("admind")
  27. srv := httpserver.New(httpserver.Config{
  28. Addr: cfg.HTTPAddr,
  29. ServiceName: "admind",
  30. ShutdownGrace: cfg.ShutdownGrace,
  31. }, logger, observability.MetricsHandler(reg))
  32. srv.Mux().HandleFunc("GET /v1/ping", func(w http.ResponseWriter, r *http.Request) {
  33. w.Header().Set("Content-Type", "application/json")
  34. _ = json.NewEncoder(w).Encode(map[string]any{
  35. "pong": true,
  36. "service": "admind",
  37. "timestamp": time.Now().UTC().Format(time.RFC3339Nano),
  38. })
  39. })
  40. errCh := make(chan error, 1)
  41. go func() { errCh <- srv.Start() }()
  42. select {
  43. case <-ctx.Done():
  44. logger.Info("shutdown signal received")
  45. case err := <-errCh:
  46. if err != nil {
  47. logger.Error("http server", "err", err)
  48. os.Exit(1)
  49. }
  50. }
  51. if err := srv.Shutdown(ctx); err != nil {
  52. logger.Warn("graceful shutdown", "err", err)
  53. }
  54. logger.Info("bye")
  55. }