From a9bc7c3ee3ff06345c7db68715e1c0e0f4b54fff Mon Sep 17 00:00:00 2001 From: motatoes Date: Wed, 23 Jul 2025 16:53:31 -0700 Subject: [PATCH 1/5] add debug logs for github api requests --- backend/utils/github.go | 43 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/backend/utils/github.go b/backend/utils/github.go index c45f7a568..b6b1bd518 100644 --- a/backend/utils/github.go +++ b/backend/utils/github.go @@ -1,9 +1,11 @@ package utils import ( + "bytes" "context" "encoding/base64" "fmt" + "io" "log/slog" net "net/http" "os" @@ -37,6 +39,41 @@ func (gh DiggerGithubRealClientProvider) NewClient(netClient *net.Client) (*gith return ghClient, nil } +type loggingRoundTripper struct { + rt net.RoundTripper +} + +func (lrt *loggingRoundTripper) RoundTrip(req *net.Request) (*net.Response, error) { + // Log the request + slog.Debug("GitHub API Request", + "method", req.Method, + "url", req.URL.String(), + "headers", req.Header, + ) + + resp, err := lrt.rt.RoundTrip(req) + if err != nil { + slog.Error("GitHub API Request failed", "error", err) + return nil, err + } + + // Read and clone response body for logging + bodyBytes, err := io.ReadAll(resp.Body) + if err != nil { + slog.Error("Failed to read response body", "error", err) + return resp, err + } + resp.Body = io.NopCloser(bytes.NewBuffer(bodyBytes)) // restore the body for the actual client + + slog.Debug("GitHub API Response", + "status", resp.Status, + "headers", resp.Header, + "body", string(bodyBytes), + ) + + return resp, nil +} + func (gh DiggerGithubRealClientProvider) Get(githubAppId int64, installationId int64) (*github.Client, *string, error) { slog.Debug("Getting GitHub client", "githubAppId", githubAppId, @@ -83,7 +120,11 @@ func (gh DiggerGithubRealClientProvider) Get(githubAppId int64, installationId i return nil, nil, fmt.Errorf("error initialising git app token: %v\n", err) } - ghClient, err := gh.NewClient(&net.Client{Transport: itr}) + clientWithLogging := &net.Client{ + Transport: &loggingRoundTripper{rt: itr}, + } + + ghClient, err := gh.NewClient(clientWithLogging) if err != nil { slog.Error("Failed to create GitHub client", "error", err) return nil, nil, fmt.Errorf("error creating new client: %v", err) From fc234d2abf87e23297f19ff6aca96d0a885e5a63 Mon Sep 17 00:00:00 2001 From: motatoes Date: Wed, 23 Jul 2025 16:59:51 -0700 Subject: [PATCH 2/5] log ee as well --- backend/utils/github.go | 39 +-------------------- backend/utils/trip_logger.go | 43 ++++++++++++++++++++++++ ee/backend/providers/github/providers.go | 6 +++- 3 files changed, 49 insertions(+), 39 deletions(-) create mode 100644 backend/utils/trip_logger.go diff --git a/backend/utils/github.go b/backend/utils/github.go index b6b1bd518..5972cdade 100644 --- a/backend/utils/github.go +++ b/backend/utils/github.go @@ -1,11 +1,9 @@ package utils import ( - "bytes" "context" "encoding/base64" "fmt" - "io" "log/slog" net "net/http" "os" @@ -39,41 +37,6 @@ func (gh DiggerGithubRealClientProvider) NewClient(netClient *net.Client) (*gith return ghClient, nil } -type loggingRoundTripper struct { - rt net.RoundTripper -} - -func (lrt *loggingRoundTripper) RoundTrip(req *net.Request) (*net.Response, error) { - // Log the request - slog.Debug("GitHub API Request", - "method", req.Method, - "url", req.URL.String(), - "headers", req.Header, - ) - - resp, err := lrt.rt.RoundTrip(req) - if err != nil { - slog.Error("GitHub API Request failed", "error", err) - return nil, err - } - - // Read and clone response body for logging - bodyBytes, err := io.ReadAll(resp.Body) - if err != nil { - slog.Error("Failed to read response body", "error", err) - return resp, err - } - resp.Body = io.NopCloser(bytes.NewBuffer(bodyBytes)) // restore the body for the actual client - - slog.Debug("GitHub API Response", - "status", resp.Status, - "headers", resp.Header, - "body", string(bodyBytes), - ) - - return resp, nil -} - func (gh DiggerGithubRealClientProvider) Get(githubAppId int64, installationId int64) (*github.Client, *string, error) { slog.Debug("Getting GitHub client", "githubAppId", githubAppId, @@ -121,7 +84,7 @@ func (gh DiggerGithubRealClientProvider) Get(githubAppId int64, installationId i } clientWithLogging := &net.Client{ - Transport: &loggingRoundTripper{rt: itr}, + Transport: &LoggingRoundTripper{Rt: itr}, } ghClient, err := gh.NewClient(clientWithLogging) diff --git a/backend/utils/trip_logger.go b/backend/utils/trip_logger.go new file mode 100644 index 000000000..1b2f6a793 --- /dev/null +++ b/backend/utils/trip_logger.go @@ -0,0 +1,43 @@ +package utils + +import ( + "bytes" + "io" + "log/slog" + net "net/http" +) + +type LoggingRoundTripper struct { + Rt net.RoundTripper +} + +func (lrt *LoggingRoundTripper) RoundTrip(req *net.Request) (*net.Response, error) { + // Log the request + slog.Debug("GitHub API Request", + "method", req.Method, + "url", req.URL.String(), + "headers", req.Header, + ) + + resp, err := lrt.Rt.RoundTrip(req) + if err != nil { + slog.Error("GitHub API Request failed", "error", err) + return nil, err + } + + // Read and clone response body for logging + bodyBytes, err := io.ReadAll(resp.Body) + if err != nil { + slog.Error("Failed to read response body", "error", err) + return resp, err + } + resp.Body = io.NopCloser(bytes.NewBuffer(bodyBytes)) // restore the body for the actual client + + slog.Debug("GitHub API Response", + "status", resp.Status, + "headers", resp.Header, + "body", string(bodyBytes), + ) + + return resp, nil +} diff --git a/ee/backend/providers/github/providers.go b/ee/backend/providers/github/providers.go index 845c2506b..78b712317 100644 --- a/ee/backend/providers/github/providers.go +++ b/ee/backend/providers/github/providers.go @@ -80,7 +80,11 @@ func (gh DiggerGithubEEClientProvider) Get(githubAppId int64, installationId int return nil, nil, fmt.Errorf("error initialising git app token: %v\n", err) } - ghClient, err := gh.NewClient(&net.Client{Transport: itr}) + clientWithLogging := &net.Client{ + Transport: &utils.LoggingRoundTripper{Rt: itr}, + } + + ghClient, err := gh.NewClient(clientWithLogging) if err != nil { return nil, nil, fmt.Errorf("could not get digger client: %v", err) } From 996869c24d4fd0b250edcacbe8b433b6885ce830 Mon Sep 17 00:00:00 2001 From: motatoes Date: Wed, 23 Jul 2025 17:07:43 -0700 Subject: [PATCH 3/5] fetch specific headers only --- backend/utils/trip_logger.go | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/backend/utils/trip_logger.go b/backend/utils/trip_logger.go index 1b2f6a793..dacd387d8 100644 --- a/backend/utils/trip_logger.go +++ b/backend/utils/trip_logger.go @@ -1,8 +1,6 @@ package utils import ( - "bytes" - "io" "log/slog" net "net/http" ) @@ -16,7 +14,6 @@ func (lrt *LoggingRoundTripper) RoundTrip(req *net.Request) (*net.Response, erro slog.Debug("GitHub API Request", "method", req.Method, "url", req.URL.String(), - "headers", req.Header, ) resp, err := lrt.Rt.RoundTrip(req) @@ -25,18 +22,13 @@ func (lrt *LoggingRoundTripper) RoundTrip(req *net.Request) (*net.Response, erro return nil, err } - // Read and clone response body for logging - bodyBytes, err := io.ReadAll(resp.Body) - if err != nil { - slog.Error("Failed to read response body", "error", err) - return resp, err - } - resp.Body = io.NopCloser(bytes.NewBuffer(bodyBytes)) // restore the body for the actual client - slog.Debug("GitHub API Response", "status", resp.Status, - "headers", resp.Header, - "body", string(bodyBytes), + "X-RateLimit-Limit", resp.Header.Get("X-RateLimit-Limit"), + "X-RateLimit-Remaining", resp.Header.Get("X-RateLimit-Remaining"), + "X-RateLimit-Used", resp.Header.Get("X-RateLimit-Used"), + "X-RateLimit-Resource", resp.Header.Get("X-RateLimit-Resource"), + "X-RateLimit-Reset", resp.Header.Get("X-RateLimit-Reset"), ) return resp, nil From 646292b07c8a2eb06ce2ffa52dd7c79c0739d463 Mon Sep 17 00:00:00 2001 From: motatoes Date: Wed, 23 Jul 2025 17:18:46 -0700 Subject: [PATCH 4/5] reduce logging --- backend/utils/trip_logger.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/utils/trip_logger.go b/backend/utils/trip_logger.go index dacd387d8..17f411817 100644 --- a/backend/utils/trip_logger.go +++ b/backend/utils/trip_logger.go @@ -13,7 +13,7 @@ func (lrt *LoggingRoundTripper) RoundTrip(req *net.Request) (*net.Response, erro // Log the request slog.Debug("GitHub API Request", "method", req.Method, - "url", req.URL.String(), + "url_path", req.URL.Path, ) resp, err := lrt.Rt.RoundTrip(req) From 26c817ee8e653157136ebc8999473288353d54e4 Mon Sep 17 00:00:00 2001 From: Mohamed Habib Date: Wed, 23 Jul 2025 17:25:49 -0700 Subject: [PATCH 5/5] Update backend/utils/trip_logger.go Co-authored-by: bismuthdev[bot] <177057995+bismuthdev[bot]@users.noreply.github.com> --- backend/utils/trip_logger.go | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/backend/utils/trip_logger.go b/backend/utils/trip_logger.go index 17f411817..f4fdd114d 100644 --- a/backend/utils/trip_logger.go +++ b/backend/utils/trip_logger.go @@ -24,12 +24,17 @@ func (lrt *LoggingRoundTripper) RoundTrip(req *net.Request) (*net.Response, erro slog.Debug("GitHub API Response", "status", resp.Status, - "X-RateLimit-Limit", resp.Header.Get("X-RateLimit-Limit"), - "X-RateLimit-Remaining", resp.Header.Get("X-RateLimit-Remaining"), - "X-RateLimit-Used", resp.Header.Get("X-RateLimit-Used"), - "X-RateLimit-Resource", resp.Header.Get("X-RateLimit-Resource"), - "X-RateLimit-Reset", resp.Header.Get("X-RateLimit-Reset"), ) + + if resp.Header != nil { + slog.Debug("GitHub API Rate Limits", + "X-RateLimit-Limit", resp.Header.Get("X-RateLimit-Limit"), + "X-RateLimit-Remaining", resp.Header.Get("X-RateLimit-Remaining"), + "X-RateLimit-Used", resp.Header.Get("X-RateLimit-Used"), + "X-RateLimit-Resource", resp.Header.Get("X-RateLimit-Resource"), + "X-RateLimit-Reset", resp.Header.Get("X-RateLimit-Reset"), + ) + } return resp, nil }