From 4f2d9c548e56c43d30caf3f10bf98e8263a77920 Mon Sep 17 00:00:00 2001 From: withchao <993506633@qq.com> Date: Wed, 11 Jan 2023 19:26:17 +0800 Subject: [PATCH] 1 --- internal/api/group/group.go | 6 +++-- pkg/common/trace_log/ctx.go | 53 ++++++++++++++++++++++++++++++++----- 2 files changed, 51 insertions(+), 8 deletions(-) diff --git a/internal/api/group/group.go b/internal/api/group/group.go index 721035603..41f794818 100644 --- a/internal/api/group/group.go +++ b/internal/api/group/group.go @@ -1260,6 +1260,7 @@ func GetGroupAbstractInfo(c *gin.Context) { req api.GetGroupAbstractInfoReq resp api.GetGroupAbstractInfoResp ) + nCtx := trace_log.NewCtx(c, utils.GetSelfFuncName()) if err := c.BindJSON(&req); err != nil { log.NewError("0", "BindJSON failed ", err.Error()) c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()}) @@ -1289,8 +1290,9 @@ func GetGroupAbstractInfo(c *gin.Context) { }) log.NewInfo(req.OperationID, utils.GetSelfFuncName(), " api args ", respPb.String()) if err != nil { - log.NewError(req.OperationID, utils.GetSelfFuncName(), " failed ", err.Error()) - c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": err.Error()}) + //log.NewError(req.OperationID, utils.GetSelfFuncName(), " failed ", err.Error()) + //c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": err.Error()}) + trace_log.WriteErrorResponse(nCtx, "GetGroupAbstractInfo", utils.Wrap(err, "")) return } resp.ErrMsg = respPb.CommonResp.ErrMsg diff --git a/pkg/common/trace_log/ctx.go b/pkg/common/trace_log/ctx.go index 6a26ed63d..d3071997b 100644 --- a/pkg/common/trace_log/ctx.go +++ b/pkg/common/trace_log/ctx.go @@ -4,7 +4,10 @@ import ( "Open_IM/pkg/common/constant" "Open_IM/pkg/common/log" "context" - "errors" + "google.golang.org/grpc/status" + "strings" + + //"errors" "fmt" "github.com/gin-gonic/gin" "net/http" @@ -51,17 +54,55 @@ func ShowLog(ctx context.Context) { func WriteErrorResponse(ctx context.Context, funcName string, err error, args ...interface{}) { SetContextInfo(ctx, funcName, err, args) - e := new(constant.ErrInfo) - switch { - case errors.As(err, &e): - ctx.Value(TraceLogKey).(*ApiInfo).GinCtx.JSON(http.StatusOK, gin.H{"errCode": e.ErrCode, "errMsg": e.ErrMsg}) + e := Unwrap(err) + switch t := e.(type) { + case *constant.ErrInfo: + ctx.Value(TraceLogKey).(*ApiInfo).GinCtx.JSON(http.StatusOK, gin.H{"errCode": t.ErrCode, "errMsg": t.ErrMsg, "errDtl": t.DetailErrMsg}) return default: - ctx.Value(TraceLogKey).(*ApiInfo).GinCtx.JSON(http.StatusOK, gin.H{"errCode": constant.ErrDefaultOther.ErrCode, "errMsg": constant.ErrDefaultOther.ErrMsg}) + s, ok := status.FromError(err) + if !ok { + ctx.Value(TraceLogKey).(*ApiInfo).GinCtx.JSON(http.StatusOK, gin.H{"errCode": constant.ErrDefaultOther.ErrCode, "errMsg": err.Error(), "errDtl": fmt.Sprintf("%+v", err)}) + return + } + var details []string + if err != e { + details = append(details, fmt.Sprintf("%+v", err)) + } + for _, s := range s.Details() { + details = append(details, fmt.Sprintf("%+v", s)) + } + ctx.Value(TraceLogKey).(*ApiInfo).GinCtx.JSON(http.StatusOK, gin.H{"errCode": s.Code(), "errMsg": s.String(), "errDtl": strings.Join(details, "\n")}) return } } +//func WriteErrorResponse(ctx context.Context, funcName string, err error, args ...interface{}) { +// SetContextInfo(ctx, funcName, err, args) +// e := new(constant.ErrInfo) +// switch { +// case errors.As(err, &e): +// ctx.Value(TraceLogKey).(*ApiInfo).GinCtx.JSON(http.StatusOK, gin.H{"errCode": e.ErrCode, "errMsg": e.ErrMsg}) +// return +// default: +// ctx.Value(TraceLogKey).(*ApiInfo).GinCtx.JSON(http.StatusOK, gin.H{"errCode": constant.ErrDefaultOther.ErrCode, "errMsg": constant.ErrDefaultOther.ErrMsg, "errDtl": err.Error()}) +// return +// } +//} + +func Unwrap(err error) error { + for err != nil { + unwrap, ok := err.(interface { + Unwrap() error + }) + if !ok { + break + } + err = unwrap.Unwrap() + } + return err +} + type ApiInfo struct { ApiName string OperationID string