From ae86b1c261f6332a8d07458803c47ab7010a1d6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maximilian=20Pa=C3=9F?= <22845248+mpass99@users.noreply.github.com> Date: Fri, 26 Jan 2024 22:38:52 +0100 Subject: [PATCH] Debug HTTPLoggingMiddleware latency. --- pkg/logging/logging.go | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/pkg/logging/logging.go b/pkg/logging/logging.go index 821b664..4b26d58 100644 --- a/pkg/logging/logging.go +++ b/pkg/logging/logging.go @@ -2,13 +2,16 @@ package logging import ( "bufio" + "context" "fmt" + "github.com/coreos/go-systemd/v22/daemon" "github.com/getsentry/sentry-go" "github.com/openHPI/poseidon/pkg/dto" "github.com/sirupsen/logrus" "net" "net/http" "os" + "runtime/pprof" "strings" "time" ) @@ -82,6 +85,12 @@ func HTTPLoggingMiddleware(next http.Handler) http.Handler { start := time.Now().UTC() path := RemoveNewlineSymbol(r.URL.Path) + if path == "/api/v1/health" { + ctx, cancel := context.WithCancel(r.Context()) + defer cancel() + go debugGoroutines(ctx) + } + lrw := NewLoggingResponseWriter(w) next.ServeHTTP(lrw, r) @@ -107,3 +116,24 @@ func RemoveNewlineSymbol(data string) string { data = strings.ReplaceAll(data, "\n", "") return data } + +// debugGoroutines temporarily debugs a behavior where we observe long latencies in the Health route. +func debugGoroutines(ctx context.Context) { + interval, err := daemon.SdWatchdogEnabled(false) + if err != nil || interval == 0 { + return + } + log.Trace("Starting timeout for debugging the Goroutines") + + const notificationIntervalFactor = 3 + select { + case <-ctx.Done(): + return + case <-time.After(interval / notificationIntervalFactor): + log.Warn("Health route latency is too high") + err := pprof.Lookup("goroutine").WriteTo(os.Stderr, 1) + if err != nil { + log.WithError(err).Warn("Failed to log the goroutines") + } + } +}