|
4 | 4 |
|
5 | 5 | from typing_extensions import override |
6 | 6 |
|
7 | | -from amazon.opentelemetry.distro.metric_attribute_generator import MetricAttributeGenerator |
| 7 | +from amazon.opentelemetry.distro.metric_attribute_generator import MetricAttributeGenerator, DEPENDENCY_METRIC |
8 | 8 | from opentelemetry.context import Context |
9 | 9 | from opentelemetry.metrics import Histogram |
10 | 10 | from opentelemetry.sdk.resources import Resource |
11 | 11 | from opentelemetry.sdk.trace import BoundedAttributes, ReadableSpan, Span, SpanProcessor, StatusCode |
12 | 12 | from opentelemetry.semconv.trace import SpanAttributes |
13 | 13 |
|
| 14 | +from amazon.opentelemetry.distro._aws_attribute_keys import AWS_REMOTE_SERVICE |
| 15 | + |
14 | 16 | _HTTP_STATUS_CODE = SpanAttributes.HTTP_STATUS_CODE |
15 | 17 | _NANOS_TO_MILLIS: float = 1_000_000.0 |
16 | 18 |
|
|
21 | 23 | _FAULT_CODE_UPPER_BOUND: int = 599 |
22 | 24 |
|
23 | 25 |
|
| 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 | + |
24 | 31 | class AwsSpanMetricsProcessor(SpanProcessor): |
25 | 32 | """AwsSpanMetricsProcessor is SpanProcessor that generates metrics from spans |
26 | 33 |
|
@@ -79,8 +86,10 @@ def on_end(self, span: ReadableSpan) -> None: |
79 | 86 | attribute_dict: Dict[str, BoundedAttributes] = self._generator.generate_metric_attributes_dict_from_span( |
80 | 87 | span, self._resource |
81 | 88 | ) |
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) |
84 | 93 |
|
85 | 94 | @override |
86 | 95 | def shutdown(self) -> None: |
@@ -130,3 +139,7 @@ def _is_not_error_or_fault(http_status_code: int) -> bool: |
130 | 139 | or http_status_code < _ERROR_CODE_LOWER_BOUND |
131 | 140 | or http_status_code > _FAULT_CODE_UPPER_BOUND |
132 | 141 | ) |
| 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 |
0 commit comments