|
15 | 15 | import json |
16 | 16 | import logging |
17 | 17 | import os |
| 18 | +import re |
18 | 19 | import socket |
19 | 20 | from urllib.request import Request, urlopen |
20 | 21 |
|
@@ -91,7 +92,9 @@ def detect(self) -> "Resource": |
91 | 92 | else f"{base_arn}:cluster/{cluster}" |
92 | 93 | ) |
93 | 94 |
|
94 | | - return base_resource.merge( |
| 95 | + logs_resource = _get_logs_resource(metadata_container) |
| 96 | + |
| 97 | + return base_resource.merge(logs_resource).merge( |
95 | 98 | Resource( |
96 | 99 | { |
97 | 100 | ResourceAttributes.AWS_ECS_CONTAINER_ARN: metadata_container[ |
@@ -120,6 +123,55 @@ def detect(self) -> "Resource": |
120 | 123 | return Resource.get_empty() |
121 | 124 |
|
122 | 125 |
|
| 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 | + |
123 | 175 | def _http_get(url): |
124 | 176 | with urlopen( |
125 | 177 | Request(url, method="GET"), |
|
0 commit comments