Skip to content

Commit 5f883da

Browse files
committed
Add traceID in error logging of stackit api calls
formatting fix preserve consistent formatting
1 parent d41cc39 commit 5f883da

4 files changed

Lines changed: 55 additions & 6 deletions

File tree

‎pkg/stackit/client/helper.go‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,10 @@ func withResponseID[T any](ctx context.Context, call func(context.Context) (T, e
1616
resp, err := call(ctx)
1717
if err != nil {
1818
var zero T
19+
err = stackiterrors.WrapError(err, "X-Trace-Id", runtime.GetTraceId(ctx))
1920
if httpResp != nil {
2021
reqID := httpResp.Header.Get(sdkWait.XRequestIDHeader)
21-
return zero, stackiterrors.WrapErrorWithResponseID(err, reqID)
22+
err = stackiterrors.WrapErrorWithResponseID(err, reqID)
2223
}
2324
return zero, err
2425
}

‎pkg/stackit/client/helper_test.go‎

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package client
2+
3+
import (
4+
"context"
5+
"errors"
6+
"net/http"
7+
8+
. "github.com/onsi/ginkgo/v2"
9+
. "github.com/onsi/gomega"
10+
sdkconfig "github.com/stackitcloud/stackit-sdk-go/core/config"
11+
)
12+
13+
var _ = Describe("withResponseID", func() {
14+
It("wraps API errors with trace and request IDs", func() {
15+
_, err := withResponseID(context.Background(), func(ctx context.Context) (int, error) {
16+
response, ok := ctx.Value(sdkconfig.ContextHTTPResponse).(**http.Response)
17+
Expect(ok).To(BeTrue())
18+
*response = &http.Response{Header: http.Header{
19+
"X-Trace-Id": {"trace-123"},
20+
"X-Request-Id": {"request-456"},
21+
}}
22+
return 0, errors.New("api error")
23+
})
24+
25+
Expect(err).To(MatchError("[X-Request-Id:request-456]: [X-Trace-Id:trace-123]: api error"))
26+
})
27+
})

‎pkg/stackit/stackiterrors/errors.go‎

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,16 +40,20 @@ func IgnoreNotFound(err error) error {
4040
return err
4141
}
4242

43-
// WrapErrorWithResponseID wraps the error with the X-Request-Id but only if the error is not nil
44-
func WrapErrorWithResponseID(err error, reqID string) error {
43+
// WrapError wraps the error with an identifier but only if the error is not nil.
44+
func WrapError(err error, name, id string) error {
4545
if err == nil {
4646
return nil
4747
}
48-
// if the request id is empty we don't wrap the error
49-
if reqID == "" {
48+
if id == "" {
5049
return err
5150
}
52-
return fmt.Errorf("[%s:%s]: %w", wait.XRequestIDHeader, reqID, err)
51+
return fmt.Errorf("[%s:%s]: %w", name, id, err)
52+
}
53+
54+
// WrapErrorWithResponseID wraps the error with the X-Request-Id.
55+
func WrapErrorWithResponseID(err error, reqID string) error {
56+
return WrapError(err, wait.XRequestIDHeader, reqID)
5357
}
5458

5559
func IsInvalidError(err error) bool {

‎pkg/stackit/stackiterrors/errors_test.go‎

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,23 @@ var _ = Describe("Errors", func() {
9595
})
9696
})
9797

98+
Describe("WrapError", func() {
99+
It("wraps the error with the provided identifier", func() {
100+
err := errors.New("test error")
101+
expected := fmt.Errorf("[X-Trace-Id:12345]: %w", err)
102+
Expect(WrapError(err, "X-Trace-Id", "12345")).To(Equal(expected))
103+
})
104+
105+
It("returns the original error when the identifier is empty", func() {
106+
err := errors.New("test error")
107+
Expect(WrapError(err, "trace-id", "")).To(Equal(err))
108+
})
109+
110+
It("returns nil when the error is nil", func() {
111+
Expect(WrapError(nil, "trace-id", "12345")).To(Succeed())
112+
})
113+
})
114+
98115
Describe("IsInvalidError", func() {
99116
Context("when error is a BadRequest error", func() {
100117
It("should return true", func() {

0 commit comments

Comments
 (0)