pkg/adapters/kitex/options.go (65 lines of code) (raw):
package kitex
import (
"context"
"github.com/cloudwego/kitex/pkg/rpcinfo"
"github.com/cloudwego/kitex/pkg/rpcinfo/remoteinfo"
)
type Option struct {
F func(o *options)
}
type options struct {
ResourceExtract func(ctx context.Context, req, resp interface{}) string
BlockFallback func(ctx context.Context, req, resp interface{}, blockErr error) error
EnableOutlier func(ctx context.Context) bool
}
func DefaultBlockFallback(ctx context.Context, req, resp interface{}, blockErr error) error {
return blockErr
}
func DefaultResourceExtract(ctx context.Context, req, resp interface{}) string {
ri := rpcinfo.GetRPCInfo(ctx)
return ri.To().ServiceName() + ":" + ri.To().Method()
}
func DefaultEnableOutlier(ctx context.Context) bool {
return false
}
func newOptions(opts []Option) *options {
o := &options{
ResourceExtract: DefaultResourceExtract,
BlockFallback: DefaultBlockFallback,
EnableOutlier: DefaultEnableOutlier,
}
o.Apply(opts)
return o
}
func (o *options) Apply(opts []Option) {
for _, op := range opts {
op.F(o)
}
}
// WithResourceExtract sets the resource extractor
func WithResourceExtract(f func(ctx context.Context, req, resp interface{}) string) Option {
return Option{F: func(o *options) {
o.ResourceExtract = f
}}
}
// WithBlockFallback sets the fallback handler
func WithBlockFallback(f func(ctx context.Context, req, resp interface{}, blockErr error) error) Option {
return Option{func(o *options) {
o.BlockFallback = f
}}
}
// WithEnableOutlier sets whether to enable outlier ejection
func WithEnableOutlier(f func(ctx context.Context) bool) Option {
return Option{func(o *options) {
o.EnableOutlier = f
}}
}
func ServiceNameExtract(ctx context.Context) string {
rpcInfo := rpcinfo.GetRPCInfo(ctx)
return rpcInfo.To().ServiceName()
}
func CalleeAddressExtract(ctx context.Context) string {
rpcInfo := rpcinfo.GetRPCInfo(ctx)
remote := remoteinfo.AsRemoteInfo(rpcInfo.To())
if remote == nil || remote.Address() == nil {
return ""
}
return remote.Address().String()
}