Skip to content

Commit d684596

Browse files
committed
added instrumentation patching unit tests + linting fix
1 parent 7ab675f commit d684596

File tree

9 files changed

+338
-154
lines changed

9 files changed

+338
-154
lines changed

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

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ export const AWS_ATTRIBUTE_KEYS: { [key: string]: string } = {
1414
AWS_REMOTE_RESOURCE_IDENTIFIER: 'aws.remote.resource.identifier',
1515
AWS_SDK_DESCENDANT: 'aws.sdk.descendant',
1616
AWS_CONSUMER_PARENT_SPAN_KIND: 'aws.consumer.parent.span.kind',
17-
AWS_CLOUDFORMATION_PRIMARY_IDENTIFIER: "aws.remote.resource.cfn.primary.identifier",
17+
AWS_CLOUDFORMATION_PRIMARY_IDENTIFIER: 'aws.remote.resource.cfn.primary.identifier',
1818

1919
AWS_REMOTE_TARGET: 'aws.remote.target',
2020
AWS_REMOTE_DB_USER: 'aws.remote.db.user',
@@ -37,10 +37,10 @@ export const AWS_ATTRIBUTE_KEYS: { [key: string]: string } = {
3737
AWS_BEDROCK_AGENT_ID: 'aws.bedrock.agent.id',
3838
AWS_BEDROCK_GUARDRAIL_ID: 'aws.bedrock.guardrail.id',
3939
AWS_SNS_TOPIC_ARN: 'aws.sns.topic.arn',
40-
AWS_SECRETSMANAGER_SECRET_ARN: "aws.secretsmanager.secret.arn",
41-
AWS_STEPFUNCTIONS_STATEMACHINE_ARN: "aws.stepfunctions.state_machine.arn",
42-
AWS_STEPFUNCTIONS_ACTIVITY_ARN: "aws.stepfunctions.activity.arn",
43-
AWS_LAMBDA_FUNCTION_NAME: "aws.lambda.function.name",
44-
AWS_LAMBDA_RESOURCE_MAPPING_ID: "aws.lambda.resource_mapping.id",
45-
AWS_LAMBDA_FUNCTION_ARN: "aws.lambda.function.arn",
40+
AWS_SECRETSMANAGER_SECRET_ARN: 'aws.secretsmanager.secret.arn',
41+
AWS_STEPFUNCTIONS_STATEMACHINE_ARN: 'aws.stepfunctions.state_machine.arn',
42+
AWS_STEPFUNCTIONS_ACTIVITY_ARN: 'aws.stepfunctions.activity.arn',
43+
AWS_LAMBDA_FUNCTION_NAME: 'aws.lambda.function.name',
44+
AWS_LAMBDA_RESOURCE_MAPPING_ID: 'aws.lambda.resource_mapping.id',
45+
AWS_LAMBDA_FUNCTION_ARN: 'aws.lambda.function.arn',
4646
};

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

Lines changed: 18 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,9 @@ const NORMALIZED_KINESIS_SERVICE_NAME: string = 'AWS::Kinesis';
5656
const NORMALIZED_S3_SERVICE_NAME: string = 'AWS::S3';
5757
const NORMALIZED_SQS_SERVICE_NAME: string = 'AWS::SQS';
5858
const NORMALIZED_SNS_SERVICE_NAME: string = 'AWS::SNS';
59-
const NORMALIZED_SECRETSMANAGER_SERVICE_NAME = "AWS::SecretsManager";
60-
const NORMALIZED_STEPFUNCTIONS_SERVICE_NAME = "AWS::StepFunctions";
61-
const NORMALIZED_LAMBDA_SERVICE_NAME = "AWS::Lambda"
59+
const NORMALIZED_SECRETSMANAGER_SERVICE_NAME = 'AWS::SecretsManager';
60+
const NORMALIZED_STEPFUNCTIONS_SERVICE_NAME = 'AWS::StepFunctions';
61+
const NORMALIZED_LAMBDA_SERVICE_NAME = 'AWS::Lambda';
6262
const NORMALIZED_BEDROCK_SERVICE_NAME: string = 'AWS::Bedrock';
6363
const NORMALIZED_BEDROCK_RUNTIME_SERVICE_NAME: string = 'AWS::BedrockRuntime';
6464

@@ -376,43 +376,37 @@ export class AwsMetricAttributeGenerator implements MetricAttributeGenerator {
376376
span.attributes[AWS_ATTRIBUTE_KEYS.AWS_S3_BUCKET]
377377
);
378378
} else if (AwsSpanProcessingUtil.isKeyPresent(span, AWS_ATTRIBUTE_KEYS.AWS_SNS_TOPIC_ARN)) {
379-
const snsArn = span.attributes[AWS_ATTRIBUTE_KEYS.AWS_SNS_TOPIC_ARN]
380-
379+
const snsArn = span.attributes[AWS_ATTRIBUTE_KEYS.AWS_SNS_TOPIC_ARN];
380+
381381
remoteResourceType = NORMALIZED_SNS_SERVICE_NAME + '::Topic';
382-
remoteResourceIdentifier = AwsMetricAttributeGenerator.escapeDelimiters(
383-
this.simplifyARNAttribute(snsArn)
384-
);
382+
remoteResourceIdentifier = AwsMetricAttributeGenerator.escapeDelimiters(this.simplifyARNAttribute(snsArn));
385383
cloudFormationIdentifier = AwsMetricAttributeGenerator.escapeDelimiters(snsArn);
386384
} else if (AwsSpanProcessingUtil.isKeyPresent(span, AWS_ATTRIBUTE_KEYS.AWS_SECRETSMANAGER_SECRET_ARN)) {
387-
const secretsArn = span.attributes[AWS_ATTRIBUTE_KEYS.AWS_SECRETSMANAGER_SECRET_ARN]
385+
const secretsArn = span.attributes[AWS_ATTRIBUTE_KEYS.AWS_SECRETSMANAGER_SECRET_ARN];
388386

389387
remoteResourceType = NORMALIZED_SECRETSMANAGER_SERVICE_NAME + '::Secret';
390-
remoteResourceIdentifier = AwsMetricAttributeGenerator.escapeDelimiters(
391-
this.simplifyARNAttribute(secretsArn)
392-
);
393-
cloudFormationIdentifier = AwsMetricAttributeGenerator.escapeDelimiters(secretsArn)
388+
remoteResourceIdentifier = AwsMetricAttributeGenerator.escapeDelimiters(this.simplifyARNAttribute(secretsArn));
389+
cloudFormationIdentifier = AwsMetricAttributeGenerator.escapeDelimiters(secretsArn);
394390
} else if (AwsSpanProcessingUtil.isKeyPresent(span, AWS_ATTRIBUTE_KEYS.AWS_STEPFUNCTIONS_STATEMACHINE_ARN)) {
395-
const stateMachineArn = span.attributes[AWS_ATTRIBUTE_KEYS.AWS_STEPFUNCTIONS_STATEMACHINE_ARN]
396-
391+
const stateMachineArn = span.attributes[AWS_ATTRIBUTE_KEYS.AWS_STEPFUNCTIONS_STATEMACHINE_ARN];
392+
397393
remoteResourceType = NORMALIZED_STEPFUNCTIONS_SERVICE_NAME + '::StateMachine';
398394
remoteResourceIdentifier = AwsMetricAttributeGenerator.escapeDelimiters(
399395
this.simplifyARNAttribute(stateMachineArn)
400396
);
401397
cloudFormationIdentifier = AwsMetricAttributeGenerator.escapeDelimiters(stateMachineArn);
402398
} else if (AwsSpanProcessingUtil.isKeyPresent(span, AWS_ATTRIBUTE_KEYS.AWS_STEPFUNCTIONS_ACTIVITY_ARN)) {
403-
const activityArn = span.attributes[AWS_ATTRIBUTE_KEYS.AWS_STEPFUNCTIONS_ACTIVITY_ARN]
404-
399+
const activityArn = span.attributes[AWS_ATTRIBUTE_KEYS.AWS_STEPFUNCTIONS_ACTIVITY_ARN];
400+
405401
remoteResourceType = NORMALIZED_STEPFUNCTIONS_SERVICE_NAME + '::Activity';
406-
remoteResourceIdentifier = AwsMetricAttributeGenerator.escapeDelimiters(
407-
this.simplifyARNAttribute(activityArn)
408-
);
402+
remoteResourceIdentifier = AwsMetricAttributeGenerator.escapeDelimiters(this.simplifyARNAttribute(activityArn));
409403
cloudFormationIdentifier = AwsMetricAttributeGenerator.escapeDelimiters(activityArn);
410404
} else if (AwsSpanProcessingUtil.isKeyPresent(span, AWS_ATTRIBUTE_KEYS.AWS_LAMBDA_FUNCTION_NAME)) {
411405
remoteResourceType = NORMALIZED_LAMBDA_SERVICE_NAME + '::Function';
412406
remoteResourceIdentifier = AwsMetricAttributeGenerator.escapeDelimiters(
413407
span.attributes[AWS_ATTRIBUTE_KEYS.AWS_LAMBDA_FUNCTION_NAME]
414408
);
415-
cloudFormationIdentifier = span.attributes[AWS_ATTRIBUTE_KEYS.AWS_LAMBDA_FUNCTION_ARN]
409+
cloudFormationIdentifier = span.attributes[AWS_ATTRIBUTE_KEYS.AWS_LAMBDA_FUNCTION_ARN];
416410
} else if (AwsSpanProcessingUtil.isKeyPresent(span, AWS_ATTRIBUTE_KEYS.AWS_LAMBDA_RESOURCEMAPPING_ID)) {
417411
remoteResourceType = NORMALIZED_LAMBDA_SERVICE_NAME + '::EventSourceMapping';
418412
remoteResourceIdentifier = AwsMetricAttributeGenerator.escapeDelimiters(
@@ -585,12 +579,12 @@ export class AwsMetricAttributeGenerator implements MetricAttributeGenerator {
585579
}
586580

587581
private static simplifyARNAttribute(attribute: AttributeValue | undefined) {
588-
if (typeof attribute == 'string' && attribute.startsWith("arn:aws:")) {
589-
const split = attribute.split(":");
582+
if (typeof attribute == 'string' && attribute.startsWith('arn:aws:')) {
583+
const split = attribute.split(':');
590584
return split[split.length - 1];
591585
}
592586

593-
return ''
587+
return '';
594588
}
595589

596590
/** Span kind is needed for differentiating metrics in the EMF exporter */

aws-distro-opentelemetry-node-autoinstrumentation/src/patches/aws/services/lambda.ts

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,11 @@
22
// SPDX-License-Identifier: Apache-2.0
33

44
import { Attributes, Span, SpanKind, Tracer } from '@opentelemetry/api';
5-
import { AwsSdkInstrumentationConfig, NormalizedRequest, NormalizedResponse } from '@opentelemetry/instrumentation-aws-sdk';
5+
import {
6+
AwsSdkInstrumentationConfig,
7+
NormalizedRequest,
8+
NormalizedResponse,
9+
} from '@opentelemetry/instrumentation-aws-sdk';
610
import { AWS_ATTRIBUTE_KEYS } from '../../../aws-attribute-keys';
711
import { RequestMetadata, ServiceExtension } from '../../../third-party/otel/aws/services/ServiceExtension';
812

@@ -19,16 +23,16 @@ export class LambdaServiceExtension implements ServiceExtension {
1923
let functionName = requestFunctionName;
2024

2125
if (requestFunctionName) {
22-
if (requestFunctionName.startsWith("arn:aws:lambda:")) {
23-
const split = requestFunctionName.split(":")
24-
functionName = split[split.length - 1];
25-
}
26-
27-
spanAttributes[AWS_ATTRIBUTE_KEYS.AWS_LAMBDA_FUNCTION_NAME] = functionName;
26+
if (requestFunctionName.startsWith('arn:aws:lambda:')) {
27+
const split = requestFunctionName.split(':');
28+
functionName = split[split.length - 1];
29+
}
30+
31+
spanAttributes[AWS_ATTRIBUTE_KEYS.AWS_LAMBDA_FUNCTION_NAME] = functionName;
2832
}
2933

3034
if (resourceMappingId) {
31-
spanAttributes[AWS_ATTRIBUTE_KEYS.AWS_LAMBDA_RESOURCE_MAPPING_ID] = resourceMappingId;
35+
spanAttributes[AWS_ATTRIBUTE_KEYS.AWS_LAMBDA_RESOURCE_MAPPING_ID] = resourceMappingId;
3236
}
3337

3438
const isIncoming = false;
@@ -42,15 +46,12 @@ export class LambdaServiceExtension implements ServiceExtension {
4246
}
4347

4448
responseHook(response: NormalizedResponse, span: Span, tracer: Tracer, config: AwsSdkInstrumentationConfig): void {
45-
4649
if (response.data.Configuration) {
47-
4850
const functionArn = response.data.Configuration.FunctionArn;
4951

5052
if (functionArn) {
5153
span.setAttribute(AWS_ATTRIBUTE_KEYS.AWS_LAMBDA_FUNCTION_ARN, functionArn);
5254
}
5355
}
5456
}
55-
5657
}

aws-distro-opentelemetry-node-autoinstrumentation/src/patches/aws/services/secretsmanager.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,15 @@
22
// SPDX-License-Identifier: Apache-2.0
33

44
import { Attributes, Span, SpanKind, Tracer } from '@opentelemetry/api';
5-
import { AwsSdkInstrumentationConfig, NormalizedRequest, NormalizedResponse } from '@opentelemetry/instrumentation-aws-sdk';
5+
import {
6+
AwsSdkInstrumentationConfig,
7+
NormalizedRequest,
8+
NormalizedResponse,
9+
} from '@opentelemetry/instrumentation-aws-sdk';
610
import { AWS_ATTRIBUTE_KEYS } from '../../../aws-attribute-keys';
711
import { RequestMetadata, ServiceExtension } from '../../../third-party/otel/aws/services/ServiceExtension';
812

913
export class SecretsManagerServiceExtension implements ServiceExtension {
10-
1114
requestPreSpanHook(request: NormalizedRequest, _config: AwsSdkInstrumentationConfig): RequestMetadata {
1215
const secretId = request.commandInput?.SecretId;
1316

@@ -16,7 +19,7 @@ export class SecretsManagerServiceExtension implements ServiceExtension {
1619

1720
const spanAttributes: Attributes = {};
1821

19-
if (secretId && secretId.startsWith("arn:aws:secretsmanager:")) {
22+
if (secretId && secretId.startsWith('arn:aws:secretsmanager:')) {
2023
spanAttributes[AWS_ATTRIBUTE_KEYS.AWS_SECRETSMANAGER_SECRET_ARN] = secretId;
2124
}
2225

@@ -32,7 +35,7 @@ export class SecretsManagerServiceExtension implements ServiceExtension {
3235

3336
responseHook(response: NormalizedResponse, span: Span, tracer: Tracer, config: AwsSdkInstrumentationConfig): void {
3437
const secret_arn = response.data.ARN;
35-
38+
3639
if (secret_arn) {
3740
span.setAttribute(AWS_ATTRIBUTE_KEYS.AWS_SECRETSMANAGER_SECRET_ARN, secret_arn);
3841
}

aws-distro-opentelemetry-node-autoinstrumentation/test/patches/aws/services/lamba.test.ts

Lines changed: 39 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -30,59 +30,64 @@ describe('Lambda', () => {
3030
},
3131
});
3232
});
33-
33+
3434
describe('GetFunction', () => {
3535
{
36-
it(`span has lambda functionName and function ARN in its attributes`, async () => {
37-
const funcName = 'testFunction'
38-
const arn = 'arn:aws:lambda:us-east-1:123456789012:function:testFunction'
36+
it('span has lambda functionName and function ARN in its attributes', async () => {
37+
const funcName = 'testFunction';
38+
const arn = 'arn:aws:lambda:us-east-1:123456789012:function:testFunction';
3939

40-
nock(`https://lambda.${region}.amazonaws.com/`).get(/.*/).reply(200, {
40+
nock(`https://lambda.${region}.amazonaws.com/`)
41+
.get(/.*/)
42+
.reply(200, {
4143
Configuration: {
42-
FunctionArn: arn
43-
}
44+
FunctionArn: arn,
45+
},
4446
});
45-
46-
await lambda.getFunction({
47+
48+
await lambda
49+
.getFunction({
4750
FunctionName: funcName,
48-
}).catch((err: any) => {});
49-
50-
const testSpans: ReadableSpan[] = getTestSpans();
51-
const getFunctionNameSpans: ReadableSpan[] = testSpans.filter((s: ReadableSpan) => {
52-
return s.name === 'Lambda.GetFunction';
53-
});
54-
55-
expect(getFunctionNameSpans.length).toBe(1);
56-
57-
const functionAttributeSpan = getFunctionNameSpans[0];
58-
59-
expect(functionAttributeSpan.attributes[AWS_ATTRIBUTE_KEYS.AWS_LAMBDA_FUNCTION_NAME]).toBe(funcName);
60-
expect(functionAttributeSpan.attributes[AWS_ATTRIBUTE_KEYS.AWS_LAMBDA_FUNCTION_ARN]).toBe(arn);
61-
expect(functionAttributeSpan.kind).toBe(SpanKind.CLIENT);
51+
})
52+
.catch((err: any) => {});
53+
54+
const testSpans: ReadableSpan[] = getTestSpans();
55+
const getFunctionNameSpans: ReadableSpan[] = testSpans.filter((s: ReadableSpan) => {
56+
return s.name === 'Lambda.GetFunction';
6257
});
63-
}
58+
59+
expect(getFunctionNameSpans.length).toBe(1);
60+
61+
const functionAttributeSpan = getFunctionNameSpans[0];
62+
63+
expect(functionAttributeSpan.attributes[AWS_ATTRIBUTE_KEYS.AWS_LAMBDA_FUNCTION_NAME]).toBe(funcName);
64+
expect(functionAttributeSpan.attributes[AWS_ATTRIBUTE_KEYS.AWS_LAMBDA_FUNCTION_ARN]).toBe(arn);
65+
expect(functionAttributeSpan.kind).toBe(SpanKind.CLIENT);
66+
});
67+
}
6468
});
6569

6670
describe('GetEventSourceMapping', () => {
67-
68-
it(`span has eventSourceMapping attribute in its attributes`, async () => {
69-
const uuid = '14e0db71-abcd-4eb5-b481-8945cf9d10c2'
71+
it('span has eventSourceMapping attribute in its attributes', async () => {
72+
const uuid = '14e0db71-abcd-4eb5-b481-8945cf9d10c2';
7073

7174
nock(`https://lambda.${region}.amazonaws.com/`).post('/').reply(200, {});
72-
73-
await lambda.getEventSourceMapping({
74-
UUID: uuid,
75-
}).catch((err: any) => {});
75+
76+
await lambda
77+
.getEventSourceMapping({
78+
UUID: uuid,
79+
})
80+
.catch((err: any) => {});
7681

7782
const testSpans: ReadableSpan[] = getTestSpans();
7883
const getEventSourceMappingSpans: ReadableSpan[] = testSpans.filter((s: ReadableSpan) => {
7984
return s.name === 'Lambda.GetEventSourceMapping';
8085
});
81-
86+
8287
expect(getEventSourceMappingSpans.length).toBe(1);
83-
88+
8489
const eventSourceMappingSpan = getEventSourceMappingSpans[0];
85-
90+
8691
expect(eventSourceMappingSpan.attributes[AWS_ATTRIBUTE_KEYS.AWS_LAMBDA_RESOURCE_MAPPING_ID]).toBe(uuid);
8792
expect(eventSourceMappingSpan.kind).toBe(SpanKind.CLIENT);
8893
});

0 commit comments

Comments
 (0)