Skip to content

Commit fd7aa97

Browse files
author
Michele Mancioppi
committed
Implement aws.logs attributes for the AwsEcsResourceDetector
1 parent dbb1621 commit fd7aa97

File tree

2 files changed

+58
-1
lines changed
  • sdk-extension/opentelemetry-sdk-extension-aws

2 files changed

+58
-1
lines changed

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

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import json
1616
import logging
1717
import os
18+
import re
1819
import socket
1920
from urllib.request import Request, urlopen
2021

@@ -91,7 +92,9 @@ def detect(self) -> "Resource":
9192
else f"{base_arn}:cluster/{cluster}"
9293
)
9394

94-
return base_resource.merge(
95+
logs_resource = _get_logs_resource(metadata_container)
96+
97+
return base_resource.merge(logs_resource).merge(
9598
Resource(
9699
{
97100
ResourceAttributes.AWS_ECS_CONTAINER_ARN: metadata_container[
@@ -120,6 +123,55 @@ def detect(self) -> "Resource":
120123
return Resource.get_empty()
121124

122125

126+
127+
def _get_logs_resource(metadata_container):
128+
if metadata_container.get("LogDriver") == "awslogs":
129+
log_options = metadata_container.get("LogOptions")
130+
if log_options:
131+
logs_region = log_options.get("awslogs-region")
132+
logs_group_name = log_options.get("awslogs-group")
133+
logs_stream_name = log_options.get("awslogs-stream")
134+
135+
container_arn = metadata_container["ContainerARN"]
136+
137+
if not logs_region:
138+
aws_region_match = re.match(r'arn:aws:ecs:([^:]+):.*', container_arn)
139+
if aws_region_match:
140+
logs_region = aws_region_match.group(1)
141+
142+
else:
143+
logger.warning("Cannot parse AWS account out of ECS ARN")
144+
145+
# We need to retrieve the account it from some other ARN to create the
146+
# log-group and log-stream ARNs
147+
aws_account = None
148+
aws_account_match = re.match(r'arn:aws:ecs:[^:]+:([^:]+):.*', container_arn)
149+
if aws_account_match:
150+
aws_account = aws_account_match.group(1)
151+
152+
logs_group_arn = None
153+
logs_stream_arn = None
154+
if logs_region and aws_account:
155+
if logs_group_name:
156+
logs_group_arn = f"arn:aws:logs:{logs_region}:{aws_account}:log-group:/aws{logs_group_name}:*"
157+
158+
if logs_stream_name:
159+
logs_stream_arn = f"arn:aws:logs:{logs_region}:{aws_account}:log-group:/aws{logs_group_name}:log-stream:{logs_stream_name}"
160+
161+
return Resource(
162+
{
163+
ResourceAttributes.AWS_LOG_GROUP_NAMES: [logs_group_name],
164+
ResourceAttributes.AWS_LOG_GROUP_ARNS: [logs_group_arn],
165+
ResourceAttributes.AWS_LOG_STREAM_NAMES: [logs_stream_name],
166+
ResourceAttributes.AWS_LOG_STREAM_ARNS: [logs_stream_arn],
167+
}
168+
)
169+
else:
170+
logger.warning("The metadata endpoint v4 has returned 'awslogs' as 'LogDriver', but there is no 'LogOptions' data")
171+
172+
return Resource.get_empty()
173+
174+
123175
def _http_get(url):
124176
with urlopen(
125177
Request(url, method="GET"),

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,11 +131,16 @@ def test_simple_create_metadata_v4(
131131
):
132132
mock_http_get_function.side_effect = _http_get_function
133133
actual = AwsEcsResourceDetector().detect()
134+
self.maxDiff = None
134135
self.assertDictEqual(
135136
actual.attributes.copy(),
136137
OrderedDict(
137138
{
138139
**MockEcsResourceAttributes,
140+
ResourceAttributes.AWS_LOG_GROUP_NAMES: ("/ecs/metadata",),
141+
ResourceAttributes.AWS_LOG_GROUP_ARNS: ("arn:aws:logs:us-west-2:111122223333:log-group:/aws/ecs/metadata:*",),
142+
ResourceAttributes.AWS_LOG_STREAM_NAMES: ("ecs/curl/8f03e41243824aea923aca126495f665",),
143+
ResourceAttributes.AWS_LOG_STREAM_ARNS: ("arn:aws:logs:us-west-2:111122223333:log-group:/aws/ecs/metadata:log-stream:ecs/curl/8f03e41243824aea923aca126495f665",),
139144
ResourceAttributes.AWS_ECS_CONTAINER_ARN: "arn:aws:ecs:us-west-2:111122223333:container/0206b271-b33f-47ab-86c6-a0ba208a70a9",
140145
ResourceAttributes.AWS_ECS_CLUSTER_ARN: "arn:aws:ecs:us-west-2:111122223333:cluster/default",
141146
ResourceAttributes.AWS_ECS_LAUNCHTYPE: "EC2",

0 commit comments

Comments
 (0)