use request received timestamp in httplog
Kubernetes-commit: 71199664be6d26e435a78566818379ff43110352
This commit is contained in:
parent
6baff345cb
commit
1e7338b1ea
|
@ -765,6 +765,7 @@ func DefaultBuildHandlerChain(apiHandler http.Handler, c *Config) http.Handler {
|
|||
handler = genericapifilters.WithWarningRecorder(handler)
|
||||
handler = genericapifilters.WithCacheControl(handler)
|
||||
handler = genericfilters.WithHSTS(handler, c.HSTSDirectives)
|
||||
handler = genericfilters.WithHTTPLogging(handler)
|
||||
handler = genericapifilters.WithRequestReceivedTimestamp(handler)
|
||||
handler = genericfilters.WithPanicRecovery(handler, c.RequestInfoResolver)
|
||||
return handler
|
||||
|
|
|
@ -59,8 +59,12 @@ func WithPanicRecovery(handler http.Handler, resolver request.RequestInfoResolve
|
|||
})
|
||||
}
|
||||
|
||||
// WithHTTPLogging enables logging of incoming requests.
|
||||
func WithHTTPLogging(handler http.Handler) http.Handler {
|
||||
return httplog.WithLogging(handler, httplog.DefaultStacktracePred)
|
||||
}
|
||||
|
||||
func withPanicRecovery(handler http.Handler, crashHandler func(http.ResponseWriter, *http.Request, interface{})) http.Handler {
|
||||
handler = httplog.WithLogging(handler, httplog.DefaultStacktracePred)
|
||||
return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
|
||||
defer runtime.HandleCrash(func(err interface{}) {
|
||||
crashHandler(w, req, err)
|
||||
|
|
|
@ -25,6 +25,7 @@ import (
|
|||
"runtime"
|
||||
"time"
|
||||
|
||||
"k8s.io/apiserver/pkg/endpoints/request"
|
||||
"k8s.io/klog/v2"
|
||||
)
|
||||
|
||||
|
@ -82,7 +83,13 @@ func WithLogging(handler http.Handler, pred StacktracePred) http.Handler {
|
|||
if old := respLoggerFromContext(req); old != nil {
|
||||
panic("multiple WithLogging calls!")
|
||||
}
|
||||
rl := newLogged(req, w).StacktraceWhen(pred)
|
||||
|
||||
startTime := time.Now()
|
||||
if receivedTimestamp, ok := request.ReceivedTimestampFrom(ctx); ok {
|
||||
startTime = receivedTimestamp
|
||||
}
|
||||
|
||||
rl := newLoggedWithStartTime(req, w, startTime).StacktraceWhen(pred)
|
||||
req = req.WithContext(context.WithValue(ctx, respLoggerContextKey, rl))
|
||||
|
||||
if klog.V(3).Enabled() {
|
||||
|
@ -102,16 +109,20 @@ func respLoggerFromContext(req *http.Request) *respLogger {
|
|||
return nil
|
||||
}
|
||||
|
||||
// newLogged turns a normal response writer into a logged response writer.
|
||||
func newLogged(req *http.Request, w http.ResponseWriter) *respLogger {
|
||||
func newLoggedWithStartTime(req *http.Request, w http.ResponseWriter, startTime time.Time) *respLogger {
|
||||
return &respLogger{
|
||||
startTime: time.Now(),
|
||||
startTime: startTime,
|
||||
req: req,
|
||||
w: w,
|
||||
logStacktracePred: DefaultStacktracePred,
|
||||
}
|
||||
}
|
||||
|
||||
// newLogged turns a normal response writer into a logged response writer.
|
||||
func newLogged(req *http.Request, w http.ResponseWriter) *respLogger {
|
||||
return newLoggedWithStartTime(req, w, time.Now())
|
||||
}
|
||||
|
||||
// LogOf returns the logger hiding in w. If there is not an existing logger
|
||||
// then a passthroughLogger will be created which will log to stdout immediately
|
||||
// when Addf is called.
|
||||
|
|
Loading…
Reference in New Issue