@@ -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
426536class Aws2ClientV0ForkedTest extends Aws2ClientTest {
0 commit comments