44
55from 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
88from opentelemetry .context import Context
99from opentelemetry .metrics import Histogram
1010from opentelemetry .sdk .resources import Resource
1111from opentelemetry .sdk .trace import BoundedAttributes , ReadableSpan , Span , SpanProcessor , StatusCode
1212from 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
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+
2431class 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 :
@@ -123,10 +132,12 @@ def _record_latency(self, span: ReadableSpan, attributes: BoundedAttributes) ->
123132 millis : float = nanos / _NANOS_TO_MILLIS
124133 self ._latency_histogram .record (millis , attributes )
125134
126-
127135def _is_not_error_or_fault (http_status_code : int ) -> bool :
128136 return (
129137 http_status_code is None
130138 or http_status_code < _ERROR_CODE_LOWER_BOUND
131139 or http_status_code > _FAULT_CODE_UPPER_BOUND
132140 )
141+
142+ def _is_ec2_metadata_api_span (attribute_dict : Dict [str , BoundedAttributes ]) -> bool :
143+ return attribute_dict .get (DEPENDENCY_METRIC , {}).get (AWS_REMOTE_SERVICE ) == _EC2_METADATA_API_IP
0 commit comments