Skip to content

Commit cbd9e7d

Browse files
authored
Revert "feat: Extract resource arn and remote resource access key for cross-account support (#192)" (#212)
*Issue #, if available:* This reverts commit 9b0a538 (#192). This is a temporary change in order to unblock the main build workflow that is currently failing - https://github.com/aws-observability/aws-otel-js-instrumentation/actions/runs/16062476677/job/45752418669 *Description of changes:* By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice.
1 parent 9c6e278 commit cbd9e7d

File tree

13 files changed

+109
-1012
lines changed

13 files changed

+109
-1012
lines changed

aws-distro-opentelemetry-node-autoinstrumentation/src/aws-attribute-keys.ts

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,12 @@ import { SEMATTRS_AWS_DYNAMODB_TABLE_NAMES } from '@opentelemetry/semantic-conve
55

66
// Utility class holding attribute keys with special meaning to AWS components
77
export const AWS_ATTRIBUTE_KEYS = {
8-
AWS_AUTH_ACCOUNT_ACCESS_KEY: 'aws.auth.account.access_key',
9-
AWS_AUTH_REGION: 'aws.auth.region',
108
AWS_SPAN_KIND: 'aws.span.kind',
119
AWS_LOCAL_SERVICE: 'aws.local.service',
1210
AWS_LOCAL_OPERATION: 'aws.local.operation',
1311
AWS_REMOTE_SERVICE: 'aws.remote.service',
1412
AWS_REMOTE_ENVIRONMENT: 'aws.remote.environment',
1513
AWS_REMOTE_OPERATION: 'aws.remote.operation',
16-
AWS_REMOTE_RESOURCE_ACCOUNT_ACCESS_KEY: 'aws.remote.resource.account.access_key',
17-
AWS_REMOTE_RESOURCE_ACCOUNT_ID: 'aws.remote.resource.account.id',
18-
AWS_REMOTE_RESOURCE_REGION: 'aws.remote.resource.region',
1914
AWS_REMOTE_RESOURCE_TYPE: 'aws.remote.resource.type',
2015
AWS_REMOTE_RESOURCE_IDENTIFIER: 'aws.remote.resource.identifier',
2116
AWS_SDK_DESCENDANT: 'aws.sdk.descendant',
@@ -36,9 +31,7 @@ export const AWS_ATTRIBUTE_KEYS = {
3631
AWS_S3_BUCKET: 'aws.s3.bucket',
3732
AWS_SQS_QUEUE_URL: 'aws.sqs.queue.url',
3833
AWS_SQS_QUEUE_NAME: 'aws.sqs.queue.name',
39-
AWS_KINESIS_STREAM_ARN: 'aws.kinesis.stream.arn',
4034
AWS_KINESIS_STREAM_NAME: 'aws.kinesis.stream.name',
41-
AWS_DYNAMODB_TABLE_ARN: 'aws.dynamodb.table.arn',
4235
AWS_DYNAMODB_TABLE_NAMES: SEMATTRS_AWS_DYNAMODB_TABLE_NAMES,
4336
AWS_BEDROCK_DATA_SOURCE_ID: 'aws.bedrock.data_source.id',
4437
AWS_BEDROCK_KNOWLEDGE_BASE_ID: 'aws.bedrock.knowledge_base.id',

aws-distro-opentelemetry-node-autoinstrumentation/src/aws-metric-attribute-generator.ts

Lines changed: 16 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ import {
3232
MetricAttributeGenerator,
3333
SERVICE_METRIC,
3434
} from './metric-attribute-generator';
35-
import { RegionalResourceArnParser } from './regional-resource-arn-parser';
3635
import { SqsUrlParser } from './sqs-url-parser';
3736
import { LAMBDA_APPLICATION_SIGNALS_REMOTE_ENVIRONMENT } from './aws-opentelemetry-configurator';
3837

@@ -113,20 +112,8 @@ export class AwsMetricAttributeGenerator implements MetricAttributeGenerator {
113112
AwsMetricAttributeGenerator.setService(resource, span, attributes);
114113
AwsMetricAttributeGenerator.setEgressOperation(span, attributes);
115114
AwsMetricAttributeGenerator.setRemoteServiceAndOperation(span, attributes);
116-
const isRemoteResourceIdentifierPresent = AwsMetricAttributeGenerator.setRemoteResourceTypeAndIdentifier(
117-
span,
118-
attributes
119-
);
115+
AwsMetricAttributeGenerator.setRemoteResourceTypeAndIdentifier(span, attributes);
120116
AwsMetricAttributeGenerator.setRemoteEnvironment(span, attributes);
121-
if (isRemoteResourceIdentifierPresent) {
122-
const isAccountIdAndRegionPresent = AwsMetricAttributeGenerator.setRemoteResourceAccountIdAndRegion(
123-
span,
124-
attributes
125-
);
126-
if (!isAccountIdAndRegionPresent) {
127-
AwsMetricAttributeGenerator.setRemoteResourceAccessKeyAndRegion(span, attributes);
128-
}
129-
}
130117
AwsMetricAttributeGenerator.setSpanKindForDependency(span, attributes);
131118
AwsMetricAttributeGenerator.setRemoteDbUser(span, attributes);
132119

@@ -382,7 +369,7 @@ export class AwsMetricAttributeGenerator implements MetricAttributeGenerator {
382369
* href="https://docs.aws.amazon.com/cloudcontrolapi/latest/userguide/supported-resources.html">AWS
383370
* Cloud Control resource format</a>.
384371
*/
385-
private static setRemoteResourceTypeAndIdentifier(span: ReadableSpan, attributes: Attributes): boolean {
372+
private static setRemoteResourceTypeAndIdentifier(span: ReadableSpan, attributes: Attributes): void {
386373
let remoteResourceType: AttributeValue | undefined;
387374
let remoteResourceIdentifier: AttributeValue | undefined;
388375
let cloudFormationIdentifier: AttributeValue | undefined;
@@ -396,25 +383,11 @@ export class AwsMetricAttributeGenerator implements MetricAttributeGenerator {
396383
) {
397384
remoteResourceType = NORMALIZED_DYNAMO_DB_SERVICE_NAME + '::Table';
398385
remoteResourceIdentifier = AwsMetricAttributeGenerator.escapeDelimiters(awsTableNames[0]);
399-
} else if (AwsSpanProcessingUtil.isKeyPresent(span, AWS_ATTRIBUTE_KEYS.AWS_DYNAMODB_TABLE_ARN)) {
400-
remoteResourceType = NORMALIZED_DYNAMO_DB_SERVICE_NAME + '::Table';
401-
remoteResourceIdentifier = AwsMetricAttributeGenerator.escapeDelimiters(
402-
RegionalResourceArnParser.extractDynamoDbTableNameFromArn(
403-
span.attributes[AWS_ATTRIBUTE_KEYS.AWS_DYNAMODB_TABLE_ARN]
404-
)
405-
);
406386
} else if (AwsSpanProcessingUtil.isKeyPresent(span, AWS_ATTRIBUTE_KEYS.AWS_KINESIS_STREAM_NAME)) {
407387
remoteResourceType = NORMALIZED_KINESIS_SERVICE_NAME + '::Stream';
408388
remoteResourceIdentifier = AwsMetricAttributeGenerator.escapeDelimiters(
409389
span.attributes[AWS_ATTRIBUTE_KEYS.AWS_KINESIS_STREAM_NAME]
410390
);
411-
} else if (AwsSpanProcessingUtil.isKeyPresent(span, AWS_ATTRIBUTE_KEYS.AWS_KINESIS_STREAM_ARN)) {
412-
remoteResourceType = NORMALIZED_KINESIS_SERVICE_NAME + '::Stream';
413-
remoteResourceIdentifier = AwsMetricAttributeGenerator.escapeDelimiters(
414-
RegionalResourceArnParser.extractKinesisStreamNameFromArn(
415-
span.attributes[AWS_ATTRIBUTE_KEYS.AWS_KINESIS_STREAM_ARN]
416-
)
417-
);
418391
} else if (AwsSpanProcessingUtil.isKeyPresent(span, AWS_ATTRIBUTE_KEYS.AWS_S3_BUCKET)) {
419392
remoteResourceType = NORMALIZED_S3_SERVICE_NAME + '::Bucket';
420393
remoteResourceIdentifier = AwsMetricAttributeGenerator.escapeDelimiters(
@@ -425,31 +398,31 @@ export class AwsMetricAttributeGenerator implements MetricAttributeGenerator {
425398

426399
remoteResourceType = NORMALIZED_SNS_SERVICE_NAME + '::Topic';
427400
remoteResourceIdentifier = AwsMetricAttributeGenerator.escapeDelimiters(
428-
RegionalResourceArnParser.extractResourceNameFromArn(snsArn)
401+
this.extractResourceNameFromArn(snsArn)
429402
);
430403
cloudFormationIdentifier = AwsMetricAttributeGenerator.escapeDelimiters(snsArn);
431404
} else if (AwsSpanProcessingUtil.isKeyPresent(span, AWS_ATTRIBUTE_KEYS.AWS_SECRETSMANAGER_SECRET_ARN)) {
432405
const secretsArn = span.attributes[AWS_ATTRIBUTE_KEYS.AWS_SECRETSMANAGER_SECRET_ARN];
433406

434407
remoteResourceType = NORMALIZED_SECRETSMANAGER_SERVICE_NAME + '::Secret';
435408
remoteResourceIdentifier = AwsMetricAttributeGenerator.escapeDelimiters(
436-
RegionalResourceArnParser.extractResourceNameFromArn(secretsArn)
409+
this.extractResourceNameFromArn(secretsArn)
437410
);
438411
cloudFormationIdentifier = AwsMetricAttributeGenerator.escapeDelimiters(secretsArn);
439412
} else if (AwsSpanProcessingUtil.isKeyPresent(span, AWS_ATTRIBUTE_KEYS.AWS_STEPFUNCTIONS_STATEMACHINE_ARN)) {
440413
const stateMachineArn = span.attributes[AWS_ATTRIBUTE_KEYS.AWS_STEPFUNCTIONS_STATEMACHINE_ARN];
441414

442415
remoteResourceType = NORMALIZED_STEPFUNCTIONS_SERVICE_NAME + '::StateMachine';
443416
remoteResourceIdentifier = AwsMetricAttributeGenerator.escapeDelimiters(
444-
RegionalResourceArnParser.extractResourceNameFromArn(stateMachineArn)
417+
this.extractResourceNameFromArn(stateMachineArn)
445418
);
446419
cloudFormationIdentifier = AwsMetricAttributeGenerator.escapeDelimiters(stateMachineArn);
447420
} else if (AwsSpanProcessingUtil.isKeyPresent(span, AWS_ATTRIBUTE_KEYS.AWS_STEPFUNCTIONS_ACTIVITY_ARN)) {
448421
const activityArn = span.attributes[AWS_ATTRIBUTE_KEYS.AWS_STEPFUNCTIONS_ACTIVITY_ARN];
449422

450423
remoteResourceType = NORMALIZED_STEPFUNCTIONS_SERVICE_NAME + '::Activity';
451424
remoteResourceIdentifier = AwsMetricAttributeGenerator.escapeDelimiters(
452-
RegionalResourceArnParser.extractResourceNameFromArn(activityArn)
425+
this.extractResourceNameFromArn(activityArn)
453426
);
454427
cloudFormationIdentifier = AwsMetricAttributeGenerator.escapeDelimiters(activityArn);
455428
} else if (AwsSpanProcessingUtil.isKeyPresent(span, AWS_ATTRIBUTE_KEYS.AWS_LAMBDA_FUNCTION_NAME)) {
@@ -527,10 +500,7 @@ export class AwsMetricAttributeGenerator implements MetricAttributeGenerator {
527500
attributes[AWS_ATTRIBUTE_KEYS.AWS_REMOTE_RESOURCE_TYPE] = remoteResourceType;
528501
attributes[AWS_ATTRIBUTE_KEYS.AWS_REMOTE_RESOURCE_IDENTIFIER] = remoteResourceIdentifier;
529502
attributes[AWS_ATTRIBUTE_KEYS.AWS_CLOUDFORMATION_PRIMARY_IDENTIFIER] = cloudFormationIdentifier;
530-
return true;
531503
}
532-
533-
return false;
534504
}
535505

536506
/**
@@ -552,56 +522,6 @@ export class AwsMetricAttributeGenerator implements MetricAttributeGenerator {
552522
}
553523
}
554524

555-
private static setRemoteResourceAccountIdAndRegion(span: ReadableSpan, attributes: Attributes): boolean {
556-
const ARN_ATTRIBUTES: string[] = [
557-
AWS_ATTRIBUTE_KEYS.AWS_DYNAMODB_TABLE_ARN,
558-
AWS_ATTRIBUTE_KEYS.AWS_KINESIS_STREAM_ARN,
559-
AWS_ATTRIBUTE_KEYS.AWS_SNS_TOPIC_ARN,
560-
AWS_ATTRIBUTE_KEYS.AWS_SECRETSMANAGER_SECRET_ARN,
561-
AWS_ATTRIBUTE_KEYS.AWS_STEPFUNCTIONS_STATEMACHINE_ARN,
562-
AWS_ATTRIBUTE_KEYS.AWS_STEPFUNCTIONS_ACTIVITY_ARN,
563-
AWS_ATTRIBUTE_KEYS.AWS_LAMBDA_FUNCTION_ARN,
564-
AWS_ATTRIBUTE_KEYS.AWS_BEDROCK_GUARDRAIL_ARN,
565-
];
566-
let remoteResourceAccountId: string | undefined = undefined;
567-
let remoteResourceRegion: string | undefined = undefined;
568-
569-
if (AwsSpanProcessingUtil.isKeyPresent(span, AWS_ATTRIBUTE_KEYS.AWS_SQS_QUEUE_URL)) {
570-
const sqsQueueUrl = AwsMetricAttributeGenerator.escapeDelimiters(
571-
span.attributes[AWS_ATTRIBUTE_KEYS.AWS_SQS_QUEUE_URL]
572-
);
573-
remoteResourceAccountId = SqsUrlParser.getAccountId(sqsQueueUrl);
574-
remoteResourceRegion = SqsUrlParser.getRegion(sqsQueueUrl);
575-
} else {
576-
for (const attributeKey of ARN_ATTRIBUTES) {
577-
if (AwsSpanProcessingUtil.isKeyPresent(span, attributeKey)) {
578-
const arn = span.attributes[attributeKey];
579-
remoteResourceAccountId = RegionalResourceArnParser.getAccountId(arn);
580-
remoteResourceRegion = RegionalResourceArnParser.getRegion(arn);
581-
break;
582-
}
583-
}
584-
}
585-
586-
if (remoteResourceAccountId !== undefined && remoteResourceRegion !== undefined) {
587-
attributes[AWS_ATTRIBUTE_KEYS.AWS_REMOTE_RESOURCE_ACCOUNT_ID] = remoteResourceAccountId;
588-
attributes[AWS_ATTRIBUTE_KEYS.AWS_REMOTE_RESOURCE_REGION] = remoteResourceRegion;
589-
return true;
590-
}
591-
592-
return false;
593-
}
594-
595-
private static setRemoteResourceAccessKeyAndRegion(span: ReadableSpan, attributes: Attributes): void {
596-
if (AwsSpanProcessingUtil.isKeyPresent(span, AWS_ATTRIBUTE_KEYS.AWS_AUTH_ACCOUNT_ACCESS_KEY)) {
597-
attributes[AWS_ATTRIBUTE_KEYS.AWS_REMOTE_RESOURCE_ACCOUNT_ACCESS_KEY] =
598-
span.attributes[AWS_ATTRIBUTE_KEYS.AWS_AUTH_ACCOUNT_ACCESS_KEY];
599-
}
600-
if (AwsSpanProcessingUtil.isKeyPresent(span, AWS_ATTRIBUTE_KEYS.AWS_AUTH_REGION)) {
601-
attributes[AWS_ATTRIBUTE_KEYS.AWS_REMOTE_RESOURCE_REGION] = span.attributes[AWS_ATTRIBUTE_KEYS.AWS_AUTH_REGION];
602-
}
603-
}
604-
605525
/**
606526
* RemoteResourceIdentifier is populated with rule <code>
607527
* ^[{db.name}|]?{address}[|{port}]?
@@ -729,6 +649,16 @@ export class AwsMetricAttributeGenerator implements MetricAttributeGenerator {
729649
return rpcService === 'Lambda' && span.attributes[SEMATTRS_RPC_METHOD] === LAMBDA_INVOKE_OPERATION;
730650
}
731651

652+
// Extracts the name of the resource from an arn
653+
private static extractResourceNameFromArn(attribute: AttributeValue | undefined): string | undefined {
654+
if (typeof attribute === 'string' && attribute.startsWith('arn:aws:')) {
655+
const split = attribute.split(':');
656+
return split[split.length - 1];
657+
}
658+
659+
return undefined;
660+
}
661+
732662
/** Span kind is needed for differentiating metrics in the EMF exporter */
733663
private static setSpanKindForService(span: ReadableSpan, attributes: Attributes): void {
734664
let spanKind: string = SpanKind[span.kind];

aws-distro-opentelemetry-node-autoinstrumentation/src/patches/instrumentation-patch.ts

Lines changed: 1 addition & 100 deletions
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,6 @@ export function applyInstrumentationPatches(instrumentations: Instrumentation[])
8080
patchSqsServiceExtension(services.get('SQS'));
8181
patchSnsServiceExtension(services.get('SNS'));
8282
patchLambdaServiceExtension(services.get('Lambda'));
83-
patchKinesisServiceExtension(services.get('Kinesis'));
84-
patchDynamoDbServiceExtension(services.get('DynamoDB'));
8583
}
8684
} else if (instrumentation.instrumentationName === '@opentelemetry/instrumentation-aws-lambda') {
8785
diag.debug('Patching aws lambda instrumentation');
@@ -191,69 +189,6 @@ function patchSnsServiceExtension(snsServiceExtension: any): void {
191189
}
192190
}
193191

194-
/*
195-
* This patch extends the existing upstream extension for Kinesis. Extensions allow for custom logic for adding
196-
* service-specific information to spans, such as attributes. Specifically, we are adding logic to add
197-
* `aws.kinesis.stream.arn` attribute, to be used to generate RemoteTarget and achieve parity with the Java/Python instrumentation.
198-
*
199-
*
200-
* @param kinesisServiceExtension Kinesis Service Extension obtained the service extension list from the AWS SDK OTel Instrumentation
201-
*/
202-
function patchKinesisServiceExtension(kinesisServiceExtension: any): void {
203-
if (kinesisServiceExtension) {
204-
const requestPreSpanHook = kinesisServiceExtension.requestPreSpanHook;
205-
kinesisServiceExtension._requestPreSpanHook = requestPreSpanHook;
206-
207-
const patchedRequestPreSpanHook = (
208-
request: NormalizedRequest,
209-
_config: AwsSdkInstrumentationConfig
210-
): RequestMetadata => {
211-
const requestMetadata: RequestMetadata = kinesisServiceExtension._requestPreSpanHook(request, _config);
212-
if (requestMetadata.spanAttributes) {
213-
const streamArn = request.commandInput?.StreamARN;
214-
if (streamArn) {
215-
requestMetadata.spanAttributes[AWS_ATTRIBUTE_KEYS.AWS_KINESIS_STREAM_ARN] = streamArn;
216-
}
217-
}
218-
return requestMetadata;
219-
};
220-
221-
kinesisServiceExtension.requestPreSpanHook = patchedRequestPreSpanHook;
222-
}
223-
}
224-
225-
/*
226-
* This patch extends the existing upstream extension for DynamoDB. Extensions allow for custom logic for adding
227-
* service-specific information to spans, such as attributes. Specifically, we are adding logic to add
228-
* `aws.dynamodb.table.arn` attribute, to be used to generate RemoteTarget and achieve parity with the Java/Python instrumentation.
229-
*
230-
*
231-
* @param dynamoDbServiceExtension DynamoDB Service Extension obtained the service extension list from the AWS SDK OTel Instrumentation
232-
*/
233-
function patchDynamoDbServiceExtension(dynamoDbServiceExtension: any): void {
234-
if (dynamoDbServiceExtension) {
235-
if (typeof dynamoDbServiceExtension.responseHook === 'function') {
236-
const responseHook = dynamoDbServiceExtension.responseHook;
237-
238-
const patchedResponseHook = (
239-
response: NormalizedResponse,
240-
span: Span,
241-
tracer: Tracer,
242-
config: AwsSdkInstrumentationConfig
243-
): void => {
244-
responseHook.call(dynamoDbServiceExtension, response, span, tracer, config);
245-
246-
const tableArn = response?.data?.Table?.TableArn;
247-
if (tableArn) {
248-
span.setAttribute(AWS_ATTRIBUTE_KEYS.AWS_DYNAMODB_TABLE_ARN, tableArn);
249-
}
250-
};
251-
252-
dynamoDbServiceExtension.responseHook = patchedResponseHook;
253-
}
254-
}
255-
}
256-
257192
/*
258193
* This patch extends the existing upstream extension for Lambda. Extensions allow for custom logic for adding
259194
* service-specific information to spans, such as attributes. Specifically, we are adding logic to add
@@ -358,7 +293,7 @@ function patchAwsLambdaInstrumentation(instrumentation: Instrumentation): void {
358293
}
359294
}
360295

361-
// Override the upstream private _getV3SmithyClientSendPatch method to add middlewares to inject X-Ray Trace Context into HTTP Headers and to extract account access key id and region for cross-account support
296+
// Override the upstream private _getV3SmithyClientSendPatch method to add middleware to inject X-Ray Trace Context into HTTP Headers
362297
// https://github.com/open-telemetry/opentelemetry-js-contrib/blob/instrumentation-aws-sdk-v0.48.0/plugins/node/opentelemetry-instrumentation-aws-sdk/src/aws-sdk.ts#L373-L384
363298
const awsXrayPropagator = new AWSXRayPropagator();
364299
const V3_CLIENT_CONFIG_KEY = Symbol('opentelemetry.instrumentation.aws-sdk.client.config');
@@ -393,40 +328,6 @@ function patchAwsSdkInstrumentation(instrumentation: Instrumentation): void {
393328
}
394329
);
395330

396-
this.middlewareStack?.add(
397-
(next: any, context: any) => async (middlewareArgs: any) => {
398-
const activeContext = otelContext.active();
399-
const span = trace.getSpan(activeContext);
400-
401-
if (span) {
402-
try {
403-
const credsProvider = this.config.credentials;
404-
if (credsProvider instanceof Function) {
405-
const credentials = await credsProvider();
406-
if (credentials?.accessKeyId) {
407-
span.setAttribute(AWS_ATTRIBUTE_KEYS.AWS_AUTH_ACCOUNT_ACCESS_KEY, credentials.accessKeyId);
408-
}
409-
}
410-
if (this.config.region instanceof Function) {
411-
const region = await this.config.region();
412-
if (region) {
413-
span.setAttribute(AWS_ATTRIBUTE_KEYS.AWS_AUTH_REGION, region);
414-
}
415-
}
416-
} catch (err) {
417-
diag.debug('Failed to get auth account access key and region:', err);
418-
}
419-
}
420-
421-
return await next(middlewareArgs);
422-
},
423-
{
424-
step: 'build',
425-
name: '_adotExtractSignerCredentials',
426-
override: true,
427-
}
428-
);
429-
430331
command[V3_CLIENT_CONFIG_KEY] = this.config;
431332
return original.apply(this, [command, ...args]);
432333
};

aws-distro-opentelemetry-node-autoinstrumentation/src/regional-resource-arn-parser.ts

Lines changed: 0 additions & 38 deletions
This file was deleted.

0 commit comments

Comments
 (0)