Skip to content

Commit fb70409

Browse files
Modify error handler to return structured errors
1 parent b68d88f commit fb70409

File tree

1 file changed

+24
-7
lines changed

1 file changed

+24
-7
lines changed

aws/middleware/middleware.go

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,40 @@ package middleware
22

33
import (
44
"context"
5+
"errors"
6+
"regexp"
57

68
"github.com/aws/aws-sdk-go-v2/aws/transport/http"
9+
"github.com/aws/smithy-go"
710
"github.com/aws/smithy-go/middleware"
811
"github.com/awslabs/operatorpkg/serrors"
912
"github.com/samber/lo"
1013
)
1114

12-
const AWSRequestIDLogKey = "aws-request-id"
15+
const (
16+
AWSRequestIDLogKey = "aws-request-id"
17+
AWSStatusCodeLogKey = "aws-status-code"
18+
AWSServiceNameLogKey = "aws-service-name"
19+
AWSOperationNameLogKey = "aws-operation-name"
20+
AWSErrorCodeLogKey = "aws-error-code"
21+
)
1322

14-
var RequestIDErrorHandler = func(stack *middleware.Stack) error {
15-
return stack.Deserialize.Add(middleware.DeserializeMiddlewareFunc("RequestIDErrorHandler", func(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (middleware.DeserializeOutput, middleware.Metadata, error) {
23+
// StructuredErrorHandler injects structured keys and values into the error returned by the AWS request
24+
// It doesn't modify the error message so error messages will still contain the structured values
25+
var StructuredErrorHandler = func(stack *middleware.Stack) error {
26+
return stack.Deserialize.Add(middleware.DeserializeMiddlewareFunc("StructuredErrorHandler", func(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) (middleware.DeserializeOutput, middleware.Metadata, error) {
1627
out, metadata, err := next.HandleDeserialize(ctx, in)
17-
if err != nil {
18-
if v, ok := lo.ErrorsAs[*http.ResponseError](err); ok {
19-
err = serrors.Wrap(err, AWSRequestIDLogKey, v.ServiceRequestID())
28+
values := []any{AWSServiceNameLogKey, middleware.GetServiceID(ctx), AWSOperationNameLogKey, middleware.GetOperationName(ctx)}
29+
temp := err
30+
for temp != nil {
31+
if v, ok := temp.(*http.ResponseError); ok {
32+
values = append(values, AWSRequestIDLogKey, v.RequestID, AWSStatusCodeLogKey, v.Response.StatusCode)
33+
}
34+
if v, ok := temp.(*smithy.GenericAPIError); ok {
35+
values = append(values, AWSErrorCodeLogKey, v.Code)
2036
}
37+
temp = errors.Unwrap(temp)
2138
}
22-
return out, metadata, err
39+
return out, metadata, lo.Ternary(err != nil, serrors.Wrap(err, values...), nil)
2340
}), middleware.Before)
2441
}

0 commit comments

Comments
 (0)