package main import ( "flag" "fmt" "os" "os/signal" "syscall" "github.com/edgeai/gateway/internal/config" "github.com/edgeai/gateway/internal/observability" "github.com/edgeai/gateway/internal/server" ) func main() { configPath := flag.String("config", config.ConfigPath(), "path to config file") flag.Parse() // Load configuration cfg, err := config.Load(*configPath) if err != nil { fmt.Fprintf(os.Stderr, "failed to load config from %s: %v\n", *configPath, err) os.Exit(1) } // Initialize logger observability.SetLogLevel(cfg.Observability.LogLevel) logger := observability.GetLogger() logger.Info("edge ai gateway starting", observability.F(). Event("startup"). Set("config_path", *configPath). Set("server_port", cfg.Server.Port)) // Create HTTP server srv, err := server.New(cfg, logger) if err != nil { logger.Error("failed to create server", observability.F().Event("startup_error").Reason(err.Error())) os.Exit(1) } // Start server in background go func() { if err := srv.Start(); err != nil { logger.Error("server error", observability.F().Event("server_error").Reason(err.Error())) } }() logger.Info("server listening", observability.F(). Event("listening"). Set("host", cfg.Server.Host). Set("port", cfg.Server.Port)) // Wait for shutdown signal sigCh := make(chan os.Signal, 1) signal.Notify(sigCh, syscall.SIGINT, syscall.SIGTERM) sig := <-sigCh logger.Info("received shutdown signal", observability.F().Event("shutdown").Set("signal", sig.String())) // Graceful shutdown if err := srv.Shutdown(); err != nil { logger.Error("shutdown error", observability.F().Event("shutdown_error").Reason(err.Error())) } logger.Info("server stopped", observability.F().Event("stopped")) }