refactor: simplify zrpc stat config (#3107)

master
Kevin Wan 2 years ago committed by GitHub
parent e13fd62d38
commit 98c9b5928a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -15,6 +15,8 @@ type (
ClientMiddlewaresConf = internal.ClientMiddlewaresConf
// ServerMiddlewaresConf defines whether to use server middlewares.
ServerMiddlewaresConf = internal.ServerMiddlewaresConf
// StatConf defines the stat config.
StatConf = internal.StatConf
// A RpcClientConf is a rpc client config.
RpcClientConf struct {

@ -1,8 +1,11 @@
package internal
import "time"
import "github.com/zeromicro/go-zero/zrpc/internal/serverinterceptors"
type (
// StatConf defines the stat config.
StatConf = serverinterceptors.StatConf
// ClientMiddlewaresConf defines whether to use client middlewares.
ClientMiddlewaresConf struct {
Trace bool `json:",default=true"`
@ -14,12 +17,11 @@ type (
// ServerMiddlewaresConf defines whether to use server middlewares.
ServerMiddlewaresConf struct {
Trace bool `json:",default=true"`
Recover bool `json:",default=true"`
Stat bool `json:",default=true"`
StatSlowThreshold time.Duration `json:",default=500ms"`
NotLoggingContentMethods []string `json:",optional"`
Prometheus bool `json:",default=true"`
Breaker bool `json:",default=true"`
Trace bool `json:",default=true"`
Recover bool `json:",default=true"`
Stat bool `json:",default=true"`
StatConf StatConf `json:",optional"`
Prometheus bool `json:",default=true"`
Breaker bool `json:",default=true"`
}
)

@ -113,11 +113,8 @@ func (s *rpcServer) buildUnaryInterceptors() []grpc.UnaryServerInterceptor {
interceptors = append(interceptors, serverinterceptors.UnaryRecoverInterceptor)
}
if s.middlewares.Stat {
interceptors = append(interceptors, serverinterceptors.UnaryStatInterceptor(s.metrics,
serverinterceptors.StatConf{
SlowThreshold: s.middlewares.StatSlowThreshold,
NotLoggingContentMethods: s.middlewares.NotLoggingContentMethods,
}))
interceptors = append(interceptors,
serverinterceptors.UnaryStatInterceptor(s.metrics, s.middlewares.StatConf))
}
if s.middlewares.Prometheus {
interceptors = append(interceptors, serverinterceptors.UnaryPrometheusInterceptor)

@ -19,20 +19,20 @@ import (
const defaultSlowThreshold = time.Millisecond * 500
var (
notLoggingContentMethods sync.Map
slowThreshold = syncx.ForAtomicDuration(defaultSlowThreshold)
ignoreContentMethods sync.Map
slowThreshold = syncx.ForAtomicDuration(defaultSlowThreshold)
)
// StatConf defines the static configuration for stat interceptor.
type StatConf struct {
SlowThreshold time.Duration
NotLoggingContentMethods []string
SlowThreshold time.Duration `json:",default=500ms"`
IgnoreContentMethods []string `json:",optional"`
}
// DontLogContentForMethod disable logging content for given method.
// Deprecated: use StatConf instead.
func DontLogContentForMethod(method string) {
notLoggingContentMethods.Store(method, lang.Placeholder)
ignoreContentMethods.Store(method, lang.Placeholder)
}
// SetSlowThreshold sets the slow threshold.
@ -44,7 +44,7 @@ func SetSlowThreshold(threshold time.Duration) {
// UnaryStatInterceptor returns a func that uses given metrics to report stats.
func UnaryStatInterceptor(metrics *stat.Metrics, conf StatConf) grpc.UnaryServerInterceptor {
staticNotLoggingContentMethods := collection.NewSet()
staticNotLoggingContentMethods.AddStr(conf.NotLoggingContentMethods...)
staticNotLoggingContentMethods.AddStr(conf.IgnoreContentMethods...)
return func(ctx context.Context, req any, info *grpc.UnaryServerInfo,
handler grpc.UnaryHandler) (resp any, err error) {
@ -62,8 +62,13 @@ func UnaryStatInterceptor(metrics *stat.Metrics, conf StatConf) grpc.UnaryServer
}
}
func isSlow(duration, durationThreshold time.Duration) bool {
return duration > slowThreshold.Load() ||
(durationThreshold > 0 && duration > durationThreshold)
}
func logDuration(ctx context.Context, method string, req any, duration time.Duration,
staticNotLoggingContentMethods *collection.Set, staticSlowThreshold time.Duration) {
ignoreMethods *collection.Set, durationThreshold time.Duration) {
var addr string
client, ok := peer.FromContext(ctx)
if ok {
@ -71,8 +76,8 @@ func logDuration(ctx context.Context, method string, req any, duration time.Dura
}
logger := logx.WithContext(ctx).WithDuration(duration)
if !shouldLogContent(method, staticNotLoggingContentMethods) {
if isSlow(duration, staticSlowThreshold) {
if !shouldLogContent(method, ignoreMethods) {
if isSlow(duration, durationThreshold) {
logger.Slowf("[RPC] slowcall - %s - %s", addr, method)
}
} else {
@ -87,12 +92,7 @@ func logDuration(ctx context.Context, method string, req any, duration time.Dura
}
}
func shouldLogContent(method string, staticNotLoggingContentMethods *collection.Set) bool {
_, ok := notLoggingContentMethods.Load(method)
return !ok && !staticNotLoggingContentMethods.Contains(method)
}
func isSlow(duration time.Duration, staticSlowThreshold time.Duration) bool {
return duration > slowThreshold.Load() ||
(staticSlowThreshold > 0 && duration > staticSlowThreshold)
func shouldLogContent(method string, ignoreMethods *collection.Set) bool {
_, ok := ignoreContentMethods.Load(method)
return !ok && !ignoreMethods.Contains(method)
}

@ -135,9 +135,9 @@ func TestLogDurationWithoutContent(t *testing.T) {
}
DontLogContentForMethod("foo")
// reset notLoggingContentMethods
// reset ignoreContentMethods
t.Cleanup(func() {
notLoggingContentMethods = sync.Map{}
ignoreContentMethods = sync.Map{}
})
for _, test := range tests {
test := test
@ -198,9 +198,9 @@ func Test_shouldLogContent(t *testing.T) {
if tt.setup != nil {
tt.setup()
}
// reset notLoggingContentMethods
// reset ignoreContentMethods
t.Cleanup(func() {
notLoggingContentMethods = sync.Map{}
ignoreContentMethods = sync.Map{}
})
set := collection.NewSet()
set.AddStr(tt.args.staticNotLoggingContentMethods...)

@ -100,7 +100,7 @@ func (rs *RpcServer) Stop() {
}
// DontLogContentForMethod disable logging content for given method.
// Deprecated: use ServerMiddlewaresConf.NotLoggingContentMethods instead.
// Deprecated: use ServerMiddlewaresConf.IgnoreContentMethods instead.
func DontLogContentForMethod(method string) {
serverinterceptors.DontLogContentForMethod(method)
}

Loading…
Cancel
Save