Skip to content

Commit c525d8a

Browse files
committed
Remove spans with ec2 metadata ip address from metrics
1 parent 07aad1f commit c525d8a

File tree

2 files changed

+35
-3
lines changed

2 files changed

+35
-3
lines changed

aws-opentelemetry-distro/src/amazon/opentelemetry/distro/aws_span_metrics_processor.py

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,15 @@
44

55
from typing_extensions import override
66

7-
from amazon.opentelemetry.distro.metric_attribute_generator import MetricAttributeGenerator
7+
from amazon.opentelemetry.distro.metric_attribute_generator import MetricAttributeGenerator, DEPENDENCY_METRIC
88
from opentelemetry.context import Context
99
from opentelemetry.metrics import Histogram
1010
from opentelemetry.sdk.resources import Resource
1111
from opentelemetry.sdk.trace import BoundedAttributes, ReadableSpan, Span, SpanProcessor, StatusCode
1212
from opentelemetry.semconv.trace import SpanAttributes
1313

14+
from amazon.opentelemetry.distro._aws_attribute_keys import AWS_REMOTE_SERVICE
15+
1416
_HTTP_STATUS_CODE = SpanAttributes.HTTP_STATUS_CODE
1517
_NANOS_TO_MILLIS: float = 1_000_000.0
1618

@@ -21,6 +23,11 @@
2123
_FAULT_CODE_UPPER_BOUND: int = 599
2224

2325

26+
# EC2 Metadata API IP Address
27+
# https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instancedata-data-retrieval.html#instancedata-inside-access
28+
_EC2_METADATA_API_IP: str = "169.254.169.254"
29+
30+
2431
class AwsSpanMetricsProcessor(SpanProcessor):
2532
"""AwsSpanMetricsProcessor is SpanProcessor that generates metrics from spans
2633
@@ -79,8 +86,10 @@ def on_end(self, span: ReadableSpan) -> None:
7986
attribute_dict: Dict[str, BoundedAttributes] = self._generator.generate_metric_attributes_dict_from_span(
8087
span, self._resource
8188
)
82-
for attributes in attribute_dict.values():
83-
self._record_metrics(span, attributes)
89+
90+
if not _is_ec2_metadata_api_span(attribute_dict):
91+
for attributes in attribute_dict.values():
92+
self._record_metrics(span, attributes)
8493

8594
@override
8695
def shutdown(self) -> None:
@@ -130,3 +139,7 @@ def _is_not_error_or_fault(http_status_code: int) -> bool:
130139
or http_status_code < _ERROR_CODE_LOWER_BOUND
131140
or http_status_code > _FAULT_CODE_UPPER_BOUND
132141
)
142+
143+
144+
def _is_ec2_metadata_api_span(attribute_dict: Dict[str, BoundedAttributes]) -> bool:
145+
return attribute_dict.get(DEPENDENCY_METRIC, {}).get(AWS_REMOTE_SERVICE) == _EC2_METADATA_API_IP

aws-opentelemetry-distro/tests/amazon/opentelemetry/distro/test_aws_span_metrics_processor.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@
2424
from opentelemetry.trace import INVALID_SPAN_CONTEXT, SpanContext, SpanKind
2525
from opentelemetry.util.types import Attributes
2626

27+
from amazon.opentelemetry.distro._aws_attribute_keys import AWS_REMOTE_SERVICE
28+
29+
2730
# Test constants
2831
_CONTAINS_ATTRIBUTES: bool = True
2932
_CONTAINS_NO_ATTRIBUTES: bool = False
@@ -238,6 +241,15 @@ def test_on_end_metrics_generation_with_status_data_ok(self):
238241
self._validate_metrics_generated_for_status_data_ok(599, self.ExpectedStatusMetric.FAULT)
239242
self._validate_metrics_generated_for_status_data_ok(600, self.ExpectedStatusMetric.NEITHER)
240243

244+
def test_on_end_metrics_generation_from_ec2_metadata_api(self):
245+
span_attributes: Attributes = {AWS_REMOTE_SERVICE: "169.254.169.254"}
246+
span: ReadableSpan = _build_readable_span_mock(span_attributes)
247+
metric_attributes_dict = _build_ec2_metadata_api_metric_attributes()
248+
self._configure_mock_for_on_end(span, metric_attributes_dict)
249+
250+
self.aws_span_metrics_processor.on_end(span)
251+
self._verify_histogram_record(metric_attributes_dict, 0, 0)
252+
241253
def _configure_mock_for_on_end(self, span: Span, attribute_map: {str: Attributes}):
242254
def generate_m_a_from_span_side_effect(input_span, resource):
243255
if input_span == span and resource == self.test_resource:
@@ -373,3 +385,10 @@ def _build_metric_attributes(contain_attributes: bool, span: Span) -> Attributes
373385
attributes = {"new dependency key": "new dependency value"}
374386
attribute_map[DEPENDENCY_METRIC] = attributes
375387
return attribute_map
388+
389+
390+
def _build_ec2_metadata_api_metric_attributes() -> Attributes:
391+
attribute_map: Attributes = {}
392+
attributes = {AWS_REMOTE_SERVICE: "169.254.169.254"}
393+
attribute_map[DEPENDENCY_METRIC] = attributes
394+
return attribute_map

0 commit comments

Comments
 (0)