go-app/pkg/srv/grpc/grpc_run.go

68 lines
1.4 KiB
Go

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()
}
}
}