Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: graceful shutdown #127

Open
wants to merge 13 commits into
base: main
Choose a base branch
from
42 changes: 38 additions & 4 deletions App.go
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
package main

import (
"context"
"fmt"
"github.com/devtron-labs/common-lib/constants"
"github.com/devtron-labs/common-lib/middlewares"
"github.com/devtron-labs/kubelink/api/router"
client "github.com/devtron-labs/kubelink/grpc"
"github.com/devtron-labs/kubelink/pkg/k8sInformer"
"github.com/devtron-labs/kubelink/pkg/service"
"github.com/go-pg/pg"
"github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors/recovery"
grpc_prometheus "github.com/grpc-ecosystem/go-grpc-prometheus"
"go.uber.org/zap"
Expand All @@ -27,15 +29,19 @@ type App struct {
ServerImpl *service.ApplicationServiceServerImpl
router *router.RouterImpl
k8sInformer k8sInformer.K8sInformer
db *pg.DB
server *http.Server
grpcServer *grpc.Server
}

func NewApp(Logger *zap.SugaredLogger, ServerImpl *service.ApplicationServiceServerImpl,
router *router.RouterImpl, k8sInformer k8sInformer.K8sInformer) *App {
router *router.RouterImpl, k8sInformer k8sInformer.K8sInformer, db *pg.DB) *App {
return &App{
Logger: Logger,
ServerImpl: ServerImpl,
router: router,
k8sInformer: k8sInformer,
db: db,
}
}

Expand Down Expand Up @@ -68,23 +74,51 @@ func (app *App) Start() {
}
app.router.InitRouter()
grpcServer := grpc.NewServer(opts...)

app.grpcServer = grpcServer
client.RegisterApplicationServiceServer(grpcServer, app.ServerImpl)
grpc_prometheus.EnableHandlingTimeHistogram()
grpc_prometheus.Register(grpcServer)
var server *http.Server
go func() {
server := &http.Server{Addr: fmt.Sprintf(":%d", httpPort), Handler: app.router.Router}
server = &http.Server{Addr: fmt.Sprintf(":%d", httpPort), Handler: app.router.Router}
app.router.Router.Use(middlewares.Recovery)
err := server.ListenAndServe()
if err != nil {
log.Fatal("error in starting http server", err)
}
}()
app.server = server
app.Logger.Infow("starting server on ", "port", port)

err = grpcServer.Serve(listener)
if err != nil {
app.Logger.Fatalw("failed to listen: %v", "err", err)
}

}

func (app *App) Stop() {

app.Logger.Infow("kubelink shutdown initiating")

// Gracefully stop the HTTP server
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()

if err := app.server.Shutdown(ctx); err != nil {
app.Logger.Errorw("error shutting down HTTP server", "error", err)
} else {
app.Logger.Info("HTTP server stopped")
}

// Gracefully stop the gRPC server
app.Logger.Info("Stopping gRPC server...")
app.grpcServer.GracefulStop()

app.Logger.Infow("closing db connection")
err := app.db.Close()
if err != nil {
app.Logger.Errorw("error in closing db connection", "err", err)
}

app.Logger.Infow("housekeeping done. exiting now")
}
15 changes: 15 additions & 0 deletions Main.go
Original file line number Diff line number Diff line change
@@ -1,13 +1,28 @@
package main

import (
"fmt"
"log"
"os"
"os/signal"
"syscall"
)

func main() {
app, err := InitializeApp()
if err != nil {
log.Panic(err)
}
// gracefulStop start
var gracefulStop = make(chan os.Signal)
signal.Notify(gracefulStop, syscall.SIGTERM)
signal.Notify(gracefulStop, syscall.SIGINT)
go func() {
sig := <-gracefulStop
fmt.Printf("caught sig: %+v", sig)
app.Stop()
os.Exit(0)
}()
// gracefulStop end
app.Start()
}
2 changes: 1 addition & 1 deletion wire_gen.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.