diff --git a/aws-xray-recorder-sdk-aws-sdk/src/main/resources/com/amazonaws/xray/handlers/DefaultOperationParameterWhitelist.json b/aws-xray-recorder-sdk-aws-sdk/src/main/resources/com/amazonaws/xray/handlers/DefaultOperationParameterWhitelist.json index 56b29157..05bead96 100644 --- a/aws-xray-recorder-sdk-aws-sdk/src/main/resources/com/amazonaws/xray/handlers/DefaultOperationParameterWhitelist.json +++ b/aws-xray-recorder-sdk-aws-sdk/src/main/resources/com/amazonaws/xray/handlers/DefaultOperationParameterWhitelist.json @@ -325,6 +325,409 @@ ] } } + }, + "Amazon S3": { + "operations": { + "CopyObject": { + "request_parameters": [ + "SourceBucketName", + "SourceKey", + "DestinationBucketName", + "DestinationKey" + ] + }, + "CopyPart": { + "request_parameters": [ + "SourceBucketName", + "SourceKey", + "DestinationBucketName", + "DestinationKey" + ] + }, + "GetObject": { + "request_parameters": [ + "Key", + "VersionId", + "BucketName" + ] + }, + "PutObject": { + "request_parameters": [ + "Key", + "BucketName" + ] + }, + "GetObjectAcl": { + "request_parameters": [ + "Key", + "VersionId", + "BucketName" + ] + }, + "CreateBucket": { + "request_parameters": [ + "BucketName" + ] + }, + "ListObjectsV2": { + "request_parameters": [ + "Prefix", + "BucketName" + ] + }, + "ListObjects": { + "request_parameters": [ + "Prefix", + "BucketName" + ] + }, + "GetObjectTagging": { + "request_parameters": [ + "Key", + "VersionId", + "BucketName" + ] + }, + "SetObjectTagging": { + "request_parameters": [ + "Key", + "VersionId", + "BucketName" + ] + }, + "ListVersions": { + "request_parameters": [ + "Prefix", + "BucketName" + ] + }, + "SetObjectAcl": { + "request_parameters": [ + "Key", + "VersionId", + "BucketName" + ] + }, + "GetBucketAcl": { + "request_parameters": [ + "BucketName" + ] + }, + "SetBucketAcl": { + "request_parameters": [ + "BucketName" + ] + }, + "HeadBucket": { + "request_parameters": [ + "BucketName" + ] + }, + "UploadPart": { + "request_parameters": [ + "Key", + "BucketName" + ] + }, + "DeleteObject": { + "request_parameters": [ + "Key", + "BucketName" + ] + }, + "DeleteBucket": { + "request_parameters": [ + "BucketName" + ] + }, + "DeleteObjects": { + "request_parameters": [ + "BucketName" + ] + }, + "DeleteVersion": { + "request_parameters": [ + "Key", + "VersionId", + "BucketName" + ] + }, + "GetBucketPolicy": { + "request_parameters": [ + "BucketName" + ] + }, + "SetBucketPolicy": { + "request_parameters": [ + "BucketName" + ] + }, + "ListParts": { + "request_parameters": [ + "Key", + "BucketName" + ] + }, + "RestoreObject": { + "request_parameters": [ + "Key", + "VersionId", + "BucketName" + ] + }, + "RestoreObjectV2": { + "request_parameters": [ + "Key", + "VersionId", + "BucketName" + ] + }, + "SetBucketNotificationConfiguration": { + "request_parameters": [ + "BucketName" + ] + }, + "DeleteBucketLifecycleConfiguration": { + "request_parameters": [ + "BucketName" + ] + }, + "GetBucketNotificationConfiguration": { + "request_parameters": [ + "BucketName" + ] + }, + "DeleteBucketCrossOriginConfiguration": { + "request_parameters": [ + "BucketName" + ] + }, + "SetBucketCrossOriginConfiguration": { + "request_parameters": [ + "BucketName" + ] + }, + "GetBucketCrossOriginConfiguration": { + "request_parameters": [ + "BucketName" + ] + }, + "ListBucketInventoryConfigurations": { + "request_parameters": [ + "BucketName" + ] + }, + "GetBucketReplicationConfiguration": { + "request_parameters": [ + "BucketName" + ] + }, + "SetBucketReplicationConfiguration": { + "request_parameters": [ + "BucketName" + ] + }, + "DeleteBucketReplicationConfiguration": { + "request_parameters": [ + "BucketName" + ] + }, + "DeleteBucketAnalyticsConfiguration": { + "request_parameters": [ + "BucketName" + ] + }, + "DeleteBucketInventoryConfiguration": { + "request_parameters": [ + "BucketName" + ] + }, + "ListBucketAnalyticsConfigurations": { + "request_parameters": [ + "BucketName" + ] + }, + "DeleteObjectTagging": { + "request_parameters": [ + "Key", + "VersionId", + "BucketName" + ] + }, + "SetBucketVersioningConfiguration": { + "request_parameters": [ + "BucketName" + ] + }, + "GetBucketVersioningConfiguration": { + "request_parameters": [ + "BucketName" + ] + }, + "GetBucketWebsiteConfiguration": { + "request_parameters": [ + "BucketName" + ] + }, + "GetBucketLifecycleConfiguration": { + "request_parameters": [ + "BucketName" + ] + }, + "SetBucketLifecycleConfiguration": { + "request_parameters": [ + "BucketName" + ] + }, + "GetBucketTaggingConfiguration": { + "request_parameters": [ + "BucketName" + ] + }, + "SetBucketTaggingConfiguration": { + "request_parameters": [ + "BucketName" + ] + }, + "GetObjectMetadata": { + "request_parameters": [ + "Key", + "VersionId", + "BucketName" + ] + }, + "GetBucketLocation": { + "request_parameters": [ + "BucketName" + ] + }, + "GetBucketLoggingConfiguration": { + "request_parameters": [ + "BucketName" + ] + }, + "ListMultipartUploads": { + "request_parameters": [ + "Prefix", + "BucketName" + ] + }, + "DeleteBucketPolicy": { + "request_parameters": [ + "BucketName" + ] + }, + "DeleteBucketEncryption": { + "request_parameters": [ + "BucketName" + ] + }, + "SetBucketAccelerateConfiguration": { + "request_parameters": [ + "BucketName" + ] + }, + "SetBucketWebsiteConfiguration": { + "request_parameters": [ + "BucketName" + ] + }, + "CompleteMultipartUpload": { + "request_parameters": [ + "Key", + "BucketName" + ] + }, + "InitiateMultipartUpload": { + "request_parameters": [ + "Key", + "BucketName" + ] + }, + "SetBucketEncryption": { + "request_parameters": [ + "BucketName" + ] + }, + "SetBucketLoggingConfiguration": { + "request_parameters": [ + "BucketName" + ] + }, + "DeleteBucketWebsiteConfiguration": { + "request_parameters": [ + "BucketName" + ] + }, + "GetBucketEncryption": { + "request_parameters": [ + "BucketName" + ] + }, + "AbortMultipartUpload": { + "request_parameters": [ + "Key", + "BucketName" + ] + }, + "GeneratePresignedUrl": { + "request_parameters": [ + "Key", + "VersionId", + "BucketName" + ] + }, + "DeleteBucketTaggingConfiguration": { + "request_parameters": [ + "BucketName" + ] + }, + "GetBucketAccelerateConfiguration": { + "request_parameters": [ + "BucketName" + ] + }, + "GetBucketMetricsConfiguration": { + "request_parameters": [ + "BucketName" + ] + }, + "ListBucketMetricsConfigurations": { + "request_parameters": [ + "BucketName" + ] + }, + "SetBucketInventoryConfiguration": { + "request_parameters": [ + "BucketName" + ] + }, + "SetBucketMetricsConfiguration": { + "request_parameters": [ + "BucketName" + ] + }, + "SetBucketAnalyticsConfiguration": { + "request_parameters": [ + "BucketName" + ] + }, + "DeleteBucketMetricsConfiguration": { + "request_parameters": [ + "BucketName" + ] + }, + "GetBucketAnalyticsConfiguration": { + "request_parameters": [ + "BucketName" + ] + }, + "GetBucketInventoryConfiguration": { + "request_parameters": [ + "BucketName" + ] + } + } } } } diff --git a/aws-xray-recorder-sdk-aws-sdk/src/test/java/com/amazonaws/xray/handlers/TracingHandlerTest.java b/aws-xray-recorder-sdk-aws-sdk/src/test/java/com/amazonaws/xray/handlers/TracingHandlerTest.java index 661abbc1..58d93fb9 100644 --- a/aws-xray-recorder-sdk-aws-sdk/src/test/java/com/amazonaws/xray/handlers/TracingHandlerTest.java +++ b/aws-xray-recorder-sdk-aws-sdk/src/test/java/com/amazonaws/xray/handlers/TracingHandlerTest.java @@ -2,12 +2,14 @@ import java.io.ByteArrayInputStream; import java.io.IOException; +import java.io.InputStream; import java.nio.charset.StandardCharsets; import org.apache.http.HttpResponse; import org.apache.http.HttpVersion; import org.apache.http.client.methods.HttpUriRequest; import org.apache.http.entity.BasicHttpEntity; +import org.apache.http.impl.io.EmptyInputStream; import org.apache.http.message.BasicHttpResponse; import org.apache.http.message.BasicStatusLine; import org.apache.http.protocol.HttpContext; @@ -29,6 +31,8 @@ import com.amazonaws.services.lambda.AWSLambdaClientBuilder; import com.amazonaws.services.lambda.model.InvokeRequest; import com.amazonaws.services.lambda.model.InvokeResult; +import com.amazonaws.services.s3.AmazonS3; +import com.amazonaws.services.s3.AmazonS3ClientBuilder; import com.amazonaws.xray.AWSXRay; import com.amazonaws.xray.AWSXRayRecorderBuilder; import com.amazonaws.xray.emitters.Emitter; @@ -45,26 +49,35 @@ public void setupAWSXRay() { AWSXRay.setGlobalRecorder(AWSXRayRecorderBuilder.standard().withEmitter(blankEmitter).build()); AWSXRay.clearTraceEntity(); } - - @Test - public void testLambdaInvokeSubsegmentContainsFunctionName() { - // Setup test - AWSLambda lambda = AWSLambdaClientBuilder.standard().withRequestHandlers(new TracingHandler()).withRegion(Regions.US_EAST_1).withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials("fake", "fake"))).build(); - + + private void mockHttpClient(Object client, String responseContent) { AmazonHttpClient amazonHttpClient = new AmazonHttpClient(new ClientConfiguration()); ConnectionManagerAwareHttpClient apacheHttpClient = Mockito.mock(ConnectionManagerAwareHttpClient.class); HttpResponse httpResponse = new BasicHttpResponse(new BasicStatusLine(HttpVersion.HTTP_1_1, 200, "OK")); BasicHttpEntity responseBody = new BasicHttpEntity(); - responseBody.setContent(new ByteArrayInputStream("null".getBytes(StandardCharsets.UTF_8))); // Lambda returns "null" on successful fn. with no return value + InputStream in = EmptyInputStream.INSTANCE; + if(null != responseContent && !responseContent.isEmpty()) { + in = new ByteArrayInputStream(responseContent.getBytes(StandardCharsets.UTF_8)); + } + responseBody.setContent(in); httpResponse.setEntity(responseBody); try { Mockito.doReturn(httpResponse).when(apacheHttpClient).execute(Mockito.any(HttpUriRequest.class), Mockito.any(HttpContext.class)); - } catch (IOException e) { } + } catch (IOException e) { + System.err.println("Exception during mock: " + e); + } Whitebox.setInternalState(amazonHttpClient, "httpClient", apacheHttpClient); - Whitebox.setInternalState(lambda, "client", amazonHttpClient); + Whitebox.setInternalState(client, "client", amazonHttpClient); + } + @Test + public void testLambdaInvokeSubsegmentContainsFunctionName() { + // Setup test + AWSLambda lambda = AWSLambdaClientBuilder.standard().withRequestHandlers(new TracingHandler()).withRegion(Regions.US_EAST_1).withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials("fake", "fake"))).build(); + mockHttpClient(lambda, "null"); // Lambda returns "null" on successful fn. with no return value + // Test logic Segment segment = AWSXRay.beginSegment("test"); @@ -79,5 +92,45 @@ public void testLambdaInvokeSubsegmentContainsFunctionName() { System.out.println(segment.getSubsegments().get(0).getAws()); Assert.assertEquals("testFunctionName", segment.getSubsegments().get(0).getAws().get("function_name")); } + + @Test + public void testS3PutObjectSubsegmentContainsBucketName() { + // Setup test + AmazonS3 s3 = AmazonS3ClientBuilder.standard().withRequestHandlers(new TracingHandler()).withRegion(Regions.US_EAST_1).withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials("fake", "fake"))).build(); + mockHttpClient(s3, null); + + final String BUCKET = "test-bucket", KEY = "test-key"; + // Test logic + Segment segment = AWSXRay.beginSegment("test"); + s3.putObject(BUCKET, KEY, "This is a test from java"); + Assert.assertEquals(1, segment.getSubsegments().size()); + Assert.assertEquals("PutObject", segment.getSubsegments().get(0).getAws().get("operation")); + System.out.println(segment.getSubsegments().get(0).getAws()); + Assert.assertEquals(BUCKET, segment.getSubsegments().get(0).getAws().get("bucket_name")); + Assert.assertEquals(KEY, segment.getSubsegments().get(0).getAws().get("key")); + } + + @Test + public void testS3CopyObjectSubsegmentContainsBucketName() { + // Setup test + final String copyResponse = "\n" + + "" + + "2018-01-21T10:09:54.000Z"31748afd7b576119d3c2471f39fc7a55"" + + ""; + AmazonS3 s3 = AmazonS3ClientBuilder.standard().withRequestHandlers(new TracingHandler()).withRegion(Regions.US_EAST_1).withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials("fake", "fake"))).build(); + mockHttpClient(s3, copyResponse); + + final String BUCKET = "source-bucket", KEY = "source-key", DST_BUCKET = "dest-bucket", DST_KEY = "dest-key"; + // Test logic + Segment segment = AWSXRay.beginSegment("test"); + s3.copyObject(BUCKET, KEY, DST_BUCKET, DST_KEY); + Assert.assertEquals(1, segment.getSubsegments().size()); + Assert.assertEquals("CopyObject", segment.getSubsegments().get(0).getAws().get("operation")); + System.out.println(segment.getSubsegments().get(0).getAws()); + Assert.assertEquals(BUCKET, segment.getSubsegments().get(0).getAws().get("source_bucket_name")); + Assert.assertEquals(KEY, segment.getSubsegments().get(0).getAws().get("source_key")); + Assert.assertEquals(DST_BUCKET, segment.getSubsegments().get(0).getAws().get("destination_bucket_name")); + Assert.assertEquals(DST_KEY, segment.getSubsegments().get(0).getAws().get("destination_key")); + } }