提交 971a8238 authored 作者: mooncake9527's avatar mooncake9527

request cost

上级 f17fbc21
......@@ -3,6 +3,9 @@ package ctxUtils
import (
"context"
"errors"
"fmt"
"strings"
"time"
xsf "gitlab.wanzhuangkj.com/tush/xpkg/utils/xsf"
......@@ -235,3 +238,28 @@ func SetVal(ctx context.Context, key string, val interface{}) context.Context {
}
return context.WithValue(ctx, key, val)
}
func AddApiCost(c *gin.Context, appName string, start time.Time) {
cost := c.Writer.Header().Get(KeyCost)
currentCost := fmt.Sprintf("%s:%d", appName, time.Since(start).Milliseconds())
if cost == "" {
cost = currentCost
} else {
cost = fmt.Sprintf("%s,%s", cost, currentCost)
}
c.Writer.Header().Set(KeyCost, cost)
}
func SetApiCost(ctx context.Context, header map[string][]string) {
if ginCtx, _ := GetGinCtx(ctx); ginCtx != nil && len(header) > 0 {
cost := ""
for k, v := range header {
if k == KeyCost {
cost = strings.Join(v, ",")
}
}
if cost != "" {
ginCtx.Writer.Header().Set(KeyCost, cost)
}
}
}
......@@ -2,13 +2,12 @@ package middleware
import (
"bytes"
"fmt"
"gitlab.wanzhuangkj.com/tush/xpkg/gin/entity"
"io"
"net/http"
"time"
ctxUtil "gitlab.wanzhuangkj.com/tush/xpkg/gin/ctxUtils"
ctxUtils "gitlab.wanzhuangkj.com/tush/xpkg/gin/ctxUtils"
"gitlab.wanzhuangkj.com/tush/xpkg/ips"
"github.com/gin-gonic/gin"
......@@ -196,37 +195,37 @@ func Logging(opts ...Option) gin.HandlerFunc {
copyHttpReq.URL = c.Request.URL.String()
copyHttpReq.Headers = c.Request.Header
copyHttpReq.Body = buf.String()
c.Set(ctxUtil.KeyReqBody, copyHttpReq)
c.Set(ctxUtils.KeyReqBody, copyHttpReq)
reqID := ""
if o.traceIDFrom == 1 {
if v, isExist := c.Get(ctxUtil.ContextTraceIDKey); isExist {
if v, isExist := c.Get(ctxUtils.ContextTraceIDKey); isExist {
if requestID, ok := v.(string); ok {
reqID = requestID
fields = append(fields, zap.String(ctxUtil.ContextTraceIDKey, reqID))
fields = append(fields, zap.String(ctxUtils.ContextTraceIDKey, reqID))
}
}
} else if o.traceIDFrom == 2 {
reqID = c.Request.Header.Get(ctxUtil.HeaderXRequestIDKey)
fields = append(fields, zap.String(ctxUtil.ContextTraceIDKey, reqID))
reqID = c.Request.Header.Get(ctxUtils.HeaderXRequestIDKey)
fields = append(fields, zap.String(ctxUtils.ContextTraceIDKey, reqID))
}
o.log.Info("<<<<<<<<<req", fields...)
c.Request.Body = io.NopCloser(&buf)
// replace writer
//replace writer
newWriter := &bodyLogWriter{body: &bytes.Buffer{}, ResponseWriter: c.Writer}
c.Writer = newWriter
ip := ips.GetClientIP(c)
c.Set(ctxUtil.KeyClientIP, ip)
c.Set(ctxUtils.KeyClientIP, ip)
// processing requests
c.Next()
c.Writer.Header().Add(ctxUtil.KeyCost, fmt.Sprintf("%s-%d", o.appName, time.Since(start).Milliseconds()))
ctxUtils.AddApiCost(c.Writer, o.appName, start)
// print return message after processing
//print return message after processing
fields = []zap.Field{
zap.Int("code", c.Writer.Status()),
zap.String("method", c.Request.Method),
......@@ -238,15 +237,16 @@ func Logging(opts ...Option) gin.HandlerFunc {
zap.ByteString("body", getResponseBody(newWriter.body, o.maxLength)),
}
if reqID != "" {
fields = append(fields, zap.String(ctxUtil.ContextTraceIDKey, reqID))
fields = append(fields, zap.String(ctxUtils.ContextTraceIDKey, reqID))
}
o.log.Info(">>>>>>>>>rsp", fields...)
}
}
func GetCopyReq(c *gin.Context) *entity.CopyHttpReq {
if val, isExist := c.Get(ctxUtil.KeyReqBody); isExist {
if val, isExist := c.Get(ctxUtils.KeyReqBody); isExist {
if req, ok := val.(*entity.CopyHttpReq); ok {
return req
}
......@@ -255,7 +255,7 @@ func GetCopyReq(c *gin.Context) *entity.CopyHttpReq {
}
func GetCopyRsp(c *gin.Context) *entity.CopyHttpRsp {
if val, isExist := c.Get(ctxUtil.KeyRspBody); isExist {
if val, isExist := c.Get(ctxUtils.KeyRspBody); isExist {
if rsp, ok := val.(*entity.CopyHttpRsp); ok {
return rsp
}
......@@ -279,13 +279,13 @@ func SimpleLog(opts ...Option) gin.HandlerFunc {
reqID := ""
if o.traceIDFrom == 1 {
if v, isExist := c.Get(ctxUtil.ContextTraceIDKey); isExist {
if v, isExist := c.Get(ctxUtils.ContextTraceIDKey); isExist {
if requestID, ok := v.(string); ok {
reqID = requestID
}
}
} else if o.traceIDFrom == 2 {
reqID = c.Request.Header.Get(ctxUtil.HeaderXRequestIDKey)
reqID = c.Request.Header.Get(ctxUtils.HeaderXRequestIDKey)
}
// processing requests
......@@ -300,7 +300,7 @@ func SimpleLog(opts ...Option) gin.HandlerFunc {
zap.Int("size", c.Writer.Size()),
}
if reqID != "" {
fields = append(fields, zap.String(ctxUtil.ContextTraceIDKey, reqID))
fields = append(fields, zap.String(ctxUtils.ContextTraceIDKey, reqID))
}
o.log.Info("Gin msg", fields...)
}
......
......@@ -123,7 +123,7 @@ func StreamServerRequestID() grpc.StreamServerInterceptor {
//ctx := stream.Context()
//requestID := ServerCtxRequestID(ctx)
//if requestID == "" {
// requestID = ctxUtil.GenerateTid()
// requestID = ctxUtils.GenerateTid()
// ctx = grpc_metadata.ExtractIncoming(ctx).Add(ContextRequestIDKey, requestID).ToIncoming(ctx)
//}
return handler(srv, stream)
......
......@@ -313,8 +313,9 @@ func (req *Request) send(ctx context.Context, body io.Reader, buf *bytes.Buffer)
req.timeout = defaultTimeout
}
client := http.Client{Timeout: req.timeout}
resp := new(Response)
resp.Header = make(http.Header)
resp := &Response{
Header: make(http.Header),
}
ctx, cancel := context.WithTimeout(ctx, time.Second*20)
defer cancel()
var err error
......@@ -329,7 +330,7 @@ func (req *Request) send(ctx context.Context, body io.Reader, buf *bytes.Buffer)
resp.Status = response.Status
resp.StatusCode = response.StatusCode
for k, v := range response.Header {
resp.Header[k] = v
resp.Header[k] = append(resp.Header[k], v...)
}
defer response.Body.Close()
body, err := io.ReadAll(response.Body)
......@@ -357,7 +358,7 @@ func (req *Request) send(ctx context.Context, body io.Reader, buf *bytes.Buffer)
resp.Status = response.Status
resp.StatusCode = response.StatusCode
for k, v := range response.Header {
resp.Header[k] = v
resp.Header[k] = append(resp.Header[k], v...)
}
resp.err = err
}
......@@ -367,7 +368,7 @@ func (req *Request) send(ctx context.Context, body io.Reader, buf *bytes.Buffer)
resp.Status = response.Status
resp.StatusCode = response.StatusCode
for k, v := range response.Header {
resp.Header[k] = v
resp.Header[k] = append(resp.Header[k], v...)
}
defer response.Body.Close()
body, e := io.ReadAll(response.Body)
......@@ -387,14 +388,7 @@ func (req *Request) send(ctx context.Context, body io.Reader, buf *bytes.Buffer)
logger.Error("httpCli fail", logger.Any("err", err), ctxUtils.CtxTraceIDField(ctx))
}
if resp != nil {
if resp.Header != nil {
ginCtx, _ := ctxUtils.GetGinCtx(ctx)
if ginCtx != nil {
ginCtx.Writer.Header().Add(ctxUtils.KeyCost, resp.Header.Get(ctxUtils.KeyCost))
}
}
}
ctxUtils.SetApiCost(ctx, resp.Header)
req.response = resp
req.err = err
......
package ctxUtils
//
//func AddApiCost(c *gin.Context, appName string, start time.Time) {
// cost := c.Writer.Header().Get(ctxUtil.KeyCost)
// cost += fmt.Sprintf("%s:%d", appName, time.Since(start).Milliseconds())
// c.Writer.Header().Set(ctxUtil.KeyCost, cost)
//}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论