proxy: add support for logging http request headers

This commit is contained in:
Caleb Doxsey 2023-07-24 12:55:34 -06:00
parent 86a2fc6807
commit 4d7140a8a2
3 changed files with 45 additions and 1 deletions

View file

@ -1,6 +1,7 @@
package controlplane
import (
"net/http"
"strings"
envoy_data_accesslog_v3 "github.com/envoyproxy/go-control-plane/envoy/data/accesslog/v3"
@ -24,6 +25,7 @@ func (srv *Server) StreamAccessLogs(stream envoy_service_accesslog_v3.AccessLogS
}
for _, entry := range msg.GetHttpLogs().LogEntry {
requestHeaders := getRequestHeaders(entry)
reqPath := entry.GetRequest().GetPath()
var evt *zerolog.Event
if reqPath == "/ping" || reqPath == "/healthz" {
@ -33,7 +35,7 @@ func (srv *Server) StreamAccessLogs(stream envoy_service_accesslog_v3.AccessLogS
}
evt = evt.Str("service", "envoy")
for _, field := range srv.currentConfig.Load().Config.Options.GetAccessLogFields() {
evt = populateLogEvent(field, evt, entry)
evt = populateLogEvent(field, evt, entry, requestHeaders)
}
evt.Msg("http-request")
}
@ -44,7 +46,12 @@ func populateLogEvent(
field log.AccessLogField,
evt *zerolog.Event,
entry *envoy_data_accesslog_v3.HTTPAccessLogEntry,
requestHeaders map[string]string,
) *zerolog.Event {
if headerName, ok := field.IsForHeader(); ok {
return evt.Str("header."+headerName, requestHeaders[http.CanonicalHeaderKey(headerName)])
}
switch field {
case log.AccessLogFieldAuthority:
return evt.Str(string(field), entry.GetRequest().GetAuthority())
@ -76,6 +83,14 @@ func populateLogEvent(
}
}
func getRequestHeaders(entry *envoy_data_accesslog_v3.HTTPAccessLogEntry) map[string]string {
m := map[string]string{}
for k, v := range entry.GetRequest().GetRequestHeaders() {
m[http.CanonicalHeaderKey(k)] = v
}
return m
}
func stripQueryString(str string) string {
if idx := strings.Index(str, "?"); idx != -1 {
str = str[:idx]