diff --git a/agent/platform.go b/agent/platform.go index d740494..aceeee7 100644 --- a/agent/platform.go +++ b/agent/platform.go @@ -35,6 +35,16 @@ func NewPlatform(ctx context.Context, ignoreContainer *regexp.Regexp) (platform. } return ecs.NewECSPlatform(ctx, metadataURI, executionEnv, ignoreContainer) + // experimental : on AWS ECS External Instance, `AWS_EXECUTION_ENV` is not defined. + // follow user's `MACKEREL_CONTAINER_PLATFORM` setting and using unique value that does not interfere with AWS. + case platform.ECSExternal: + metadataURI, err := getEnvValue("ECS_CONTAINER_METADATA_URI") + if err != nil { + return nil, err + } + executionEnv := ecs.ExecutionEnvExternal + return ecs.NewECSPlatform(ctx, metadataURI, executionEnv, ignoreContainer) + case platform.Kubernetes: useReadOnlyPort := true insecureTLS := false diff --git a/platform/ecs/ecs.go b/platform/ecs/ecs.go index d722bac..8927755 100644 --- a/platform/ecs/ecs.go +++ b/platform/ecs/ecs.go @@ -21,6 +21,9 @@ import ( const ( executionEnvFargate = "AWS_ECS_FARGATE" executionEnvEC2 = "AWS_ECS_EC2" + + // ExecutionEnvExternal : (experimental) It is a definition that is handled internally, not an environment variable. + ExecutionEnvExternal = "ECS_EXTERNAL" ) var ( @@ -123,6 +126,8 @@ func resolveProvider(executionEnv string) (provider, error) { return fargateProvider, nil case executionEnvEC2: return ecsProvider, nil + case ExecutionEnvExternal: + return externalProvider, nil default: return provider("UNKNOWN"), fmt.Errorf("unknown execution env: %q", executionEnv) } diff --git a/platform/ecs/ecs_test.go b/platform/ecs/ecs_test.go index e83028d..1d8af27 100644 --- a/platform/ecs/ecs_test.go +++ b/platform/ecs/ecs_test.go @@ -39,6 +39,7 @@ func TestResolveProvider(t *testing.T) { }{ {"AWS_ECS_FARGATE", fargateProvider}, {"AWS_ECS_EC2", ecsProvider}, + {"ECS_EXTERNAL", externalProvider}, {"unknown", provider("UNKNOWN")}, {"", provider("UNKNOWN")}, } diff --git a/platform/ecs/provider.go b/platform/ecs/provider.go index f7429f3..bf33e37 100644 --- a/platform/ecs/provider.go +++ b/platform/ecs/provider.go @@ -6,4 +6,6 @@ type provider string const ( ecsProvider provider = "ecs" fargateProvider provider = "fargate" + // experimental + externalProvider provider = "external" ) diff --git a/platform/ecs/spec_test.go b/platform/ecs/spec_test.go index 7a99b18..c4a1304 100644 --- a/platform/ecs/spec_test.go +++ b/platform/ecs/spec_test.go @@ -20,6 +20,7 @@ func TestGenerateSpec(t *testing.T) { {"taskmetadata/testdata/metadata_ec2_host.json", ecsProvider}, {"taskmetadata/testdata/metadata_ec2_awsvpc.json", ecsProvider}, {"taskmetadata/testdata/metadata_fargate.json", fargateProvider}, + {"taskmetadata/testdata/metadata_external.json", externalProvider}, } var path string diff --git a/platform/ecs/taskmetadata/testdata/metadata_external.json b/platform/ecs/taskmetadata/testdata/metadata_external.json new file mode 100644 index 0000000..1dfc454 --- /dev/null +++ b/platform/ecs/taskmetadata/testdata/metadata_external.json @@ -0,0 +1,49 @@ +{ + "Cluster": "test-clusrer", + "TaskARN": "arn:aws:ecs:ap-northeast-1:999999999999:task/task-id", + "Family": "test-external", + "Revision": "4", + "DesiredStatus": "RUNNING", + "KnownStatus": "RUNNING", + "Limits": { + "CPU": 0.25, + "Memory": 256 + }, + "PullStartedAt": "2022-03-14T06:44:39.928830311Z", + "PullStoppedAt": "2022-03-14T06:44:42.387434211Z", + "LaunchType": "EXTERNAL", + "Containers": [ + { + "DockerId": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "Name": "mackerel-container-agent", + "DockerName": "ecs-test-cluster-1-mackerel-container-agent-ffffffffffffffffffff", + "Image": "mackerel/mackerel-container-agent:latest", + "ImageID": "sha256:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "Labels": { + "com.amazonaws.ecs.cluster": "test-cluster", + "com.amazonaws.ecs.container-name": "mackerel-container-agent", + "com.amazonaws.ecs.task-arn": "arn:aws:ecs:ap-northeast-1:999999999999:task/task-id", + "com.amazonaws.ecs.task-definition-family": "test-fargate", + "com.amazonaws.ecs.task-definition-version": "1" + }, + "DesiredStatus": "RUNNING", + "KnownStatus": "RUNNING", + "Limits": { + "CPU": 0, + "Memory": 128 + }, + "CreatedAt": "2019-03-29T02:54:57.61447652Z", + "StartedAt": "2019-03-29T02:54:58.346799541Z", + "Type": "NORMAL", + "Networks": [ + { + "NetworkMode": "awsvpc", + "IPv4Addresses": [ + "172.17.0.2" + ] + } + ] + } + ] + } + \ No newline at end of file diff --git a/platform/types.go b/platform/types.go index d9da17f..f0eb364 100644 --- a/platform/types.go +++ b/platform/types.go @@ -12,4 +12,6 @@ const ( Kubernetes Type = "kubernetes" EKSOnFargate Type = "eks_fargate" None Type = "none" + // experimental + ECSExternal Type = "ecs_external" )