Skip to content

Commit

Permalink
fix: Implement graceful shutdown (#79)
Browse files Browse the repository at this point in the history
  • Loading branch information
skhalash authored Oct 23, 2024
1 parent 02f9578 commit 8ff5d6e
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 13 deletions.
2 changes: 1 addition & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
FROM europe-docker.pkg.dev/kyma-project/prod/external/library/golang:1.23.1-alpine3.20 as build
FROM europe-docker.pkg.dev/kyma-project/prod/external/library/golang:1.23.1-alpine3.20 AS build


WORKDIR /src/
Expand Down
64 changes: 52 additions & 12 deletions main.go
Original file line number Diff line number Diff line change
@@ -1,19 +1,32 @@
package main

import (
"context"
"errors"
"flag"
"fmt"
"log/slog"
"net/http"
"os"
"os/signal"
"syscall"
"time"

"github.com/prometheus/client_golang/prometheus/promhttp"

"github.com/kyma-project/directory-size-exporter/internal/exporter"
)

"github.com/prometheus/client_golang/prometheus/promhttp"
const (
defaultLogFormat = "json"
defaultLogLevel = "info"
readHeaderTimeout = 1 * time.Second
shutdownTimeout = 10 * time.Second
)

var (
logger = createLogger(defaultLogFormat, defaultLogLevel)

storagePath string
metricName string
logFormat string
Expand All @@ -23,8 +36,15 @@ var (
)

func main() {
flag.StringVar(&logFormat, "log-format", "json", "Log format (json or text)")
flag.StringVar(&logLevel, "log-level", "info", "Log level (debug, info, warn, error)")
if err := run(); err != nil {
fmt.Fprintf(os.Stderr, "Error: %v\n", err)
os.Exit(1)
}
}

func run() error {
flag.StringVar(&logFormat, "log-format", defaultLogFormat, "Log format (json or text)")
flag.StringVar(&logLevel, "log-level", defaultLogLevel, "Log level (debug, info, warn, error)")

flag.StringVar(&storagePath, "storage-path", "", "Path to the observed data folder")
flag.StringVar(&metricName, "metric-name", "", "Metric name used for exporting the folder size")
Expand All @@ -33,27 +53,47 @@ func main() {

flag.Parse()
if err := validateFlags(); err != nil {
panic(err)
return fmt.Errorf("invalid flags: %s", err)
}

logger := createLogger()

logger = createLogger(logFormat, logLevel)
exp := exporter.NewExporter(storagePath, metricName, logger)
logger.Info("Exporter is initialized")

exp.RecordMetrics(interval)
logger.Info("Started recording metrics")

http.Handle("/metrics", promhttp.Handler())
server := &http.Server{
Addr: ":" + port,
ReadHeaderTimeout: 1 * time.Second,
ReadHeaderTimeout: readHeaderTimeout,
}

if err := server.ListenAndServe(); err != nil {
panic(err)
go func() {
logger.Info("Listening on port '" + port + "'")

// When Shutdown is called, ListenAndServe will return http.ErrServerClosed, do not log it as an error
if err := server.ListenAndServe(); !errors.Is(err, http.ErrServerClosed) {
logger.Error("HTTP server error: %v", slog.Any("err", err))
}

logger.Info("Stopped serving new connections.")
}()

sigChan := make(chan os.Signal, 1)
signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)
<-sigChan

shutdownCtx, shutdownRelease := context.WithTimeout(context.Background(), shutdownTimeout)
defer shutdownRelease()

if err := server.Shutdown(shutdownCtx); err != nil {
logger.Error("HTTP shutdown error: %v", slog.Any("err", err))
return err
}
logger.Info("Listening on port '" + port + "'")

logger.Info("Graceful shutdown complete.")

return nil
}

func validateFlags() error {
Expand All @@ -72,7 +112,7 @@ func validateFlags() error {
return nil
}

func createLogger() *slog.Logger {
func createLogger(logFormat, logLevel string) *slog.Logger {
level := slog.LevelInfo
switch logLevel {
case "debug":
Expand Down

0 comments on commit 8ff5d6e

Please sign in to comment.