package grpc import ( "context" "net" "go.opentelemetry.io/otel/codes" semconv "go.opentelemetry.io/otel/semconv/v1.27.0" ) // TODO: Implement func (a *appGRPCServer) runGRPCServer(spanCtx context.Context) error { _, span := a.tracer.Start(spanCtx, "appgrpc.init.start") defer span.End() span.SetAttributes( semconv.RPCSystemGRPC, semconv.NetworkProtocolName("grpc"), semconv.ServerAddress(a.opts.Listen), ) a.shutdownFunc = a.getShutdownFunc() l, err := net.Listen("tcp", a.opts.Listen) if err != nil { a.logger.Err(err).Send() span.RecordError(err) span.SetStatus(codes.Error, "failed to acquire net listener") return err } span.AddEvent("network listener acquired") // Launch GRPC Server go func() { if err := a.server.Serve(l); err != nil { a.logger.Err(err).Send() a.doneChan <- err } }() span.AddEvent("grpc server goroutine launched") span.SetStatus(codes.Ok, "") return nil } func (a *appGRPCServer) getShutdownFunc() func(context.Context) error { return func(ctx context.Context) error { stoppedChan := make(chan any) go func() { a.server.GracefulStop() stoppedChan <- nil }() select { case <-stoppedChan: a.logger.Warn().Msg("GRPC server shut down gracefully") return nil case <-ctx.Done(): a.logger.Warn().Msg("GRPC server shut down hard") a.server.Stop() return ctx.Err() } } }