Skip to content

Commit 136dac9

Browse files
committed
AWS ECS detector: add support for cloud.{accound.id,availability_zone,region}
1 parent a93bd74 commit 136dac9

File tree

3 files changed

+62
-48
lines changed

3 files changed

+62
-48
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1111
([#2119](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2119))
1212
- `opentelemetry-resource-detector-azure` Changed timeout to 4 seconds due to [timeout bug](https://github.com/open-telemetry/opentelemetry-python/issues/3644)
1313
([#2136](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/2136))
14+
- `opentelemetry/sdk/extension/aws` Implement `cloud.account.id`, `cloud.availability_zone` and `cloud.region` resource attributes in the `AwsEcsResourceDetector` detector when the ECS Metadata v4 is available- `opentelemetry-resource-detector-azure`
1415

1516
## Version 1.22.0/0.43b0 (2023-12-14)
1617

sdk-extension/opentelemetry-sdk-extension-aws/src/opentelemetry/sdk/extension/aws/resource/ecs.py

+43-36
Original file line numberDiff line numberDiff line change
@@ -77,43 +77,9 @@ def detect(self) -> "Resource":
7777
if not metadata_v4_endpoint:
7878
return base_resource
7979

80-
# Returns https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-metadata-endpoint-v4.html#task-metadata-endpoint-v4-response
81-
metadata_container = json.loads(_http_get(metadata_v4_endpoint))
82-
metadata_task = json.loads(
83-
_http_get(f"{metadata_v4_endpoint}/task")
84-
)
85-
86-
task_arn = metadata_task["TaskARN"]
87-
base_arn = task_arn[0 : task_arn.rindex(":")] # noqa
88-
cluster: str = metadata_task["Cluster"]
89-
cluster_arn = (
90-
cluster
91-
if cluster.startswith("arn:")
92-
else f"{base_arn}:cluster/{cluster}"
93-
)
80+
v4_resource = _get_v4_resource(metadata_v4_endpoint)
9481

95-
logs_resource = _get_logs_resource(metadata_container)
96-
97-
return base_resource.merge(logs_resource).merge(
98-
Resource(
99-
{
100-
ResourceAttributes.AWS_ECS_CONTAINER_ARN: metadata_container[
101-
"ContainerARN"
102-
],
103-
ResourceAttributes.AWS_ECS_CLUSTER_ARN: cluster_arn,
104-
ResourceAttributes.AWS_ECS_LAUNCHTYPE: metadata_task[
105-
"LaunchType"
106-
].lower(),
107-
ResourceAttributes.AWS_ECS_TASK_ARN: task_arn,
108-
ResourceAttributes.AWS_ECS_TASK_FAMILY: metadata_task[
109-
"Family"
110-
],
111-
ResourceAttributes.AWS_ECS_TASK_REVISION: metadata_task[
112-
"Revision"
113-
],
114-
}
115-
)
116-
)
82+
return base_resource.merge(v4_resource)
11783
# pylint: disable=broad-except
11884
except Exception as exception:
11985
if self.raise_on_error:
@@ -123,6 +89,47 @@ def detect(self) -> "Resource":
12389
return Resource.get_empty()
12490

12591

92+
def _get_v4_resource(metadata_v4_endpoint):
93+
# Returns https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-metadata-endpoint-v4.html#task-metadata-endpoint-v4-response
94+
metadata_container = json.loads(_http_get(metadata_v4_endpoint))
95+
metadata_task = json.loads(_http_get(f"{metadata_v4_endpoint}/task"))
96+
97+
task_arn = metadata_task["TaskARN"]
98+
base_arn = task_arn[0 : task_arn.rindex(":")] # noqa
99+
cluster: str = metadata_task["Cluster"]
100+
cluster_arn = (
101+
cluster
102+
if cluster.startswith("arn:")
103+
else f"{base_arn}:cluster/{cluster}"
104+
)
105+
106+
region, account_id = task_arn.split(":")[3:5]
107+
108+
logs_resource = _get_logs_resource(metadata_container)
109+
110+
return Resource(
111+
{
112+
ResourceAttributes.CLOUD_ACCOUNT_ID: account_id,
113+
ResourceAttributes.CLOUD_AVAILABILITY_ZONE: metadata_task[
114+
"AvailabilityZone"
115+
].lower(),
116+
ResourceAttributes.CLOUD_REGION: region,
117+
ResourceAttributes.AWS_ECS_CONTAINER_ARN: metadata_container[
118+
"ContainerARN"
119+
],
120+
ResourceAttributes.AWS_ECS_CLUSTER_ARN: cluster_arn,
121+
ResourceAttributes.AWS_ECS_LAUNCHTYPE: metadata_task[
122+
"LaunchType"
123+
].lower(),
124+
ResourceAttributes.AWS_ECS_TASK_ARN: task_arn,
125+
ResourceAttributes.AWS_ECS_TASK_FAMILY: metadata_task["Family"],
126+
ResourceAttributes.AWS_ECS_TASK_REVISION: metadata_task[
127+
"Revision"
128+
],
129+
}
130+
).merge(logs_resource)
131+
132+
126133
def _get_logs_resource(metadata_container):
127134
if metadata_container.get("LogDriver") == "awslogs":
128135
log_options = metadata_container.get("LogOptions")

sdk-extension/opentelemetry-sdk-extension-aws/tests/resource/test_ecs.py

+18-12
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,15 @@ def test_simple_create_metadata_v4_launchtype_ec2(
156156
OrderedDict(
157157
{
158158
**MockEcsResourceAttributes,
159+
ResourceAttributes.CLOUD_ACCOUNT_ID: "111122223333",
160+
ResourceAttributes.CLOUD_AVAILABILITY_ZONE: "us-west-2d",
161+
ResourceAttributes.CLOUD_REGION: "us-west-2",
162+
ResourceAttributes.AWS_ECS_CONTAINER_ARN: "arn:aws:ecs:us-west-2:111122223333:container/0206b271-b33f-47ab-86c6-a0ba208a70a9",
163+
ResourceAttributes.AWS_ECS_CLUSTER_ARN: "arn:aws:ecs:us-west-2:111122223333:cluster/default",
164+
ResourceAttributes.AWS_ECS_LAUNCHTYPE: "ec2",
165+
ResourceAttributes.AWS_ECS_TASK_ARN: "arn:aws:ecs:us-west-2:111122223333:task/default/158d1c8083dd49d6b527399fd6414f5c",
166+
ResourceAttributes.AWS_ECS_TASK_FAMILY: "curltest",
167+
ResourceAttributes.AWS_ECS_TASK_REVISION: "26",
159168
ResourceAttributes.AWS_LOG_GROUP_NAMES: ("/ecs/metadata",),
160169
ResourceAttributes.AWS_LOG_GROUP_ARNS: (
161170
"arn:aws:logs:us-west-2:111122223333:log-group:/ecs/metadata",
@@ -166,12 +175,6 @@ def test_simple_create_metadata_v4_launchtype_ec2(
166175
ResourceAttributes.AWS_LOG_STREAM_ARNS: (
167176
"arn:aws:logs:us-west-2:111122223333:log-group:/ecs/metadata:log-stream:ecs/curl/8f03e41243824aea923aca126495f665",
168177
),
169-
ResourceAttributes.AWS_ECS_CONTAINER_ARN: "arn:aws:ecs:us-west-2:111122223333:container/0206b271-b33f-47ab-86c6-a0ba208a70a9",
170-
ResourceAttributes.AWS_ECS_CLUSTER_ARN: "arn:aws:ecs:us-west-2:111122223333:cluster/default",
171-
ResourceAttributes.AWS_ECS_LAUNCHTYPE: "ec2",
172-
ResourceAttributes.AWS_ECS_TASK_ARN: "arn:aws:ecs:us-west-2:111122223333:task/default/158d1c8083dd49d6b527399fd6414f5c",
173-
ResourceAttributes.AWS_ECS_TASK_FAMILY: "curltest",
174-
ResourceAttributes.AWS_ECS_TASK_REVISION: "26",
175178
}
176179
),
177180
)
@@ -221,6 +224,15 @@ def test_simple_create_metadata_v4_launchtype_fargate(
221224
OrderedDict(
222225
{
223226
**MockEcsResourceAttributes,
227+
ResourceAttributes.CLOUD_ACCOUNT_ID: "111122223333",
228+
ResourceAttributes.CLOUD_AVAILABILITY_ZONE: "us-west-2a",
229+
ResourceAttributes.CLOUD_REGION: "us-west-2",
230+
ResourceAttributes.AWS_ECS_CONTAINER_ARN: "arn:aws:ecs:us-west-2:111122223333:container/05966557-f16c-49cb-9352-24b3a0dcd0e1",
231+
ResourceAttributes.AWS_ECS_CLUSTER_ARN: "arn:aws:ecs:us-west-2:111122223333:cluster/default",
232+
ResourceAttributes.AWS_ECS_LAUNCHTYPE: "fargate",
233+
ResourceAttributes.AWS_ECS_TASK_ARN: "arn:aws:ecs:us-west-2:111122223333:task/default/e9028f8d5d8e4f258373e7b93ce9a3c3",
234+
ResourceAttributes.AWS_ECS_TASK_FAMILY: "curltest",
235+
ResourceAttributes.AWS_ECS_TASK_REVISION: "3",
224236
ResourceAttributes.AWS_LOG_GROUP_NAMES: (
225237
"/ecs/containerlogs",
226238
),
@@ -233,12 +245,6 @@ def test_simple_create_metadata_v4_launchtype_fargate(
233245
ResourceAttributes.AWS_LOG_STREAM_ARNS: (
234246
"arn:aws:logs:us-west-2:111122223333:log-group:/ecs/containerlogs:log-stream:ecs/curl/cd189a933e5849daa93386466019ab50",
235247
),
236-
ResourceAttributes.AWS_ECS_CONTAINER_ARN: "arn:aws:ecs:us-west-2:111122223333:container/05966557-f16c-49cb-9352-24b3a0dcd0e1",
237-
ResourceAttributes.AWS_ECS_CLUSTER_ARN: "arn:aws:ecs:us-west-2:111122223333:cluster/default",
238-
ResourceAttributes.AWS_ECS_LAUNCHTYPE: "fargate",
239-
ResourceAttributes.AWS_ECS_TASK_ARN: "arn:aws:ecs:us-west-2:111122223333:task/default/e9028f8d5d8e4f258373e7b93ce9a3c3",
240-
ResourceAttributes.AWS_ECS_TASK_FAMILY: "curltest",
241-
ResourceAttributes.AWS_ECS_TASK_REVISION: "3",
242248
}
243249
),
244250
)

0 commit comments

Comments
 (0)