Merge pull request #104465 from tkashem/httplogger-structured

apiserver: add key/value pair to httplog
This commit is contained in:
Kubernetes Prow Robot 2021-08-23 11:48:34 -07:00 committed by GitHub
commit 4a6792dd10
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 24 additions and 7 deletions

View File

@ -18,6 +18,7 @@ package filterlatency
import ( import (
"context" "context"
"fmt"
"net/http" "net/http"
"time" "time"
@ -64,7 +65,7 @@ func TrackCompleted(handler http.Handler) http.Handler {
latency := completedAt.Sub(fr.startedTimestamp) latency := completedAt.Sub(fr.startedTimestamp)
metrics.RecordFilterLatency(ctx, fr.name, latency) metrics.RecordFilterLatency(ctx, fr.name, latency)
if klog.V(3).Enabled() && latency > minFilterLatencyToLog { if klog.V(3).Enabled() && latency > minFilterLatencyToLog {
httplog.AddInfof(ctx, "%s=%s", fr.name, latency.String()) httplog.AddKeyValue(ctx, fmt.Sprintf("fl_%s", fr.name), latency.String())
} }
}) })
} }

View File

@ -50,12 +50,13 @@ const respLoggerContextKey respLoggerContextKeyType = iota
// the http.ResponseWriter. We can recover panics from go-restful, and // the http.ResponseWriter. We can recover panics from go-restful, and
// the logging value is questionable. // the logging value is questionable.
type respLogger struct { type respLogger struct {
hijacked bool hijacked bool
statusRecorded bool statusRecorded bool
status int status int
statusStack string statusStack string
addedInfo strings.Builder addedInfo strings.Builder
startTime time.Time addedKeyValuePairs []interface{}
startTime time.Time
captureErrorOutput bool captureErrorOutput bool
@ -181,6 +182,20 @@ func AddInfof(ctx context.Context, format string, data ...interface{}) {
} }
} }
func (rl *respLogger) AddKeyValue(key string, value interface{}) {
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)
}
}
// Log is intended to be called once at the end of your request handler, via defer // Log is intended to be called once at the end of your request handler, via defer
func (rl *respLogger) Log() { func (rl *respLogger) Log() {
latency := time.Since(rl.startTime) latency := time.Since(rl.startTime)
@ -204,6 +219,7 @@ func (rl *respLogger) Log() {
"audit-ID", auditID, "audit-ID", auditID,
"srcIP", rl.req.RemoteAddr, "srcIP", rl.req.RemoteAddr,
} }
keysAndValues = append(keysAndValues, rl.addedKeyValuePairs...)
if rl.hijacked { if rl.hijacked {
keysAndValues = append(keysAndValues, "hijacked", true) keysAndValues = append(keysAndValues, "hijacked", true)