Skip to content

Commit 1471075

Browse files
committed
add tests
1 parent a61b090 commit 1471075

File tree

4 files changed

+199
-2
lines changed

4 files changed

+199
-2
lines changed

dd-java-agent/instrumentation/aws-java-sdk-1.11.0/src/test/groovy/AWS1ClientTest.groovy

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -401,6 +401,85 @@ abstract class AWS1ClientTest extends VersionedNamingTestBase {
401401
cleanup:
402402
server.close()
403403
}
404+
405+
def "#service #operation sets peer.service in serverless environment"() {
406+
setup:
407+
408+
// Set the AWS Lambda function name environment variable
409+
injectEnvConfig("AWS_LAMBDA_FUNCTION_NAME", "my-test-lambda-function", false)
410+
411+
// Set response body
412+
responseBody.set(body)
413+
if (jsonPointerStr != null) {
414+
jsonPointer.set(jsonPointerStr)
415+
}
416+
417+
when:
418+
// Make the request
419+
def response = call.call(client)
420+
421+
// Wait for traces to be written
422+
TEST_WRITER.waitForTraces(1)
423+
424+
then:
425+
response != null
426+
427+
// Verify the trace
428+
assertTraces(1) {
429+
trace(1) {
430+
span {
431+
serviceName expectedService(service, operation)
432+
operationName expectedOperation(service, operation)
433+
resourceName "$service.$operation"
434+
spanType DDSpanTypes.HTTP_CLIENT
435+
errored false
436+
measured true
437+
parent()
438+
tags {
439+
"$Tags.COMPONENT" "java-aws-sdk"
440+
"$Tags.SPAN_KIND" Tags.SPAN_KIND_CLIENT
441+
"$Tags.HTTP_URL" "$server.address/"
442+
"$Tags.HTTP_METHOD" method
443+
"$Tags.HTTP_STATUS" 200
444+
"$Tags.PEER_PORT" server.address.port
445+
"$Tags.PEER_HOSTNAME" "localhost"
446+
"aws.service" { it.contains(service) }
447+
"aws_service" { it.contains(service.toLowerCase()) }
448+
"aws.endpoint" "$server.address"
449+
"aws.operation" "${operation}Request"
450+
"aws.agent" "java-aws-sdk"
451+
452+
// Service-specific tags
453+
for (def addedTag : additionalTags) {
454+
"$addedTag.key" "$addedTag.value"
455+
}
456+
457+
// Test specific peer service assertions in serverless
458+
"peer.service" "${server.address.host}:${server.address.port}"
459+
"_dd.peer.service.source" "peer.service"
460+
461+
defaultTags(false, true)
462+
}
463+
}
464+
}
465+
}
466+
467+
cleanup:
468+
// Clean up the environment variable
469+
removeEnvConfig("AWS_LAMBDA_FUNCTION_NAME", false)
470+
if (jsonPointerStr != null) {
471+
jsonPointer.set(null)
472+
}
473+
474+
where:
475+
service | operation | method | path | client | call | additionalTags | body | jsonPointerStr
476+
"S3" | "CreateBucket" | "PUT" | "/test-bucket/" | AmazonS3ClientBuilder.standard().withPathStyleAccessEnabled(true).withEndpointConfiguration(endpoint).withCredentials(credentialsProvider).build() | { c -> c.createBucket("test-bucket") } | ["aws.bucket.name": "test-bucket", "bucketname": "test-bucket"] | "" | null
477+
"SQS" | "CreateQueue" | "POST" | "/" | AmazonSQSClientBuilder.standard().withEndpointConfiguration(endpoint).withCredentials(credentialsProvider).build() | { c -> c.createQueue(new CreateQueueRequest("test-queue")) } | ["aws.queue.name": "test-queue", "queuename": "test-queue"] | """<CreateQueueResponse><CreateQueueResult><QueueUrl>https://queue.amazonaws.com/123456789012/test-queue</QueueUrl></CreateQueueResult><ResponseMetadata><RequestId>test-request-id</RequestId></ResponseMetadata></CreateQueueResponse>""" | "/CreateQueueResponse/CreateQueueResult"
478+
"SQS" | "SendMessage" | "POST" | "/test-queue-url" | AmazonSQSClientBuilder.standard().withEndpointConfiguration(endpoint).withCredentials(credentialsProvider).build() | { c -> c.sendMessage(new SendMessageRequest("test-queue-url", "test")) } | ["aws.queue.url": "test-queue-url"] | """<SendMessageResponse><SendMessageResult><MD5OfMessageBody>098f6bcd4621d373cade4e832627b4f6</MD5OfMessageBody><MessageId>test-msg-id</MessageId></SendMessageResult><ResponseMetadata><RequestId>test-request-id</RequestId></ResponseMetadata></SendMessageResponse>""" | "/SendMessageResponse/SendMessageResult"
479+
"SNS" | "Publish" | "POST" | "/" | AmazonSNSClientBuilder.standard().withEndpointConfiguration(endpoint).withCredentials(credentialsProvider).build() | { c -> c.publish(new PublishRequest("arn:aws:sns::123:test-topic", "test")) } | ["aws.topic.name": "test-topic", "topicname": "test-topic"] | """<PublishResponse xmlns="https://sns.amazonaws.com/doc/2010-03-31/"><PublishResult><MessageId>test-msg-id</MessageId></PublishResult><ResponseMetadata><RequestId>test-request-id</RequestId></ResponseMetadata></PublishResponse>""" | "/PublishResponse/PublishResult"
480+
"DynamoDBv2" | "CreateTable" | "POST" | "/" | AmazonDynamoDBClientBuilder.standard().withEndpointConfiguration(endpoint).withCredentials(credentialsProvider).build() | { c -> c.createTable(new CreateTableRequest("test-table", null)) } | ["aws.table.name": "test-table", "tablename": "test-table"] | "" | null
481+
"Kinesis" | "DeleteStream" | "POST" | "/" | AmazonKinesisClientBuilder.standard().withEndpointConfiguration(endpoint).withCredentials(credentialsProvider).build() | { c -> c.deleteStream(new DeleteStreamRequest().withStreamName("test-stream")) } | ["aws.stream.name": "test-stream", "streamname": "test-stream"] | "" | null
482+
}
404483
}
405484

