From 554cc7f65cea8637c0c4f6c1de040a7557f2669e Mon Sep 17 00:00:00 2001 From: Robin Dittmar Date: Fri, 10 Jul 2026 12:40:47 +0200 Subject: [PATCH] Added simple configuration options --- cmd/api-server/main.go | 95 +++++++++++++++++++++++++++++++++--------- 1 file changed, 75 insertions(+), 20 deletions(-) diff --git a/cmd/api-server/main.go b/cmd/api-server/main.go index ae191bc..45a82f4 100644 --- a/cmd/api-server/main.go +++ b/cmd/api-server/main.go @@ -3,10 +3,13 @@ package main import ( "context" "errors" + "flag" + "fmt" "log/slog" "net/http" "os" "os/signal" + "strconv" "syscall" "time" @@ -16,6 +19,9 @@ import ( ) type Config struct { + Environment string + Port int + OTLPEndpoint string } func main() { @@ -30,21 +36,17 @@ func main() { func run(serviceName string, serviceVersion string) error { _ = godotenv.Load(".env") - - baseHandler := slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{ - Level: slog.LevelInfo, - }) - traceHandler := &telemetry.TraceHandler{Handler: baseHandler} - logger := slog.New(traceHandler) - slog.SetDefault(logger) + setupLogging() slog.Info("Starting service", slog.String("service", serviceName), slog.String("version", serviceVersion)) + cfg := loadConfig() + telCfg := telemetry.Config{ ServiceName: serviceName, ServiceVersion: serviceVersion, - Endpoint: "localhost:4317", - Environment: "development", + Endpoint: cfg.OTLPEndpoint, + Environment: cfg.Environment, } shutdownTelemetry, err := telemetry.Init(context.Background(), telCfg) if err != nil { @@ -60,17 +62,7 @@ func run(serviceName string, serviceVersion string) error { } }() - cfg := router.Config{} - mux := router.NewMux(cfg) - - srv := &http.Server{ - Addr: ":8080", - Handler: mux, - ReadTimeout: 5 * time.Second, - WriteTimeout: 10 * time.Second, - IdleTimeout: 120 * time.Second, - } - + srv := makeServer(cfg) go func() { slog.Info("Starting http server", "addr", srv.Addr) if err := srv.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) { @@ -95,3 +87,66 @@ func run(serviceName string, serviceVersion string) error { slog.Info("Service shutdown successful!") return nil } + +func setupLogging() { + baseHandler := slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{ + Level: slog.LevelInfo, + }) + + traceHandler := &telemetry.TraceHandler{Handler: baseHandler} + + logger := slog.New(traceHandler) + slog.SetDefault(logger) +} + +func loadConfig() *Config { + envFlag := flag.String("env", "development", "environment to use") + portFlag := flag.Int("port", 8080, "port to listen on") + otlpEndpointFlag := flag.String("otlp-endpoint", "localhost:4317", "otlp endpoint") + + flag.Parse() + + cfg := &Config{ + Environment: *envFlag, + Port: *portFlag, + OTLPEndpoint: *otlpEndpointFlag, + } + + assignStringFromEnv("DTTMR_ENVIRONMENT", &cfg.Environment) + assignIntFromEnv("DTTMR_PORT", &cfg.Port) + assignStringFromEnv("DTTMR_OTLP_ENDPOINT", &cfg.OTLPEndpoint) + + return cfg +} + +func assignStringFromEnv(key string, target *string) { + if val, exists := os.LookupEnv(key); exists { + *target = val + } +} + +func assignIntFromEnv(key string, target *int) { + if val, exists := os.LookupEnv(key); exists { + parsed, err := strconv.Atoi(val) + if err != nil { + slog.Error("Failed to parse environment variable", slog.String("var", key), slog.Any("error", err)) + } else { + *target = parsed + } + } +} + +func makeServer(cfg *Config) *http.Server { + routerConfig := router.Config{} + mux := router.NewMux(routerConfig) + + srv := &http.Server{ + Addr: fmt.Sprintf(":%d", cfg.Port), + Handler: mux, + ReadTimeout: 5 * time.Second, + WriteTimeout: 10 * time.Second, + IdleTimeout: 120 * time.Second, + } + + return srv +}