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)
| 76 | // After receiving the request, the handler will assign a unique RequestID to |
| 77 | // the request and record the processing time of the request. |
| 78 | func (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)", |
nothing calls this directly
no test coverage detected