From 97ddeed32b0155e97755cf021f5ca71dc68c14e2 Mon Sep 17 00:00:00 2001 From: Purvi Kanal Date: Thu, 17 Aug 2023 13:36:52 -0400 Subject: [PATCH] feat: send request/response body size (#80) ## Which problem is this PR solving? - Closes #77 ## Short description of the changes - Use `Content-Length` header to send request / response body size ## How to verify that this has the expected result Screenshot 2023-08-17 at 9 50 12 AM --- main.go | 27 +++++++++------------------ 1 file changed, 9 insertions(+), 18 deletions(-) diff --git a/main.go b/main.go index 13eb4502..e4f4b233 100644 --- a/main.go +++ b/main.go @@ -2,9 +2,9 @@ package main import ( "fmt" - "io" "os" "os/signal" + "strconv" "syscall" "github.com/honeycombio/ebpf-agent/assemblers" @@ -121,12 +121,15 @@ func handleHttpEvents(events chan assemblers.HttpEvent, client *kubernetes.Clien // request attributes if event.Request != nil { + bodySizeString := event.Request.Header.Get("Content-Length") + bodySize, _ := strconv.ParseInt(bodySizeString, 10, 64) ev.AddField("name", fmt.Sprintf("HTTP %s", event.Request.Method)) ev.AddField(string(semconv.HTTPMethodKey), event.Request.Method) ev.AddField(string(semconv.HTTPURLKey), event.Request.RequestURI) ev.AddField("http.request.body", fmt.Sprintf("%v", event.Request.Body)) ev.AddField("http.request.headers", fmt.Sprintf("%v", event.Request.Header)) ev.AddField(string(semconv.UserAgentOriginalKey), event.Request.Header.Get("User-Agent")) + ev.AddField("http.request.body.size", bodySize) } else { ev.AddField("name", "HTTP") ev.AddField("http.request.missing", "no request on this event") @@ -134,9 +137,14 @@ func handleHttpEvents(events chan assemblers.HttpEvent, client *kubernetes.Clien // response attributes if event.Response != nil { + bodySizeString := event.Response.Header.Get("Content-Length") + bodySize, _ := strconv.ParseInt(bodySizeString, 10, 64) + ev.AddField(string(semconv.HTTPStatusCodeKey), event.Response.StatusCode) ev.AddField("http.response.body", event.Response.Body) ev.AddField("http.response.headers", event.Response.Header) + ev.AddField("http.response.body.size", bodySize) + } else { ev.AddField("http.response.missing", "no response on this event") } @@ -145,12 +153,6 @@ func handleHttpEvents(events chan assemblers.HttpEvent, client *kubernetes.Clien k8sEventAttrs := utils.GetK8sEventAttrs(client, event.SrcIp, event.DstIp) ev.Add(k8sEventAttrs) - //TODO: Body size produces a runtime error, commenting out for now. - // requestSize := getBodySize(event.request.Body) - // ev.AddField("http.request.body.size", requestSize) - // responseSize := getBodySize(event.response.Body) - // ev.AddField("http.response.body.size", responseSize) - err := ev.Send() if err != nil { log.Debug(). @@ -161,17 +163,6 @@ func handleHttpEvents(events chan assemblers.HttpEvent, client *kubernetes.Clien } } -func getBodySize(r io.ReadCloser) int { - length := 0 - b, err := io.ReadAll(r) - if err == nil { - length = len(b) - r.Close() - } - - return length -} - func getEnvOrDefault(key string, defaultValue string) string { if value, ok := os.LookupEnv(key); ok { return value