MCPcopy
hub / github.com/cubefs/cubefs / traceMiddleware

Method traceMiddleware

objectnode/api_middleware.go:78–158  ·  view source on GitHub ↗

TraceMiddleware returns a middleware handler to trace request. After receiving the request, the handler will assign a unique RequestID to the request and record the processing time of the request.

(next http.Handler)

Source from the content-addressed store, hash-verified

76// After receiving the request, the handler will assign a unique RequestID to
77// the request and record the processing time of the request.
78func (o *ObjectNode) traceMiddleware(next http.Handler) http.Handler {
79 generateRequestID := func() (string, error) {
80 var uUID uuid.UUID
81 var err error
82 if uUID, err = uuid.NewRandom(); err != nil {
83 return "", err
84 }
85 return strings.ReplaceAll(uUID.String(), "-", ""), nil
86 }
87 var handlerFunc http.HandlerFunc = func(w http.ResponseWriter, r *http.Request) {
88 // wrapper for w to record its stats
89 w = NewResponseStater(w)
90 defer func() {
91 p := ParseRequestParam(r)
92 extraHeader := auditlog.ExtraHeader(w)
93 extraHeader.Set("Tbl", p.Bucket())
94 extraHeader.Set("Api", p.API())
95 extraHeader.Set("Owner", p.Owner())
96 extraHeader.Set("Requester", p.Requester())
97 if o.externalAudit != nil {
98 o.externalAudit.Logger(w, r)
99 }
100 }()
101
102 requestID, err := generateRequestID()
103 if err != nil {
104 log.LogErrorf("traceMiddleware: generate request ID fail, remote(%v) url(%v) err(%v)",
105 r.RemoteAddr, r.URL.String(), err)
106 InternalErrorCode(err).ServeResponse(w, r)
107 // export ump warn info
108 exporter.Warning(generateWarnDetail(r, err.Error()))
109 return
110 }
111
112 // store request ID to context and write to header
113 SetRequestID(r, requestID)
114 w.Header().Set(XAmzRequestId, requestID)
115 w.Header().Set(Server, ValueServer)
116
117 if connHeader := r.Header.Get(Connection); strings.EqualFold(connHeader, "close") {
118 w.Header().Set(Connection, "close")
119 } else {
120 w.Header().Set(Connection, "keep-alive")
121 }
122
123 action := ActionFromRouteName(mux.CurrentRoute(r).GetName())
124 SetRequestAction(r, action)
125
126 startTime := time.Now()
127 metric := exporter.NewTPCnt(fmt.Sprintf("action_%v", action.Name()))
128 defer func() {
129 metric.Set(err)
130 }()
131
132 // Check action is whether enabled.
133 if !action.IsNone() && !o.disabledActions.Contains(action) {
134 log.LogInfof("traceMiddleware: start with "+
135 "action(%v) requestID(%v) host(%v) method(%v) url(%v) header(%+v) remote(%v)",

Callers

nothing calls this directly

Calls 15

ExtraHeaderFunction · 0.92
LogErrorfFunction · 0.92
WarningFunction · 0.92
NewTPCntFunction · 0.92
LogInfofFunction · 0.92
LogDebugfFunction · 0.92
NewResponseStaterFunction · 0.85
ParseRequestParamFunction · 0.85
InternalErrorCodeFunction · 0.85
generateWarnDetailFunction · 0.85
SetRequestIDFunction · 0.85
ActionFromRouteNameFunction · 0.85

Tested by

no test coverage detected