@@ -2,8 +2,9 @@ package main
22
33import (
44 "context"
5+ "errors"
56 "fmt"
6- "log"
7+ "log/slog "
78 "net/http"
89 "os"
910 "os/signal"
@@ -20,44 +21,50 @@ type App struct {
2021 supervisor * Supervisor
2122 httpServer * http.Server
2223 wg sync.WaitGroup
24+ log * slog.Logger
2325}
2426
25- func NewApp (redisAddr , gpuType string ) * App {
27+ func NewApp (redisAddr , gpuType string , log * slog. Logger ) * App {
2628 client := redis .NewClient (& redis.Options {Addr : redisAddr })
27- scheduler := NewScheduler (redisAddr )
29+ scheduler := NewScheduler (redisAddr , log )
2830
2931 consumerID := fmt .Sprintf ("worker_%d" , os .Getpid ())
30- supervisor := NewSupervisor (redisAddr , consumerID , gpuType )
32+ supervisor := NewSupervisor (redisAddr , consumerID , gpuType , log )
3133
3234 mux := http .NewServeMux ()
3335 a := & App {
3436 redisClient : client ,
3537 scheduler : scheduler ,
3638 supervisor : supervisor ,
3739 httpServer : & http.Server {Addr : ":3000" , Handler : mux },
40+ log : log ,
3841 }
3942
4043 mux .HandleFunc ("/auth/login" , a .login )
4144 mux .HandleFunc ("/auth/refresh" , a .refresh )
4245 mux .HandleFunc ("/jobs" , a .enqueueJob )
4346 mux .HandleFunc ("/jobs/status" , a .getJobStatus )
4447
48+ a .log .Info ("new app initialized" , "redis_address" , redisAddr ,
49+ "gpu_type" , gpuType , "http_address" , a .httpServer .Addr )
50+
4551 return a
4652}
4753
4854func (a * App ) Start () error {
4955 // Connect to redis
5056 if err := a .redisClient .Ping (context .Background ()).Err (); err != nil {
51- return fmt .Errorf ("redis ping failed: %w" , err )
57+ a .log .Error ("redis ping failed" , "err" , err )
58+ return err
5259 }
53-
60+
5461 // Launch HTTP server
5562 a .wg .Add (1 )
5663 go func () {
5764 defer a .wg .Done ()
58- log . Println ( "HTTP server listening on " , a .httpServer .Addr )
65+ slog . Info ( "http server started" , "address " , a .httpServer .Addr )
5966 if err := a .httpServer .ListenAndServe (); err != nil && err != http .ErrServerClosed {
60- log .Fatalf ("HTTP server error: %v " , err )
67+ a . log .Error ("HTTP server error" , "err " , err )
6168 }
6269 }()
6370
@@ -66,7 +73,7 @@ func (a *App) Start() error {
6673
6774func (a * App ) Shutdown (ctx context.Context ) error {
6875 if err := a .httpServer .Shutdown (ctx ); err != nil {
69- log .Printf ("error shutting down HTTP server: %v " , err )
76+ a . log .Error ("error shutting down HTTP server" , "err " , err )
7077 }
7178
7279 // Wait for ListenAndServe goroutine to finish
@@ -75,44 +82,61 @@ func (a *App) Shutdown(ctx context.Context) error {
7582 a .supervisor .Stop ()
7683
7784 if err := a .scheduler .Close (); err != nil {
78- log .Printf ("error closing scheduler: %v" , err )
85+ a .log .Error ("error closing scheduler" , "err" , err )
86+
87+ } else {
88+ a .log .Info ("scheduler closed successfully" )
7989 }
8090
8191 if err := a .redisClient .Close (); err != nil {
82- log .Printf ("error closing redis client: %v" , err )
92+ a .log .Error ("error closing redis client" , "err" , err )
93+ } else {
94+ a .log .Info ("redis client closed successfully" )
8395 }
8496
97+ a .log .Info ("shutdown completed" )
98+
8599 return nil
86100}
87101
88102func main () {
89- app := NewApp ("localhost:6379" , "AMD" )
103+ log := slog .New (slog .NewJSONHandler (os .Stdout , nil ))
104+ app := NewApp ("localhost:6379" , "AMD" , log )
90105
91106 if err := app .Start (); err != nil {
92- log .Fatalf ("failed to start app: %v" , err )
107+ log .Error ("failed to start app" , "err" , err )
108+ os .Exit (1 )
93109 }
94110
95111 ctx , stop := signal .NotifyContext (context .Background (), os .Interrupt , syscall .SIGTERM )
96112 defer stop ()
97113 <- ctx .Done ()
98- log .Println ("shutdown signal received" )
114+ log .Info ("shutdown signal received" )
99115
100116 shutdownCtx , cancel := context .WithTimeout (context .Background (), 15 * time .Second )
101117 defer cancel ()
102118 if err := app .Shutdown (shutdownCtx ); err != nil {
103- log .Fatalf ("shutdown error: %v " , err )
119+ log .Error ("shutdown error" , "err " , err )
104120 }
105121
106- log .Println ("all services stopped cleanly" )
122+ log .Info ("all services stopped cleanly" )
107123}
108124
109125func (a * App ) login (w http.ResponseWriter , r * http.Request ) {
110126 ctx := r .Context ()
127+ a .log .Info ("login handler accessed" , "remote_address" , r .RemoteAddr )
111128 val , err := a .redisClient .Get (ctx , "some:key" ).Result ()
112- if err != nil || err != redis .Nil {
129+ if errors .Is (err , redis .Nil ) {
130+ a .log .Info ("redis key not found" )
131+ http .Error (w , "redis key not found" , http .StatusNotFound )
132+ return
133+ }
134+ if err != nil {
135+ a .log .Error ("redis error on login" , "err" , err )
113136 http .Error (w , "redis error" , http .StatusInternalServerError )
114137 return
115138 }
139+ a .log .Info ("login success" , "remote_address" , r .RemoteAddr )
116140 fmt .Fprintf (w , "login page; redis says: %q\n " , val )
117141}
118142
@@ -121,14 +145,17 @@ func (a *App) refresh(w http.ResponseWriter, r *http.Request) {
121145}
122146
123147func (a * App ) enqueueJob (w http.ResponseWriter , r * http.Request ) {
148+ a .log .Info ("enqueueJob handler accessed" , "remote_address" , r .RemoteAddr )
124149 payload := map [string ]interface {}{
125150 "task_id" : 123 ,
126151 "data" : "test_data_123" ,
127152 }
128153 if err := a .scheduler .Enqueue ("jobType" , payload ); err != nil {
154+ a .log .Error ("enqueue failed" , "err" , err , "payload" , payload )
129155 http .Error (w , "enqueue failed" , http .StatusInternalServerError )
130156 return
131157 }
158+ a .log .Info ("job enqueued" , "payload" , payload )
132159 w .WriteHeader (http .StatusAccepted )
133160 fmt .Fprint (w , "enqueued" )
134161}
0 commit comments