Skip to content

Commit

Permalink
Update discover poll endpoint API for the new system logs endpoint (#…
Browse files Browse the repository at this point in the history
  • Loading branch information
ohsoo authored Oct 14, 2024
1 parent a15681b commit c8f65f5
Show file tree
Hide file tree
Showing 13 changed files with 275 additions and 48 deletions.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

60 changes: 42 additions & 18 deletions ecs-agent/api/ecs/client/ecs_client.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,13 @@ import (
"strings"
"time"

"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/awserr"
"github.com/aws/aws-sdk-go/aws/credentials"
"github.com/aws/aws-sdk-go/aws/endpoints"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/docker/docker/pkg/meminfo"

apicontainerstatus "github.com/aws/amazon-ecs-agent/ecs-agent/api/container/status"
"github.com/aws/amazon-ecs-agent/ecs-agent/api/ecs"
ecsmodel "github.com/aws/amazon-ecs-agent/ecs-agent/api/ecs/model/ecs"
Expand All @@ -34,12 +41,6 @@ import (
"github.com/aws/amazon-ecs-agent/ecs-agent/logger/field"
"github.com/aws/amazon-ecs-agent/ecs-agent/utils"
"github.com/aws/amazon-ecs-agent/ecs-agent/utils/retry"
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/awserr"
"github.com/aws/aws-sdk-go/aws/credentials"
"github.com/aws/aws-sdk-go/aws/endpoints"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/docker/docker/pkg/meminfo"
)

const (
Expand Down Expand Up @@ -675,7 +676,7 @@ func submitStateCustomRetriableError(err error) error {
}

func (client *ecsClient) DiscoverPollEndpoint(containerInstanceArn string) (string, error) {
resp, err := client.discoverPollEndpoint(containerInstanceArn)
resp, err := client.discoverPollEndpoint(containerInstanceArn, "")
if err != nil {
return "", err
}
Expand All @@ -687,7 +688,7 @@ func (client *ecsClient) DiscoverPollEndpoint(containerInstanceArn string) (stri
}

func (client *ecsClient) DiscoverTelemetryEndpoint(containerInstanceArn string) (string, error) {
resp, err := client.discoverPollEndpoint(containerInstanceArn)
resp, err := client.discoverPollEndpoint(containerInstanceArn, "")
if err != nil {
return "", err
}
Expand All @@ -699,7 +700,7 @@ func (client *ecsClient) DiscoverTelemetryEndpoint(containerInstanceArn string)
}

func (client *ecsClient) DiscoverServiceConnectEndpoint(containerInstanceArn string) (string, error) {
resp, err := client.discoverPollEndpoint(containerInstanceArn)
resp, err := client.discoverPollEndpoint(containerInstanceArn, "")
if err != nil {
return "", err
}
Expand All @@ -710,30 +711,52 @@ func (client *ecsClient) DiscoverServiceConnectEndpoint(containerInstanceArn str
return aws.StringValue(resp.ServiceConnectEndpoint), nil
}

func (client *ecsClient) discoverPollEndpoint(containerInstanceArn string) (*ecsmodel.DiscoverPollEndpointOutput,
func (client *ecsClient) DiscoverSystemLogsEndpoint(containerInstanceArn string, availabilityZone string) (string,
error) {
resp, err := client.discoverPollEndpoint(containerInstanceArn, availabilityZone)
if err != nil {
return "", err
}
if resp.SystemLogsEndpoint == nil {
return "", errors.New("no system logs endpoint returned; nil")
}

return aws.StringValue(resp.SystemLogsEndpoint), nil
}

func (client *ecsClient) discoverPollEndpoint(containerInstanceArn string,
availabilityZone string) (*ecsmodel.DiscoverPollEndpointOutput, error) {
// Try getting an entry from the cache.
cachedEndpoint, expired, found := client.pollEndpointCache.Get(containerInstanceArn)
if !expired && found {
// Cache hit and not expired. Return the output.
if output, ok := cachedEndpoint.(*ecsmodel.DiscoverPollEndpointOutput); ok {
logger.Info("Using cached DiscoverPollEndpoint", logger.Fields{
field.Endpoint: aws.StringValue(output.Endpoint),
field.TelemetryEndpoint: aws.StringValue(output.TelemetryEndpoint),
field.ServiceConnectEndpoint: aws.StringValue(output.ServiceConnectEndpoint),
field.ContainerInstanceARN: containerInstanceArn,
})
return output, nil
output, ok := cachedEndpoint.(*ecsmodel.DiscoverPollEndpointOutput)
systemLogsEndpoint := aws.StringValue(output.SystemLogsEndpoint)
if ok {
// Presence of the system logs endpoint can be disregarded if the AZ was not provided,
// but the cache hit must include a non-empty system logs endpoint if the AZ was provided.
if availabilityZone == "" || (availabilityZone != "" && systemLogsEndpoint != "") {
logger.Info("Using cached DiscoverPollEndpoint", logger.Fields{
field.Endpoint: aws.StringValue(output.Endpoint),
field.TelemetryEndpoint: aws.StringValue(output.TelemetryEndpoint),
field.ServiceConnectEndpoint: aws.StringValue(output.ServiceConnectEndpoint),
field.SystemLogsEndpoint: systemLogsEndpoint,
field.ContainerInstanceARN: containerInstanceArn,
})
return output, nil
}
}
}

// Cache miss or expired, invoke the ECS DiscoverPollEndpoint API.
logger.Debug("Invoking DiscoverPollEndpoint", logger.Fields{
field.ContainerInstanceARN: containerInstanceArn,
field.AvailabilityZone: availabilityZone,
})
output, err := client.standardClient.DiscoverPollEndpoint(&ecsmodel.DiscoverPollEndpointInput{
ContainerInstance: &containerInstanceArn,
Cluster: aws.String(client.configAccessor.Cluster()),
ZoneId: aws.String(availabilityZone),
})
if err != nil {
// If we got an error calling the API, fallback to an expired cached endpoint if
Expand All @@ -745,6 +768,7 @@ func (client *ecsClient) discoverPollEndpoint(containerInstanceArn string) (*ecs
field.Endpoint: aws.StringValue(output.Endpoint),
field.TelemetryEndpoint: aws.StringValue(output.TelemetryEndpoint),
field.ServiceConnectEndpoint: aws.StringValue(output.ServiceConnectEndpoint),
field.SystemLogsEndpoint: aws.StringValue(output.SystemLogsEndpoint),
field.ContainerInstanceARN: containerInstanceArn,
})
return output, nil
Expand Down
Loading

0 comments on commit c8f65f5

Please sign in to comment.