package grpc import ( "context" "github.com/rs/zerolog" "go.opentelemetry.io/otel/codes" "go.opentelemetry.io/otel/metric" "go.opentelemetry.io/otel/trace" "google.golang.org/grpc" appotel "gitea.libretechconsulting.com/rmcguire/go-app/pkg/otel" "gitea.libretechconsulting.com/rmcguire/go-app/pkg/srv/grpc/opts" ) type appGRPCServer struct { ctx context.Context tracer trace.Tracer meter metric.Meter opts *opts.GRPCOpts serverOpts []grpc.ServerOption logger *zerolog.Logger server *grpc.Server } // TODO: This probably needs to pass back an error chan and a shutdown // func like the http server does func InitGRPCServer(ctx context.Context, opts *opts.GRPCOpts) error { appGRPC := &appGRPCServer{ ctx: ctx, tracer: appotel.GetTracer(ctx, "grpc"), meter: appotel.GetMeter(ctx, "grpc"), opts: opts, serverOpts: make([]grpc.ServerOption, 0), logger: zerolog.Ctx(ctx), } ctx, span := appGRPC.tracer.Start(ctx, "appgrpc.init") defer span.End() if err := appGRPC.prepGRPCServer(ctx); err != nil { span.RecordError(err) span.SetStatus(codes.Error, "failed to prepare GRPC Server") return err } err := appGRPC.runGRPCServer(ctx) if err != nil { span.RecordError(err) span.SetStatus(codes.Error, "failed to start GRPC Server") return err } span.SetStatus(codes.Ok, "") return nil }