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

68 lines
1.4 KiB
Go
Raw Normal View History

2025-03-07 11:16:32 -05:00
package grpc
2025-03-07 11:44:50 -05:00
import (
"context"
2025-03-07 13:00:45 -05:00
"net"
2025-03-07 11:44:50 -05:00
2025-03-07 13:00:45 -05:00
"go.opentelemetry.io/otel/codes"
2025-03-07 11:44:50 -05:00
semconv "go.opentelemetry.io/otel/semconv/v1.27.0"
)
2025-03-07 11:16:32 -05:00
// TODO: Implement
func (a *appGRPCServer) runGRPCServer(spanCtx context.Context) error {
_, span := a.tracer.Start(spanCtx, "appgrpc.init.start")
defer span.End()
2025-03-07 11:44:50 -05:00
span.SetAttributes(
semconv.RPCSystemGRPC,
semconv.NetworkProtocolName("grpc"),
semconv.ServerAddress(a.opts.Listen),
)
2025-03-07 13:00:45 -05:00
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, "")
2025-03-07 11:16:32 -05:00
return nil
}
2025-03-07 13:00:45 -05:00
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:
2025-03-07 16:45:50 -05:00
a.logger.Warn().Msg("GRPC server shut down gracefully")
2025-03-07 13:00:45 -05:00
return nil
case <-ctx.Done():
2025-03-07 16:45:50 -05:00
a.logger.Warn().Msg("GRPC server shut down hard")
a.server.Stop()
2025-03-07 13:00:45 -05:00
return ctx.Err()
}
}
}