Skip to content

Commit

Permalink
true up internal metrics collection for post-SRA middleware
Browse files Browse the repository at this point in the history
  • Loading branch information
lucix-aws committed May 14, 2024
1 parent b957ab0 commit bfb75ee
Show file tree
Hide file tree
Showing 10 changed files with 171 additions and 64 deletions.
8 changes: 8 additions & 0 deletions .changelog/ce369d28a2594b29aa49cd801c4ff959.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"id": "ce369d28-a259-4b29-aa49-cd801c4ff959",
"type": "bugfix",
"description": "Adjust internal metrics collection for revised authentication workflow.",
"modules": [
"."
]
}
47 changes: 23 additions & 24 deletions aws/middleware/private/metrics/metrics.go
Original file line number Diff line number Diff line change
Expand Up @@ -103,28 +103,29 @@ type MetricContext struct {

// MetricData stores the collected metric data.
type MetricData struct {
RequestStartTime time.Time
RequestEndTime time.Time
APICallDuration time.Duration
SerializeStartTime time.Time
SerializeEndTime time.Time
MarshallingDuration time.Duration
ResolveEndpointStartTime time.Time
ResolveEndpointEndTime time.Time
EndpointResolutionDuration time.Duration
InThroughput float64
OutThroughput float64
RetryCount int
Success uint8
StatusCode int
ClientRequestID string
ServiceID string
OperationName string
PartitionID string
Region string
RequestContentLength int64
Stream StreamMetrics
Attempts []AttemptMetrics
RequestStartTime time.Time
RequestEndTime time.Time
APICallDuration time.Duration
SerializeStartTime time.Time
SerializeEndTime time.Time
MarshallingDuration time.Duration
ResolveEndpointStartTime time.Time
ResolveEndpointEndTime time.Time
EndpointResolutionDuration time.Duration
GetIdentityStart, GetIdentityEnd time.Time
InThroughput float64
OutThroughput float64
RetryCount int
Success uint8
StatusCode int
ClientRequestID string
ServiceID string
OperationName string
PartitionID string
Region string
RequestContentLength int64
Stream StreamMetrics
Attempts []AttemptMetrics
}

// StreamMetrics stores metrics related to streaming data.
Expand All @@ -144,8 +145,6 @@ type AttemptMetrics struct {
ConnRequestedTime time.Time
ConnObtainedTime time.Time
ConcurrencyAcquireDuration time.Duration
CredentialFetchStartTime time.Time
CredentialFetchEndTime time.Time
SignStartTime time.Time
SignEndTime time.Time
SigningDuration time.Duration
Expand Down
4 changes: 0 additions & 4 deletions aws/middleware/private/metrics/metrics_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -109,8 +109,6 @@ func TestMetricData_ComputeRequestMetrics(t *testing.T) {
FirstByteTime: time.Unix(1334, 0),
ConnRequestedTime: time.Unix(1234, 0),
ConnObtainedTime: time.Unix(1434, 0),
CredentialFetchStartTime: time.Unix(1234, 0),
CredentialFetchEndTime: time.Unix(1434, 0),
SignStartTime: time.Unix(1234, 0),
SignEndTime: time.Unix(1434, 0),
DeserializeStartTime: time.Unix(1234, 0),
Expand All @@ -133,8 +131,6 @@ func TestMetricData_ComputeRequestMetrics(t *testing.T) {
FirstByteTime: time.Unix(1334, 0),
ConnRequestedTime: time.Unix(1234, 0),
ConnObtainedTime: time.Unix(1434, 0),
CredentialFetchStartTime: time.Unix(1234, 0),
CredentialFetchEndTime: time.Unix(1434, 0),
SignStartTime: time.Unix(1234, 0),
SignEndTime: time.Unix(1434, 0),
DeserializeStartTime: time.Unix(1234, 0),
Expand Down
13 changes: 10 additions & 3 deletions aws/middleware/private/metrics/middleware/configuration.go
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
package middleware

import (
"net/http"

"github.com/aws/aws-sdk-go-v2/aws/middleware/private/metrics"
"github.com/aws/smithy-go/middleware"
"net/http"
)

func WithMetricMiddlewares(
Expand All @@ -20,10 +21,10 @@ func WithMetricMiddlewares(
if err := stack.Serialize.Add(GetRecordStackSerializeEndMiddleware(), middleware.After); err != nil {
return err
}
if err := stack.Serialize.Insert(GetRecordEndpointResolutionStartMiddleware(), "ResolveEndpoint", middleware.Before); err != nil {
if err := stack.Finalize.Insert(GetRecordEndpointResolutionStartMiddleware(), "ResolveEndpointV2", middleware.Before); err != nil {
return err
}
if err := stack.Serialize.Insert(GetRecordEndpointResolutionEndMiddleware(), "ResolveEndpoint", middleware.After); err != nil {
if err := stack.Finalize.Insert(GetRecordEndpointResolutionEndMiddleware(), "ResolveEndpointV2", middleware.After); err != nil {
return err
}
if err := stack.Build.Add(GetWrapDataStreamMiddleware(), middleware.After); err != nil {
Expand All @@ -47,6 +48,12 @@ func WithMetricMiddlewares(
if err := stack.Deserialize.Insert(GetTransportMetricsMiddleware(), "StackDeserializeStart", middleware.After); err != nil {
return err
}
if err := timeGetIdentity(stack); err != nil {
return err
}
if err := timeSigning(stack); err != nil {
return err
}
return nil
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ package middleware

import (
"context"

"github.com/aws/aws-sdk-go-v2/aws/middleware/private/metrics"
"github.com/aws/aws-sdk-go-v2/internal/sdk"
"github.com/aws/smithy-go/middleware"
Expand All @@ -21,6 +22,8 @@ func (m *EndpointResolutionEnd) ID() string {
return "EndpointResolutionEnd"
}

// Deprecated: Endpoint resolution now occurs in Finalize. The ResolveEndpoint
// middleware remains in serialize but is largely a no-op.
func (m *EndpointResolutionEnd) HandleSerialize(
ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler,
) (
Expand All @@ -34,3 +37,13 @@ func (m *EndpointResolutionEnd) HandleSerialize(

return out, metadata, err
}

func (m *EndpointResolutionEnd) HandleFinalize(
ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler,
) (
middleware.FinalizeOutput, middleware.Metadata, error,
) {
mctx := metrics.Context(ctx)
mctx.Data().ResolveEndpointEndTime = sdk.NowTime()
return next.HandleFinalize(ctx, in)
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ package middleware

import (
"context"

"github.com/aws/aws-sdk-go-v2/aws/middleware/private/metrics"
"github.com/aws/aws-sdk-go-v2/internal/sdk"
"github.com/aws/smithy-go/middleware"
Expand All @@ -21,6 +22,8 @@ func (m *EndpointResolutionStart) ID() string {
return "EndpointResolutionStart"
}

// Deprecated: Endpoint resolution now occurs in Finalize. The ResolveEndpoint
// middleware remains in serialize but is largely a no-op.
func (m *EndpointResolutionStart) HandleSerialize(
ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler,
) (
Expand All @@ -34,3 +37,13 @@ func (m *EndpointResolutionStart) HandleSerialize(

return out, metadata, err
}

func (m *EndpointResolutionStart) HandleFinalize(
ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler,
) (
middleware.FinalizeOutput, middleware.Metadata, error,
) {
mctx := metrics.Context(ctx)
mctx.Data().ResolveEndpointStartTime = sdk.NowTime()
return next.HandleFinalize(ctx, in)
}
47 changes: 47 additions & 0 deletions aws/middleware/private/metrics/middleware/identity.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package middleware

import (
"context"

"github.com/aws/aws-sdk-go-v2/aws/middleware/private/metrics"
"github.com/aws/aws-sdk-go-v2/internal/sdk"
"github.com/aws/smithy-go/middleware"
)

func timeGetIdentity(stack *middleware.Stack) error {
if err := stack.Finalize.Insert(getIdentityStart{}, "GetIdentity", middleware.Before); err != nil {
return err
}
if err := stack.Finalize.Insert(getIdentityEnd{}, "GetIdentity", middleware.After); err != nil {
return err
}
return nil
}

type getIdentityStart struct{}

func (m getIdentityStart) ID() string { return "getIdentityStart" }

func (m getIdentityStart) HandleFinalize(
ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler,
) (
out middleware.FinalizeOutput, md middleware.Metadata, err error,
) {
mctx := metrics.Context(ctx)
mctx.Data().GetIdentityStart = sdk.NowTime()
return next.HandleFinalize(ctx, in)
}

type getIdentityEnd struct{}

func (m getIdentityEnd) ID() string { return "getIdentityEnd" }

func (m getIdentityEnd) HandleFinalize(
ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler,
) (
out middleware.FinalizeOutput, md middleware.Metadata, err error,
) {
mctx := metrics.Context(ctx)
mctx.Data().GetIdentityEnd = sdk.NowTime()
return next.HandleFinalize(ctx, in)
}
57 changes: 57 additions & 0 deletions aws/middleware/private/metrics/middleware/signing.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package middleware

import (
"context"

"github.com/aws/aws-sdk-go-v2/aws/middleware/private/metrics"
"github.com/aws/aws-sdk-go-v2/internal/sdk"
"github.com/aws/smithy-go/middleware"
)

func timeSigning(stack *middleware.Stack) error {
if err := stack.Finalize.Insert(signingStart{}, "Signing", middleware.Before); err != nil {
return err
}
if err := stack.Finalize.Insert(signingEnd{}, "Signing", middleware.After); err != nil {
return err
}
return nil
}

type signingStart struct{}

func (m signingStart) ID() string { return "signingStart" }

func (m signingStart) HandleFinalize(
ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler,
) (
out middleware.FinalizeOutput, md middleware.Metadata, err error,
) {
mctx := metrics.Context(ctx)
attempt, err := mctx.Data().LatestAttempt()
if err != nil {
return out, md, err
}

attempt.SignStartTime = sdk.NowTime()
return next.HandleFinalize(ctx, in)
}

type signingEnd struct{}

func (m signingEnd) ID() string { return "signingEnd" }

func (m signingEnd) HandleFinalize(
ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler,
) (
out middleware.FinalizeOutput, md middleware.Metadata, err error,
) {
mctx := metrics.Context(ctx)
attempt, err := mctx.Data().LatestAttempt()
if err != nil {
return out, md, err
}

attempt.SignEndTime = sdk.NowTime()
return next.HandleFinalize(ctx, in)
}
4 changes: 0 additions & 4 deletions aws/middleware/private/metrics/publisher/emf_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -78,8 +78,6 @@ func TestPostRequestMetrics(t *testing.T) {
FirstByteTime: time.Unix(1234, 0),
ConnRequestedTime: time.Unix(1234, 0),
ConnObtainedTime: time.Unix(1434, 0),
CredentialFetchStartTime: time.Unix(1234, 0),
CredentialFetchEndTime: time.Unix(1434, 0),
SignStartTime: time.Unix(1234, 0),
SignEndTime: time.Unix(1434, 0),
DeserializeStartTime: time.Unix(1234, 0),
Expand All @@ -102,8 +100,6 @@ func TestPostRequestMetrics(t *testing.T) {
FirstByteTime: time.Unix(1234, 0),
ConnRequestedTime: time.Unix(1234, 0),
ConnObtainedTime: time.Unix(1434, 0),
CredentialFetchStartTime: time.Unix(1234, 0),
CredentialFetchEndTime: time.Unix(1434, 0),
SignStartTime: time.Unix(1234, 0),
SignEndTime: time.Unix(1434, 0),
DeserializeStartTime: time.Unix(1234, 0),
Expand Down
29 changes: 0 additions & 29 deletions aws/signer/v4/middleware.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ import (

"github.com/aws/aws-sdk-go-v2/aws"
awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware"
"github.com/aws/aws-sdk-go-v2/aws/middleware/private/metrics"
v4Internal "github.com/aws/aws-sdk-go-v2/aws/signer/internal/v4"
internalauth "github.com/aws/aws-sdk-go-v2/internal/auth"
"github.com/aws/aws-sdk-go-v2/internal/sdk"
Expand Down Expand Up @@ -301,22 +300,7 @@ func (s *SignHTTPRequestMiddleware) HandleFinalize(ctx context.Context, in middl
return out, metadata, &SigningError{Err: fmt.Errorf("computed payload hash missing from context")}
}

mctx := metrics.Context(ctx)

if mctx != nil {
if attempt, err := mctx.Data().LatestAttempt(); err == nil {
attempt.CredentialFetchStartTime = sdk.NowTime()
}
}

credentials, err := s.credentialsProvider.Retrieve(ctx)

if mctx != nil {
if attempt, err := mctx.Data().LatestAttempt(); err == nil {
attempt.CredentialFetchEndTime = sdk.NowTime()
}
}

if err != nil {
return out, metadata, &SigningError{Err: fmt.Errorf("failed to retrieve credentials: %w", err)}
}
Expand All @@ -337,20 +321,7 @@ func (s *SignHTTPRequestMiddleware) HandleFinalize(ctx context.Context, in middl
})
}

if mctx != nil {
if attempt, err := mctx.Data().LatestAttempt(); err == nil {
attempt.SignStartTime = sdk.NowTime()
}
}

err = s.signer.SignHTTP(ctx, credentials, req.Request, payloadHash, signingName, signingRegion, sdk.NowTime(), signerOptions...)

if mctx != nil {
if attempt, err := mctx.Data().LatestAttempt(); err == nil {
attempt.SignEndTime = sdk.NowTime()
}
}

if err != nil {
return out, metadata, &SigningError{Err: fmt.Errorf("failed to sign http request, %w", err)}
}
Expand Down

0 comments on commit bfb75ee

Please sign in to comment.