12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- package grpcutil
- import (
- "errors"
- "reflect"
- "kpt-grpc-demo/util/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")
- }
|