pkg/adapters/grpc/server.go (69 lines of code) (raw):

package grpc import ( "context" sentinel "github.com/alibaba/sentinel-golang/api" "github.com/alibaba/sentinel-golang/core/base" "google.golang.org/grpc" ) // NewUnaryServerInterceptor creates the unary server interceptor wrapped with Sentinel entry. func NewUnaryServerInterceptor(opts ...Option) grpc.UnaryServerInterceptor { options := evaluateOptions(opts) return func( ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler, ) (interface{}, error) { // method as resource name by default resourceName := info.FullMethod if options.unaryServerResourceExtract != nil { resourceName = options.unaryServerResourceExtract(ctx, req, info) } entry, blockErr := sentinel.Entry( resourceName, sentinel.WithResourceType(base.ResTypeRPC), sentinel.WithTrafficType(base.Inbound), ) if blockErr != nil { if options.unaryServerBlockFallback != nil { return options.unaryServerBlockFallback(ctx, req, info, blockErr) } return nil, blockErr } defer entry.Exit() res, err := handler(ctx, req) if err != nil { sentinel.TraceError(entry, err) } return res, err } } // NewStreamServerInterceptor creates the unary stream interceptor wrapped with Sentinel entry. func NewStreamServerInterceptor(opts ...Option) grpc.StreamServerInterceptor { options := evaluateOptions(opts) return func( srv interface{}, ss grpc.ServerStream, info *grpc.StreamServerInfo, handler grpc.StreamHandler, ) error { // method as resource name by default resourceName := info.FullMethod if options.streamServerResourceExtract != nil { resourceName = options.streamServerResourceExtract(srv, ss, info) } entry, blockErr := sentinel.Entry( resourceName, sentinel.WithResourceType(base.ResTypeRPC), sentinel.WithTrafficType(base.Inbound), ) if blockErr != nil { // blocked if options.streamServerBlockFallback != nil { return options.streamServerBlockFallback(srv, ss, info, blockErr) } return blockErr } defer entry.Exit() err := handler(srv, ss) if err != nil { sentinel.TraceError(entry, err) } return err } }