@@ -2,23 +2,40 @@ package middleware
22
33import (
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