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.WithWarningRecorder(handler)
|
||||||
handler = genericapifilters.WithCacheControl(handler)
|
handler = genericapifilters.WithCacheControl(handler)
|
||||||
handler = genericfilters.WithHSTS(handler, c.HSTSDirectives)
|
handler = genericfilters.WithHSTS(handler, c.HSTSDirectives)
|
||||||
|
handler = genericfilters.WithHTTPLogging(handler)
|
||||||
handler = genericapifilters.WithRequestReceivedTimestamp(handler)
|
handler = genericapifilters.WithRequestReceivedTimestamp(handler)
|
||||||
handler = genericfilters.WithPanicRecovery(handler, c.RequestInfoResolver)
|
handler = genericfilters.WithPanicRecovery(handler, c.RequestInfoResolver)
|
||||||
return handler
|
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 {
|
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) {
|
return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
|
||||||
defer runtime.HandleCrash(func(err interface{}) {
|
defer runtime.HandleCrash(func(err interface{}) {
|
||||||
crashHandler(w, req, err)
|
crashHandler(w, req, err)
|
||||||
|
|
|
@ -25,6 +25,7 @@ import (
|
||||||
"runtime"
|
"runtime"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"k8s.io/apiserver/pkg/endpoints/request"
|
||||||
"k8s.io/klog/v2"
|
"k8s.io/klog/v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -82,7 +83,13 @@ func WithLogging(handler http.Handler, pred StacktracePred) http.Handler {
|
||||||
if old := respLoggerFromContext(req); old != nil {
|
if old := respLoggerFromContext(req); old != nil {
|
||||||
panic("multiple WithLogging calls!")
|
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))
|
req = req.WithContext(context.WithValue(ctx, respLoggerContextKey, rl))
|
||||||
|
|
||||||
if klog.V(3).Enabled() {
|
if klog.V(3).Enabled() {
|
||||||
|
@ -102,16 +109,20 @@ func respLoggerFromContext(req *http.Request) *respLogger {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// newLogged turns a normal response writer into a logged response writer.
|
func newLoggedWithStartTime(req *http.Request, w http.ResponseWriter, startTime time.Time) *respLogger {
|
||||||
func newLogged(req *http.Request, w http.ResponseWriter) *respLogger {
|
|
||||||
return &respLogger{
|
return &respLogger{
|
||||||
startTime: time.Now(),
|
startTime: startTime,
|
||||||
req: req,
|
req: req,
|
||||||
w: w,
|
w: w,
|
||||||
logStacktracePred: DefaultStacktracePred,
|
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
|
// 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
|
// then a passthroughLogger will be created which will log to stdout immediately
|
||||||
// when Addf is called.
|
// when Addf is called.
|
||||||
|
|
Loading…
Reference in New Issue