406485
class AWS1ClientV0Test extends AWS1ClientTest {

dd-java-agent/instrumentation/aws-java-sdk-2.2/src/main/java/datadog/trace/instrumentation/aws/v2/AwsSdkClientDecorator.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -209,13 +209,13 @@ public AgentSpan onSdkRequest(
209209
}
210210

211211
// Set peer.service based on environment for serverless functions
212-
String serverlessFunction = System.getenv("AWS_LAMBDA_FUNCTION_NAME");
213-
if (serverlessFunction != null && !serverlessFunction.isEmpty()) {
212+
if (Config.get().isAwsServerless()) {
214213
URI uri = httpRequest.getUri();
215214
String hostname = uri.getHost();
216215
if (uri.getPort() != -1) {
217216
hostname = hostname + ":" + uri.getPort();
218217
}
218+
219219
span.setTag(Tags.PEER_SERVICE, hostname);
220220
span.setTag(DDTags.PEER_SERVICE_SOURCE, "peer.service");
221221
}

dd-java-agent/instrumentation/aws-java-sdk-2.2/src/test/groovy/Aws2ClientTest.groovy

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -421,6 +421,116 @@ abstract class Aws2ClientTest extends VersionedNamingTestBase {
421421
cleanup:
422422
server.close()
423423
}
424+
425+
def "#service #operation sets peer.service in serverless environment"() {
426+
setup:
427+
428+
if (version() == 0) {
429+
return
430+
}
431+
432+
// Set the AWS Lambda function name environment variable
433+
injectEnvConfig("AWS_LAMBDA_FUNCTION_NAME", "my-test-lambda-function", false)
434+
435+
// Create client with mocked endpoint
436+
def client = builder
437+
.endpointOverride(server.address)
438+
.region(Region.US_EAST_1)
439+
.credentialsProvider(CREDENTIALS_PROVIDER)
440+
.build()
441+
442+
// Set response body
443+
responseBody.set(body)
444+
445+
when:
446+
// Make the request
447+
def response = call.call(client)
448+
449+
if (response instanceof Future) {
450+
response = response.get()
451+
}
452+
453+
// Wait for traces to be written
454+
TEST_WRITER.waitForTraces(1)
455+
456+
then:
457+
response != null
458+
459+
// Verify the trace
460+
assertTraces(1) {
461+
trace(1) {
462+
span {
463+
serviceName expectedService(service, operation)
464+
operationName expectedOperation(service, operation)
465+
resourceName "$service.$operation"
466+
spanType DDSpanTypes.HTTP_CLIENT
467+
errored false
468+
measured true
469+
parent()
470+
tags {
471+
defaultTags(false, true)
472+
473+
// AWS specific tags
474+
"aws.service" service
475+
"aws_service" service
476+
"aws.operation" operation
477+
"aws.agent" "java-aws-sdk"
478+
"aws.requestId" requestId
479+
480+
// HTTP tags
481+
"$Tags.HTTP_METHOD" method
482+
"$Tags.HTTP_STATUS" 200
483+
"$Tags.HTTP_URL" String
484+
485+
// Peer tags
486+
"$Tags.PEER_HOSTNAME" "localhost"
487+
"$Tags.PEER_PORT" server.address.port
488+
"$Tags.SPAN_KIND" Tags.SPAN_KIND_CLIENT
489+
"$Tags.COMPONENT" "java-aws-sdk"
490+
491+
// Service-specific tags
492+
if (service == "S3") {
493+
"aws.bucket.name" "test-bucket"
494+
"bucketname" "test-bucket"
495+
} else if (service == "Sqs" && operation == "CreateQueue") {
496+
"aws.queue.name" "test-queue"
497+
"queuename" "test-queue"
498+
} else if (service == "Sqs" && operation == "SendMessage") {
499+
"aws.queue.url" "test-queue-url"
500+
} else if (service == "Sns" && operation == "Publish") {
501+
"aws.topic.name" "test-topic"
502+
"topicname" "test-topic"
503+
} else if (service == "DynamoDb") {
504+
"aws.table.name" "test-table"
505+
"tablename" "test-table"
506+
} else if (service == "Kinesis") {
507+
"aws.stream.name" "test-stream"
508+
"streamname" "test-stream"
509+
}
510+
511+
urlTags("${server.address}${path}", ExpectedQueryParams.getExpectedQueryParams(operation))
512+
513+
// Test specific peer service assertions in serverless
514+
"peer.service" "${server.address.host}:${server.address.port}"
515+
"_dd.peer.service.source" "peer.service"
516+
}
517+
}
518+
}
519+
}
520+
521+
cleanup:
522+
// Clean up the environment variable
523+
removeEnvConfig("AWS_LAMBDA_FUNCTION_NAME", false)
524+
525+
where:
526+
service | operation | method | path | builder | call | body | requestId
527+
"S3" | "CreateBucket" | "PUT" | "/test-bucket" | S3Client.builder() | { c -> c.createBucket(CreateBucketRequest.builder().bucket("test-bucket").build()) } | "" | "UNKNOWN"
528+
"Sqs" | "CreateQueue" | "POST" | "/" | SqsClient.builder() | { c -> c.createQueue(CreateQueueRequest.builder().queueName("test-queue").build()) } | """<CreateQueueResponse><CreateQueueResult><QueueUrl>https://queue.amazonaws.com/123456789012/test-queue</QueueUrl></CreateQueueResult><ResponseMetadata><RequestId>test-request-id</RequestId></ResponseMetadata></CreateQueueResponse>""" | "test-request-id"
529+
"Sqs" | "SendMessage" | "POST" | "/" | SqsClient.builder() | { c -> c.sendMessage(SendMessageRequest.builder().queueUrl("test-queue-url").messageBody("test").build()) } | """<SendMessageResponse><SendMessageResult><MD5OfMessageBody>098f6bcd4621d373cade4e832627b4f6</MD5OfMessageBody><MessageId>test-msg-id</MessageId></SendMessageResult><ResponseMetadata><RequestId>test-request-id</RequestId></ResponseMetadata></SendMessageResponse>""" | "test-request-id"
530+
"Sns" | "Publish" | "POST" | "/" | SnsClient.builder() | { c -> c.publish(PublishRequest.builder().topicArn("arn:aws:sns::123:test-topic").message("test").build()) } | """<PublishResponse xmlns="https://sns.amazonaws.com/doc/2010-03-31/"><PublishResult><MessageId>test-msg-id</MessageId></PublishResult><ResponseMetadata><RequestId>test-request-id</RequestId></ResponseMetadata></PublishResponse>""" | "test-request-id"
531+
"DynamoDb" | "CreateTable" | "POST" | "/" | DynamoDbClient.builder() | { c -> c.createTable(CreateTableRequest.builder().tableName("test-table").build()) } | "" | "UNKNOWN"
532+
"Kinesis" | "DeleteStream" | "POST" | "/" | KinesisClient.builder() | { c -> c.deleteStream(DeleteStreamRequest.builder().streamName("test-stream").build()) } | "" | "UNKNOWN"
533+
}
424534
}
425535

426536
class Aws2ClientV0ForkedTest extends Aws2ClientTest {

internal-api/src/main/java/datadog/trace/api/Config.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1166,6 +1166,7 @@ public static String getHostName() {
11661166

11671167
private final boolean azureAppServices;
11681168
private final boolean azureFunctions;
1169+
private final boolean awsServerless;
11691170
private final String traceAgentPath;
11701171
private final List<String> traceAgentArgs;
11711172
private final String dogStatsDPath;
@@ -1485,6 +1486,9 @@ private Config(final ConfigProvider configProvider, final InstrumenterConfig ins
14851486
azureFunctions =
14861487
getEnv("FUNCTIONS_WORKER_RUNTIME") != null && getEnv("FUNCTIONS_EXTENSION_VERSION") != null;
14871488

1489+
awsServerless =
1490+
getEnv("AWS_LAMBDA_FUNCTION_NAME") != null && !getEnv("AWS_LAMBDA_FUNCTION_NAME").isEmpty();
1491+
14881492
spanAttributeSchemaVersion = schemaVersionFromConfig();
14891493

14901494
peerHostNameEnabled = configProvider.getBoolean(TRACE_PEER_HOSTNAME_ENABLED, true);
@@ -4268,6 +4272,10 @@ public boolean isAzureAppServices() {
42684272
return azureAppServices;
42694273
}
42704274

4275+
public boolean isAwsServerless() {
4276+
return awsServerless;
4277+
}
4278+
42714279
public boolean isDataStreamsEnabled() {
42724280
return dataStreamsEnabled;
42734281
}

0 commit comments

Comments
 (0)