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:
|
|
|
|
return nil
|
|
|
|
case <-ctx.Done():
|
|
|
|
return ctx.Err()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|