Skip to content

Commit fad2e58

Browse files
committed
Remove spans with ec2 metadata ip address from metrics
1 parent da8291e commit fad2e58

File tree

2 files changed

+37
-3
lines changed

2 files changed

+37
-3
lines changed

aws-distro-opentelemetry-node-autoinstrumentation/src/aws-span-metrics-processor.ts

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,9 @@ import { AttributeValue, Attributes, Context, Histogram, SpanStatusCode } from '
55
import { Resource } from '@opentelemetry/resources';
66
import { ReadableSpan, Span, SpanProcessor } from '@opentelemetry/sdk-trace-base';
77
import { SEMATTRS_HTTP_STATUS_CODE } from '@opentelemetry/semantic-conventions';
8-
import { AttributeMap, MetricAttributeGenerator } from './metric-attribute-generator';
8+
import { AttributeMap, DEPENDENCY_METRIC, MetricAttributeGenerator } from './metric-attribute-generator';
99
import { ForceFlushFunction } from './aws-span-processing-util';
10+
import { AWS_ATTRIBUTE_KEYS } from './aws-attribute-keys';
1011

1112
/**
1213
* This processor will generate metrics based on span data. It depends on a
@@ -33,6 +34,10 @@ export class AwsSpanMetricsProcessor implements SpanProcessor {
3334
private FAULT_CODE_LOWER_BOUND: number = 500;
3435
private FAULT_CODE_UPPER_BOUND: number = 599;
3536

37+
// EC2 Metadata API IP Address
38+
// https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instancedata-data-retrieval.html#instancedata-inside-access
39+
private EC2_METADATA_API_IP: string = '169.254.169.254';
40+
3641
// Metric instruments
3742
private errorHistogram: Histogram;
3843
private faultHistogram: Histogram;
@@ -83,8 +88,10 @@ export class AwsSpanMetricsProcessor implements SpanProcessor {
8388
public onEnd(span: ReadableSpan): void {
8489
const attributeMap: AttributeMap = this.generator.generateMetricAttributeMapFromSpan(span, this.resource);
8590

86-
for (const attribute in attributeMap) {
87-
this.recordMetrics(span, attributeMap[attribute]);
91+
if (!this.isEc2MetadataApiSpan(attributeMap)) {
92+
for (const attribute in attributeMap) {
93+
this.recordMetrics(span, attributeMap[attribute]);
94+
}
8895
}
8996
}
9097

@@ -143,4 +150,8 @@ export class AwsSpanMetricsProcessor implements SpanProcessor {
143150
public forceFlush(): Promise<void> {
144151
return this.forceFlushFunction();
145152
}
153+
154+
private isEc2MetadataApiSpan(attributeMap: AttributeMap): boolean {
155+
return attributeMap[DEPENDENCY_METRIC]?.[AWS_ATTRIBUTE_KEYS.AWS_REMOTE_SERVICE] === this.EC2_METADATA_API_IP;
156+
}
146157
}

aws-distro-opentelemetry-node-autoinstrumentation/test/aws-span-metrics-processor.test.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -397,6 +397,22 @@ describe('AwsSpanMetricsProcessorTest', () => {
397397
validateMetricsGeneratedForStatusDataOk(600, ExpectedStatusMetric.NEITHER);
398398
});
399399

400+
it('testOnEndMetricsGenerationFromEc2MetadataApi', () => {
401+
const spanAttributes: Attributes = { [AWS_ATTRIBUTE_KEYS.AWS_REMOTE_SERVICE]: '169.254.169.254' };
402+
const readableSpanMock: ReadableSpan = buildReadableSpanMock(
403+
spanAttributes,
404+
SpanKind.CLIENT,
405+
INVALID_SPAN_CONTEXT,
406+
{ code: SpanStatusCode.UNSET }
407+
);
408+
const metricAttributesMap: AttributeMap = buildEc2MetadataApiMetricAttributes();
409+
configureMocksForOnEnd(readableSpanMock, metricAttributesMap);
410+
awsSpanMetricsProcessor.onEnd(readableSpanMock);
411+
sinon.assert.notCalled(errorHistogramMockRecord);
412+
sinon.assert.notCalled(faultHistogramMockRecord);
413+
sinon.assert.notCalled(latencyHistogramMockRecord);
414+
});
415+
400416
function buildSpanAttributes(containsAttribute: boolean): Attributes {
401417
if (containsAttribute) {
402418
return { 'original key': 'original value' };
@@ -421,6 +437,13 @@ describe('AwsSpanMetricsProcessorTest', () => {
421437
return attributesMap;
422438
}
423439

440+
function buildEc2MetadataApiMetricAttributes(): AttributeMap {
441+
const attributesMap: AttributeMap = {};
442+
const attributes: Attributes = { [AWS_ATTRIBUTE_KEYS.AWS_REMOTE_SERVICE]: '169.254.169.254' };
443+
attributesMap[DEPENDENCY_METRIC] = attributes;
444+
return attributesMap;
445+
}
446+
424447
function buildReadableSpanMock(
425448
spanAttributes: Attributes,
426449
spanKind: SpanKind = SpanKind.SERVER,

0 commit comments

Comments
 (0)