runner/server.go (74 lines of code) (raw):

package runner import ( "fmt" "github.com/dodopizza/jaeger-kusto/config" "github.com/hashicorp/go-hclog" "github.com/jaegertracing/jaeger/plugin/storage/grpc/shared" "google.golang.org/grpc" "io" "net" "net/url" "os" "os/signal" "strings" "sync" "syscall" ) func serveServer(c *config.PluginConfig, store shared.StoragePlugin, logger hclog.Logger) error { plugin := shared.StorageGRPCPlugin{ Impl: store, } tracer, closer, err := config.NewPluginTracer(c) if err != nil { return err } defer closer.Close() server := newGRPCServerWithTracer(tracer) if err := plugin.GRPCServer(nil, server); err != nil { return err } scheme, address, err := parseListenAddress(c.RemoteListenAddress) if err != nil { return err } // perform cleanup for unix domain socket, before process exit if scheme == "unix" { defer os.Remove(address) } listener, err := net.Listen(scheme, address) if err != nil { return err } logger.Info("starting server", "address", address, "scheme", scheme) wg := registerGracefulShutdown(server, store, logger) if err := server.Serve(listener); err != nil { return err } wg.Wait() return nil } func registerGracefulShutdown(server *grpc.Server, store shared.StoragePlugin, logger hclog.Logger) *sync.WaitGroup { signals := make(chan os.Signal, 1) signal.Notify(signals, os.Interrupt, syscall.SIGTERM) wg := &sync.WaitGroup{} wg.Add(1) go func() { sig := <-signals logger.Info("received signal, attempting gracefully stop server and plugin", "signal", sig) server.GracefulStop() // perform cleanup logic on writer c, ok := store.SpanWriter().(io.Closer) if ok { _ = c.Close() } logger.Info("server stopped") wg.Done() }() return wg } func parseListenAddress(addr string) (scheme, address string, err error) { u, err := url.Parse(addr) if err != nil { return "", "", err } proto := fmt.Sprintf("%s://", u.Scheme) return u.Scheme, strings.Replace(addr, proto, "", 1), nil }