| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 | 
							- package grpcutil
 
- import (
 
- 	"errors"
 
- 	"reflect"
 
- 	"kpt-tmr-group/pkg/xerr"
 
- 	spb "google.golang.org/genproto/googleapis/rpc/status"
 
- 	"google.golang.org/grpc/codes"
 
- 	"google.golang.org/grpc/status"
 
- )
 
- // StatusError cause of grpc status error
 
- func StatusError(err error) (*status.Status, bool) {
 
- 	statusErr, ok := status.FromError(xerr.Cause(err))
 
- 	if !ok {
 
- 		return nil, false
 
- 	}
 
- 	return statusErr, true
 
- }
 
- // FilterServerError 优化服务端错误上报逻辑
 
- func FilterServerError(err error) bool {
 
- 	statusErr, ok := StatusError(err)
 
- 	if !ok {
 
- 		return true
 
- 	}
 
- 	details := statusErr.Details()
 
- 	for _, detail := range details {
 
- 		if _, ok := detail.(*spb.Status); ok && statusErr.Code() != codes.Canceled {
 
- 			return false
 
- 		}
 
- 	}
 
- 	ignoreStatus := []codes.Code{codes.InvalidArgument, codes.Unauthenticated, codes.NotFound, codes.FailedPrecondition, codes.AlreadyExists}
 
- 	if inArray, _ := In(statusErr.Code(), ignoreStatus); inArray {
 
- 		return false
 
- 	}
 
- 	return true
 
- }
 
- func In(obj interface{}, target interface{}) (bool, error) {
 
- 	targetValue := reflect.ValueOf(target)
 
- 	switch reflect.TypeOf(target).Kind() {
 
- 	case reflect.Slice, reflect.Array:
 
- 		for i := 0; i < targetValue.Len(); i++ {
 
- 			if targetValue.Index(i).Interface() == obj {
 
- 				return true, nil
 
- 			}
 
- 		}
 
- 	case reflect.Map:
 
- 		if targetValue.MapIndex(reflect.ValueOf(obj)).IsValid() {
 
- 			return true, nil
 
- 		}
 
- 	}
 
- 	return false, errors.New("not in array")
 
- }
 
 
  |