go.mod: Bump k8s deps to v0.24.0
This ends up bumping the prometheus client as well. Signed-off-by: Daniel Canter <dcanter@microsoft.com>
This commit is contained in:
100
vendor/k8s.io/apiserver/pkg/server/httplog/httplog.go
generated
vendored
100
vendor/k8s.io/apiserver/pkg/server/httplog/httplog.go
generated
vendored
@@ -29,12 +29,16 @@ import (
|
||||
|
||||
"k8s.io/apiserver/pkg/endpoints/metrics"
|
||||
"k8s.io/apiserver/pkg/endpoints/request"
|
||||
"k8s.io/apiserver/pkg/endpoints/responsewriter"
|
||||
"k8s.io/klog/v2"
|
||||
)
|
||||
|
||||
// StacktracePred returns true if a stacktrace should be logged for this status.
|
||||
type StacktracePred func(httpStatus int) (logStacktrace bool)
|
||||
|
||||
// ShouldLogRequestPred returns true if logging should be enabled for this request
|
||||
type ShouldLogRequestPred func() bool
|
||||
|
||||
type logger interface {
|
||||
Addf(format string, data ...interface{})
|
||||
}
|
||||
@@ -55,11 +59,12 @@ type respLogger struct {
|
||||
statusRecorded bool
|
||||
status int
|
||||
statusStack string
|
||||
// mutex is used when accessing addedInfo
|
||||
// It can be modified by other goroutine when logging happens (in case of request timeout)
|
||||
mutex sync.Mutex
|
||||
addedInfo strings.Builder
|
||||
startTime time.Time
|
||||
// mutex is used when accessing addedInfo and addedKeyValuePairs.
|
||||
// They can be modified by other goroutine when logging happens (in case of request timeout)
|
||||
mutex sync.Mutex
|
||||
addedInfo strings.Builder
|
||||
addedKeyValuePairs []interface{}
|
||||
startTime time.Time
|
||||
|
||||
captureErrorOutput bool
|
||||
|
||||
@@ -70,12 +75,16 @@ type respLogger struct {
|
||||
logStacktracePred StacktracePred
|
||||
}
|
||||
|
||||
var _ http.ResponseWriter = &respLogger{}
|
||||
var _ responsewriter.UserProvidedDecorator = &respLogger{}
|
||||
|
||||
func (rl *respLogger) Unwrap() http.ResponseWriter {
|
||||
return rl.w
|
||||
}
|
||||
|
||||
// Simple logger that logs immediately when Addf is called
|
||||
type passthroughLogger struct{}
|
||||
|
||||
//lint:ignore SA1019 Interface implementation check to make sure we don't drop CloseNotifier again
|
||||
var _ http.CloseNotifier = &respLogger{}
|
||||
|
||||
// Addf logs info immediately.
|
||||
func (passthroughLogger) Addf(format string, data ...interface{}) {
|
||||
klog.V(2).Info(fmt.Sprintf(format, data...))
|
||||
@@ -86,9 +95,22 @@ func DefaultStacktracePred(status int) bool {
|
||||
return (status < http.StatusOK || status >= http.StatusInternalServerError) && status != http.StatusSwitchingProtocols
|
||||
}
|
||||
|
||||
const withLoggingLevel = 3
|
||||
|
||||
// WithLogging wraps the handler with logging.
|
||||
func WithLogging(handler http.Handler, pred StacktracePred) http.Handler {
|
||||
return withLogging(handler, pred, func() bool {
|
||||
return klog.V(withLoggingLevel).Enabled()
|
||||
})
|
||||
}
|
||||
|
||||
func withLogging(handler http.Handler, stackTracePred StacktracePred, shouldLogRequest ShouldLogRequestPred) http.Handler {
|
||||
return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
|
||||
if !shouldLogRequest() {
|
||||
handler.ServeHTTP(w, req)
|
||||
return
|
||||
}
|
||||
|
||||
ctx := req.Context()
|
||||
if old := respLoggerFromRequest(req); old != nil {
|
||||
panic("multiple WithLogging calls!")
|
||||
@@ -99,13 +121,13 @@ func WithLogging(handler http.Handler, pred StacktracePred) http.Handler {
|
||||
startTime = receivedTimestamp
|
||||
}
|
||||
|
||||
rl := newLoggedWithStartTime(req, w, startTime).StacktraceWhen(pred)
|
||||
rl := newLoggedWithStartTime(req, w, startTime)
|
||||
rl.StacktraceWhen(stackTracePred)
|
||||
req = req.WithContext(context.WithValue(ctx, respLoggerContextKey, rl))
|
||||
defer rl.Log()
|
||||
|
||||
if klog.V(3).Enabled() {
|
||||
defer rl.Log()
|
||||
}
|
||||
handler.ServeHTTP(rl, req)
|
||||
w = responsewriter.WrapForHTTP1Or2(rl)
|
||||
handler.ServeHTTP(w, req)
|
||||
})
|
||||
}
|
||||
|
||||
@@ -123,13 +145,14 @@ func respLoggerFromRequest(req *http.Request) *respLogger {
|
||||
}
|
||||
|
||||
func newLoggedWithStartTime(req *http.Request, w http.ResponseWriter, startTime time.Time) *respLogger {
|
||||
return &respLogger{
|
||||
logger := &respLogger{
|
||||
startTime: startTime,
|
||||
req: req,
|
||||
userAgent: req.UserAgent(),
|
||||
w: w,
|
||||
logStacktracePred: DefaultStacktracePred,
|
||||
}
|
||||
return logger
|
||||
}
|
||||
|
||||
// newLogged turns a normal response writer into a logged response writer.
|
||||
@@ -189,6 +212,30 @@ func AddInfof(ctx context.Context, format string, data ...interface{}) {
|
||||
}
|
||||
}
|
||||
|
||||
func (rl *respLogger) AddKeyValue(key string, value interface{}) {
|
||||
rl.mutex.Lock()
|
||||
defer rl.mutex.Unlock()
|
||||
rl.addedKeyValuePairs = append(rl.addedKeyValuePairs, key, value)
|
||||
}
|
||||
|
||||
// AddKeyValue adds a (key, value) pair to the httplog associated
|
||||
// with the request.
|
||||
// Use this function if you want your data to show up in httplog
|
||||
// in a more structured and readable way.
|
||||
func AddKeyValue(ctx context.Context, key string, value interface{}) {
|
||||
if rl := respLoggerFromContext(ctx); rl != nil {
|
||||
rl.AddKeyValue(key, value)
|
||||
}
|
||||
}
|
||||
|
||||
// SetStacktracePredicate sets a custom stacktrace predicate for the
|
||||
// logger associated with the given request context.
|
||||
func SetStacktracePredicate(ctx context.Context, pred StacktracePred) {
|
||||
if rl := respLoggerFromContext(ctx); rl != nil {
|
||||
rl.StacktraceWhen(pred)
|
||||
}
|
||||
}
|
||||
|
||||
// Log is intended to be called once at the end of your request handler, via defer
|
||||
func (rl *respLogger) Log() {
|
||||
latency := time.Since(rl.startTime)
|
||||
@@ -217,9 +264,10 @@ func (rl *respLogger) Log() {
|
||||
"audit-ID", auditID,
|
||||
"srcIP", rl.req.RemoteAddr,
|
||||
}
|
||||
// Lock for accessing addedInfo
|
||||
// Lock for accessing addedKeyValuePairs and addedInfo
|
||||
rl.mutex.Lock()
|
||||
defer rl.mutex.Unlock()
|
||||
keysAndValues = append(keysAndValues, rl.addedKeyValuePairs...)
|
||||
|
||||
if rl.hijacked {
|
||||
keysAndValues = append(keysAndValues, "hijacked", true)
|
||||
@@ -234,7 +282,7 @@ func (rl *respLogger) Log() {
|
||||
}
|
||||
}
|
||||
|
||||
klog.InfoSDepth(1, "HTTP", keysAndValues...)
|
||||
klog.V(withLoggingLevel).InfoSDepth(1, "HTTP", keysAndValues...)
|
||||
}
|
||||
|
||||
// Header implements http.ResponseWriter.
|
||||
@@ -253,32 +301,18 @@ func (rl *respLogger) Write(b []byte) (int, error) {
|
||||
return rl.w.Write(b)
|
||||
}
|
||||
|
||||
// Flush implements http.Flusher even if the underlying http.Writer doesn't implement it.
|
||||
// Flush is used for streaming purposes and allows to flush buffered data to the client.
|
||||
func (rl *respLogger) Flush() {
|
||||
if flusher, ok := rl.w.(http.Flusher); ok {
|
||||
flusher.Flush()
|
||||
} else if klog.V(2).Enabled() {
|
||||
klog.InfoDepth(1, fmt.Sprintf("Unable to convert %+v into http.Flusher", rl.w))
|
||||
}
|
||||
}
|
||||
|
||||
// WriteHeader implements http.ResponseWriter.
|
||||
func (rl *respLogger) WriteHeader(status int) {
|
||||
rl.recordStatus(status)
|
||||
rl.w.WriteHeader(status)
|
||||
}
|
||||
|
||||
// Hijack implements http.Hijacker.
|
||||
func (rl *respLogger) Hijack() (net.Conn, *bufio.ReadWriter, error) {
|
||||
rl.hijacked = true
|
||||
return rl.w.(http.Hijacker).Hijack()
|
||||
}
|
||||
|
||||
// CloseNotify implements http.CloseNotifier
|
||||
func (rl *respLogger) CloseNotify() <-chan bool {
|
||||
//lint:ignore SA1019 There are places in the code base requiring the CloseNotifier interface to be implemented.
|
||||
return rl.w.(http.CloseNotifier).CloseNotify()
|
||||
// the outer ResponseWriter object returned by WrapForHTTP1Or2 implements
|
||||
// http.Hijacker if the inner object (rl.w) implements http.Hijacker.
|
||||
return rl.w.(http.Hijacker).Hijack()
|
||||
}
|
||||
|
||||
func (rl *respLogger) recordStatus(status int) {
|
||||
|
||||
Reference in New Issue
Block a user