diff --git a/src/AWS.Distro.OpenTelemetry.AutoInstrumentation/AwsSpanMetricsProcessor.cs b/src/AWS.Distro.OpenTelemetry.AutoInstrumentation/AwsSpanMetricsProcessor.cs index 1c0a9a53..87c6a684 100644 --- a/src/AWS.Distro.OpenTelemetry.AutoInstrumentation/AwsSpanMetricsProcessor.cs +++ b/src/AWS.Distro.OpenTelemetry.AutoInstrumentation/AwsSpanMetricsProcessor.cs @@ -6,6 +6,7 @@ using OpenTelemetry; using OpenTelemetry.Metrics; using OpenTelemetry.Resources; +using static AWS.Distro.OpenTelemetry.AutoInstrumentation.AwsAttributeKeys; using static AWS.Distro.OpenTelemetry.AutoInstrumentation.AwsSpanProcessingUtil; namespace AWS.Distro.OpenTelemetry.AutoInstrumentation; @@ -32,6 +33,8 @@ public class AwsSpanMetricsProcessor : BaseProcessor private const int FaultCodeLowerBound = 500; private const int FaultCodeUpperBound = 599; + private const string Ec2MetadataApiIp = "169.254.169.254"; + // Metric instruments private Histogram errorHistogram; private Histogram faultHistogram; @@ -162,10 +165,21 @@ private void RecordLatency(Activity span, ActivityTagsCollection attributes) private void RecordMetrics(Activity span, ActivityTagsCollection attributes) { // Only record metrics if non-empty attributes are returned. - if (attributes.Count > 0) + if (attributes.Count > 0 && !IsEc2MetadataApiSpan(attributes)) { this.RecordErrorOrFault(span, attributes); this.RecordLatency(span, attributes); } } + + private bool IsEc2MetadataApiSpan(ActivityTagsCollection attributes) + { + if (attributes.TryGetValue(AttributeAWSRemoteService, out object? value) && + value is string ip && + ip == Ec2MetadataApiIp) + { + return true; + } + return false; + } } diff --git a/test/AWS.Distro.OpenTelemetry.AutoInstrumentation.Tests/AwsSpanMetricsProcessorTest.cs b/test/AWS.Distro.OpenTelemetry.AutoInstrumentation.Tests/AwsSpanMetricsProcessorTest.cs index 18d0aaf6..6e4fd1cc 100644 --- a/test/AWS.Distro.OpenTelemetry.AutoInstrumentation.Tests/AwsSpanMetricsProcessorTest.cs +++ b/test/AWS.Distro.OpenTelemetry.AutoInstrumentation.Tests/AwsSpanMetricsProcessorTest.cs @@ -325,6 +325,18 @@ public void TestOnEndMetricsGenerationWithStatusDataOk() this.ValidateMetricsGeneratedForStatusDataOk(600, ExpectedStatusMetric.NEITHER); } + [Fact] + public void TestOnEndMetricsGenerationFromEc2MetadataApi() + { + Activity? spanDataMock = this.activitySource.StartActivity("test", ActivityKind.Client); + this.SetLatency(spanDataMock); + Dictionary expectAttributes = this.BuildEc2MetadataApiMetricAttributes(); + this.generator.Setup(g => g.GenerateMetricAttributeMapFromSpan(spanDataMock, this.resource)) + .Returns(expectAttributes); + this.awsSpanMetricsProcessor.OnEnd(spanDataMock); + this.VerifyHistogramRecords(expectAttributes, 0, 0); + } + private void ValidateMetricsGeneratedForAttributeStatusCode( int? awsStatusCode, ExpectedStatusMetric expectedStatusMetric) { @@ -524,6 +536,13 @@ private Dictionary BuildMetricAttributes(bool co return attributes; } + private Dictionary BuildEc2MetadataApiMetricAttributes() + { + Dictionary attributes = new Dictionary(); + attributes.Add(MetricAttributeGeneratorConstants.DependencyMetric, new ActivityTagsCollection([new KeyValuePair(AttributeAWSRemoteService, "169.254.169.254")])); + return attributes; + } + // Configure latency private void SetLatency(Activity? spanDataMock, double latency = -1) {