diff --git a/aws-xray-recorder-sdk-aws-sdk/build.gradle.kts b/aws-xray-recorder-sdk-aws-sdk/build.gradle.kts index ca78d6b1..ad4cb36c 100644 --- a/aws-xray-recorder-sdk-aws-sdk/build.gradle.kts +++ b/aws-xray-recorder-sdk-aws-sdk/build.gradle.kts @@ -18,6 +18,7 @@ dependencies { testImplementation("com.amazonaws:aws-java-sdk-lambda:1.12.228") testImplementation("com.amazonaws:aws-java-sdk-s3:1.12.228") testImplementation("com.amazonaws:aws-java-sdk-sns:1.12.228") + testImplementation("com.amazonaws:aws-java-sdk-xray:1.12.228") testImplementation("org.skyscreamer:jsonassert:1.3.0") testImplementation("org.powermock:powermock-module-junit4:2.0.7") testImplementation("org.powermock:powermock-api-mockito2:2.0.7") diff --git a/aws-xray-recorder-sdk-core/build.gradle.kts b/aws-xray-recorder-sdk-core/build.gradle.kts index 4baa0bbc..e1c7d7c5 100644 --- a/aws-xray-recorder-sdk-core/build.gradle.kts +++ b/aws-xray-recorder-sdk-core/build.gradle.kts @@ -4,7 +4,15 @@ plugins { } dependencies { - api("com.amazonaws:aws-java-sdk-xray:1.12.767") + api("commons-logging:commons-logging:1.3.5") + + implementation("com.fasterxml.jackson.core:jackson-annotations:2.17.0") + implementation("com.fasterxml.jackson.core:jackson-databind:2.17.0") + implementation("com.google.auto.value:auto-value-annotations:1.10.4") + implementation("com.google.auto.service:auto-service-annotations:1.1.1") + implementation("org.apache.httpcomponents:httpclient:4.5.14") + + annotationProcessor("com.google.auto.value:auto-value:1.10.4") compileOnly("com.google.code.findbugs:jsr305:3.0.2") compileOnly("javax.servlet:javax.servlet-api:3.1.0") diff --git a/aws-xray-recorder-sdk-core/src/main/java/com/amazonaws/xray/internal/UnsignedXrayClient.java b/aws-xray-recorder-sdk-core/src/main/java/com/amazonaws/xray/internal/UnsignedXrayClient.java index b3598774..bbc721f8 100644 --- a/aws-xray-recorder-sdk-core/src/main/java/com/amazonaws/xray/internal/UnsignedXrayClient.java +++ b/aws-xray-recorder-sdk-core/src/main/java/com/amazonaws/xray/internal/UnsignedXrayClient.java @@ -15,14 +15,11 @@ package com.amazonaws.xray.internal; -import com.amazonaws.AmazonWebServiceRequest; -import com.amazonaws.AmazonWebServiceResult; -import com.amazonaws.SdkClientException; -import com.amazonaws.services.xray.model.GetSamplingRulesRequest; -import com.amazonaws.services.xray.model.GetSamplingRulesResult; -import com.amazonaws.services.xray.model.GetSamplingTargetsRequest; -import com.amazonaws.services.xray.model.GetSamplingTargetsResult; import com.amazonaws.xray.config.DaemonConfiguration; +import com.amazonaws.xray.strategy.sampling.GetSamplingRulesRequest; +import com.amazonaws.xray.strategy.sampling.GetSamplingRulesResponse; +import com.amazonaws.xray.strategy.sampling.GetSamplingTargetsRequest; +import com.amazonaws.xray.strategy.sampling.GetSamplingTargetsResponse; import com.fasterxml.jackson.annotation.JsonInclude.Include; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.DeserializationContext; @@ -32,7 +29,6 @@ import com.fasterxml.jackson.databind.PropertyNamingStrategies; import com.fasterxml.jackson.databind.deser.std.StdDeserializer; import com.fasterxml.jackson.databind.introspect.Annotated; -import com.fasterxml.jackson.databind.introspect.AnnotatedMember; import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector; import com.fasterxml.jackson.databind.module.SimpleModule; import java.io.ByteArrayOutputStream; @@ -67,18 +63,6 @@ public class UnsignedXrayClient { .setPropertyNamingStrategy(PropertyNamingStrategies.UPPER_CAMEL_CASE) .registerModule(new SimpleModule().addDeserializer(Date.class, new FloatDateDeserializer())) .setAnnotationIntrospector(new JacksonAnnotationIntrospector() { - @Override - public boolean hasIgnoreMarker(AnnotatedMember m) { - // This is a somewhat hacky way of having ObjectMapper only serialize the fields in our - // model classes instead of the base class that comes from the SDK. In the future, we will - // remove the SDK dependency itself and the base classes and this hack will go away. - if (m.getDeclaringClass() == AmazonWebServiceRequest.class || - m.getDeclaringClass() == AmazonWebServiceResult.class) { - return true; - } - return super.hasIgnoreMarker(m); - } - @Override public PropertyName findNameForDeserialization(Annotated a) { if (a.getName().equals("hTTPMethod")) { @@ -109,12 +93,12 @@ public UnsignedXrayClient() { } } - public GetSamplingRulesResult getSamplingRules(GetSamplingRulesRequest request) { - return sendRequest(getSamplingRulesEndpoint, request, GetSamplingRulesResult.class); + public GetSamplingRulesResponse getSamplingRules(GetSamplingRulesRequest request) { + return sendRequest(getSamplingRulesEndpoint, request, GetSamplingRulesResponse.class); } - public GetSamplingTargetsResult getSamplingTargets(GetSamplingTargetsRequest request) { - return sendRequest(getSamplingTargetsEndpoint, request, GetSamplingTargetsResult.class); + public GetSamplingTargetsResponse getSamplingTargets(GetSamplingTargetsRequest request) { + return sendRequest(getSamplingTargetsEndpoint, request, GetSamplingTargetsResponse.class); } private T sendRequest(URL endpoint, Object request, Class responseClass) { @@ -216,7 +200,7 @@ private static Date parseServiceSpecificDate(String dateString) { BigDecimal dateValue = new BigDecimal(dateString); return new Date(dateValue.scaleByPowerOfTen(AWS_DATE_MILLI_SECOND_PRECISION).longValue()); } catch (NumberFormatException nfe) { - throw new SdkClientException("Unable to parse date : " + dateString, nfe); + throw new IllegalArgumentException("Unable to parse date : " + dateString, nfe); } } } diff --git a/aws-xray-recorder-sdk-core/src/main/java/com/amazonaws/xray/strategy/DefaultThrowableSerializationStrategy.java b/aws-xray-recorder-sdk-core/src/main/java/com/amazonaws/xray/strategy/DefaultThrowableSerializationStrategy.java index 371ffa4b..104f5d21 100644 --- a/aws-xray-recorder-sdk-core/src/main/java/com/amazonaws/xray/strategy/DefaultThrowableSerializationStrategy.java +++ b/aws-xray-recorder-sdk-core/src/main/java/com/amazonaws/xray/strategy/DefaultThrowableSerializationStrategy.java @@ -15,7 +15,6 @@ package com.amazonaws.xray.strategy; -import com.amazonaws.AmazonServiceException; import com.amazonaws.xray.AWSXRay; import com.amazonaws.xray.entities.Entity; import com.amazonaws.xray.entities.Subsegment; @@ -29,15 +28,16 @@ import java.util.Set; import org.checkerframework.checker.nullness.qual.Nullable; + /** * Default implementation of {@code ThrowableSerializationStrategy}. - * This class auto-registers the {@code AmazonServiceException} class as a remote exception class if no set of remote exception + * This class auto-registers the java.io.UncheckedIOException class as a remote exception class if no set of remote exception * classes is provided in the constructor. */ public class DefaultThrowableSerializationStrategy implements ThrowableSerializationStrategy { private static final int DEFAULT_MAX_STACK_TRACE_LENGTH = 50; private static final Set> DEFAULT_REMOTE_EXCEPTION_CLASSES = - Collections.singleton(AmazonServiceException.class); + Collections.singleton(java.io.UncheckedIOException.class); private final int maxStackTraceLength; private final Set> remoteExceptionClasses; diff --git a/aws-xray-recorder-sdk-core/src/main/java/com/amazonaws/xray/strategy/sampling/GetSamplingRulesRequest.java b/aws-xray-recorder-sdk-core/src/main/java/com/amazonaws/xray/strategy/sampling/GetSamplingRulesRequest.java new file mode 100644 index 00000000..a1156704 --- /dev/null +++ b/aws-xray-recorder-sdk-core/src/main/java/com/amazonaws/xray/strategy/sampling/GetSamplingRulesRequest.java @@ -0,0 +1,34 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://aws.amazon.com/apache2.0 + * + * or in the "license" file accompanying this file. This file is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package com.amazonaws.xray.strategy.sampling; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.google.auto.value.AutoValue; +import javax.annotation.Nullable; + +@AutoValue +@JsonSerialize(as = GetSamplingRulesRequest.class) +public abstract class GetSamplingRulesRequest { + + public static GetSamplingRulesRequest create(@Nullable String nextToken) { + return new AutoValue_GetSamplingRulesRequest(nextToken); + } + + @JsonProperty("NextToken") + @Nullable + abstract String getNextToken(); +} diff --git a/aws-xray-recorder-sdk-core/src/main/java/com/amazonaws/xray/strategy/sampling/GetSamplingRulesResponse.java b/aws-xray-recorder-sdk-core/src/main/java/com/amazonaws/xray/strategy/sampling/GetSamplingRulesResponse.java new file mode 100644 index 00000000..c2ee36db --- /dev/null +++ b/aws-xray-recorder-sdk-core/src/main/java/com/amazonaws/xray/strategy/sampling/GetSamplingRulesResponse.java @@ -0,0 +1,128 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://aws.amazon.com/apache2.0 + * + * or in the "license" file accompanying this file. This file is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package com.amazonaws.xray.strategy.sampling; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.google.auto.value.AutoValue; +import java.util.List; +import java.util.Map; +import javax.annotation.Nullable; + +@AutoValue +public abstract class GetSamplingRulesResponse { + + @JsonCreator + static GetSamplingRulesResponse create( + @JsonProperty("NextToken") String nextToken, + @JsonProperty("SamplingRuleRecords") List samplingRuleRecords) { + return new AutoValue_GetSamplingRulesResponse(nextToken, samplingRuleRecords); + } + + @Nullable + abstract String getNextToken(); + + public abstract List getSamplingRuleRecords(); + + @AutoValue + public abstract static class SamplingRuleRecord { + + @JsonCreator + static SamplingRuleRecord create( + @JsonProperty("CreatedAt") String createdAt, + @JsonProperty("ModifiedAt") String modifiedAt, + @JsonProperty("SamplingRule") SamplingRule samplingRule) { + return new AutoValue_GetSamplingRulesResponse_SamplingRuleRecord(createdAt, modifiedAt, samplingRule); + } + + public abstract String getCreatedAt(); + + public abstract String getModifiedAt(); + + public abstract SamplingRule getSamplingRule(); + } + + @AutoValue + public abstract static class SamplingRule { + + @JsonCreator + public static SamplingRule create( + @JsonProperty("Attributes") Map attributes, + @JsonProperty("FixedRate") Double fixedRate, + @JsonProperty("Host") String host, + @JsonProperty("HTTPMethod") String httpMethod, + @JsonProperty("Priority") Integer priority, + @JsonProperty("ReservoirSize") Integer reservoirSize, + @JsonProperty("ResourceARN") String resourceArn, + @JsonProperty("RuleARN") @Nullable String ruleArn, + @JsonProperty("RuleName") @Nullable String ruleName, + @JsonProperty("ServiceName") String serviceName, + @JsonProperty("ServiceType") String serviceType, + @JsonProperty("URLPath") String urlPath, + @JsonProperty("Version") Integer version) { + return new AutoValue_GetSamplingRulesResponse_SamplingRule( + attributes, + fixedRate, + host, + httpMethod, + priority, + reservoirSize, + resourceArn, + ruleArn, + ruleName, + serviceName, + serviceType, + urlPath, + version); + } + + @Nullable + public abstract Map getAttributes(); + + public abstract Double getFixedRate(); + + @Nullable + public abstract String getHost(); + + @Nullable + public abstract String getHttpMethod(); + + public abstract Integer getPriority(); + + public abstract Integer getReservoirSize(); + + @Nullable + public abstract String getResourceArn(); + + @Nullable + public abstract String getRuleArn(); + + @Nullable + public abstract String getRuleName(); + + @Nullable + public abstract String getServiceName(); + + @Nullable + public abstract String getServiceType(); + + @Nullable + public abstract String getUrlPath(); + + @Nullable + public abstract Integer getVersion(); + } +} diff --git a/aws-xray-recorder-sdk-core/src/main/java/com/amazonaws/xray/strategy/sampling/GetSamplingTargetsRequest.java b/aws-xray-recorder-sdk-core/src/main/java/com/amazonaws/xray/strategy/sampling/GetSamplingTargetsRequest.java new file mode 100644 index 00000000..4b04264f --- /dev/null +++ b/aws-xray-recorder-sdk-core/src/main/java/com/amazonaws/xray/strategy/sampling/GetSamplingTargetsRequest.java @@ -0,0 +1,81 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://aws.amazon.com/apache2.0 + * + * or in the "license" file accompanying this file. This file is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package com.amazonaws.xray.strategy.sampling; + +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.google.auto.value.AutoValue; +import java.util.Date; +import java.util.List; +import javax.annotation.Nullable; + +@AutoValue +@JsonSerialize(as = GetSamplingTargetsRequest.class) +public abstract class GetSamplingTargetsRequest { + + public static GetSamplingTargetsRequest create(List documents) { + return new AutoValue_GetSamplingTargetsRequest(documents); + } + + // Limit of 25 items + @JsonProperty("SamplingStatisticsDocuments") + abstract List getDocuments(); + + @AutoValue + @JsonSerialize(as = SamplingStatisticsDocument.class) + public abstract static class SamplingStatisticsDocument { + + public static SamplingStatisticsDocument.Builder newBuilder() { + return new AutoValue_GetSamplingTargetsRequest_SamplingStatisticsDocument.Builder(); + } + + @JsonProperty("BorrowCount") + public abstract long getBorrowCount(); + + @Nullable + @JsonProperty("ClientID") + public abstract String getClientId(); + + @JsonProperty("RequestCount") + public abstract long getRequestCount(); + + @JsonProperty("RuleName") + public abstract String getRuleName(); + + @JsonProperty("SampledCount") + public abstract long getSampledCount(); + + @JsonProperty("Timestamp") + public abstract Date getTimestamp(); + + @AutoValue.Builder + public abstract static class Builder { + public abstract Builder setBorrowCount(long borrowCount); + + public abstract Builder setClientId(String clientId); + + public abstract Builder setRequestCount(long requestCount); + + public abstract Builder setRuleName(String ruleName); + + public abstract Builder setSampledCount(long sampledCount); + + public abstract Builder setTimestamp(Date timestamp); + + public abstract SamplingStatisticsDocument build(); + } + } +} diff --git a/aws-xray-recorder-sdk-core/src/main/java/com/amazonaws/xray/strategy/sampling/GetSamplingTargetsResponse.java b/aws-xray-recorder-sdk-core/src/main/java/com/amazonaws/xray/strategy/sampling/GetSamplingTargetsResponse.java new file mode 100644 index 00000000..6e0c4d01 --- /dev/null +++ b/aws-xray-recorder-sdk-core/src/main/java/com/amazonaws/xray/strategy/sampling/GetSamplingTargetsResponse.java @@ -0,0 +1,91 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://aws.amazon.com/apache2.0 + * + * or in the "license" file accompanying this file. This file is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package com.amazonaws.xray.strategy.sampling; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.google.auto.value.AutoValue; +import java.util.Date; +import java.util.List; +import javax.annotation.Nullable; + +@AutoValue +public abstract class GetSamplingTargetsResponse { + + @JsonCreator + static GetSamplingTargetsResponse create( + @JsonProperty("LastRuleModification") Date lastRuleModification, + @JsonProperty("SamplingTargetDocuments") List documents, + @JsonProperty("UnprocessedStatistics") List unprocessedStatistics) { + return new AutoValue_GetSamplingTargetsResponse( + lastRuleModification, documents, unprocessedStatistics); + } + + public abstract Date getLastRuleModification(); + + public abstract List getDocuments(); + + public abstract List getUnprocessedStatistics(); + + @AutoValue + public abstract static class SamplingTargetDocument { + + @JsonCreator + public static SamplingTargetDocument create( + @JsonProperty("FixedRate") double fixedRate, + @JsonProperty("Interval") @Nullable Integer intervalSecs, + @JsonProperty("ReservoirQuota") @Nullable Integer reservoirQuota, + @JsonProperty("ReservoirQuotaTTL") @Nullable Date reservoirQuotaTtl, + @JsonProperty("RuleName") String ruleName) { + return new AutoValue_GetSamplingTargetsResponse_SamplingTargetDocument( + fixedRate, intervalSecs, reservoirQuota, reservoirQuotaTtl, ruleName); + } + + public abstract double getFixedRate(); + + @Nullable + public abstract Integer getIntervalSecs(); + + @Nullable + public abstract Integer getReservoirQuota(); + + // Careful that this is a timestamp when the quota expires, not a duration as we'd normally + // expect for a Time to live. + @Nullable + public abstract Date getReservoirQuotaTtl(); + + public abstract String getRuleName(); + } + + @AutoValue + abstract static class UnprocessedStatistics { + + @JsonCreator + static UnprocessedStatistics create( + @JsonProperty("ErrorCode") String errorCode, + @JsonProperty("Message") String message, + @JsonProperty("RuleName") String ruleName) { + return new AutoValue_GetSamplingTargetsResponse_UnprocessedStatistics( + errorCode, message, ruleName); + } + + public abstract String getErrorCode(); + + public abstract String getMessage(); + + public abstract String getRuleName(); + } +} diff --git a/aws-xray-recorder-sdk-core/src/main/java/com/amazonaws/xray/strategy/sampling/XRayClient.java b/aws-xray-recorder-sdk-core/src/main/java/com/amazonaws/xray/strategy/sampling/XRayClient.java deleted file mode 100755 index 32854443..00000000 --- a/aws-xray-recorder-sdk-core/src/main/java/com/amazonaws/xray/strategy/sampling/XRayClient.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"). - * You may not use this file except in compliance with the License. - * A copy of the License is located at - * - * http://aws.amazon.com/apache2.0 - * - * or in the "license" file accompanying this file. This file is distributed - * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either - * express or implied. See the License for the specific language governing - * permissions and limitations under the License. - */ - -package com.amazonaws.xray.strategy.sampling; - -import com.amazonaws.ClientConfiguration; -import com.amazonaws.auth.AWSCredentialsProvider; -import com.amazonaws.auth.AWSStaticCredentialsProvider; -import com.amazonaws.auth.AnonymousAWSCredentials; -import com.amazonaws.client.builder.AwsClientBuilder; -import com.amazonaws.services.xray.AWSXRay; -import com.amazonaws.services.xray.AWSXRayClientBuilder; -import com.amazonaws.xray.config.DaemonConfiguration; - -/** - * @deprecated aws-xray-recorder only supports communicating with the X-Ray daemon, which does not - * require the usual AWS API signatures so we have stopped using the SDK X-Ray client. - */ -@Deprecated -public final class XRayClient { - - private static final AWSCredentialsProvider ANONYMOUS_CREDENTIALS = new AWSStaticCredentialsProvider( - new AnonymousAWSCredentials()); - private static final String DUMMY_REGION = "us-west-1"; // Ignored because we use anonymous credentials - private static final int TIME_OUT = 2000; // Milliseconds - - private XRayClient() { - } - - /** - * - * @deprecated aws-xray-recorder only supports communicating with the X-Ray daemon, which does - * not require the usual AWS API signatures so we have stopped using the SDK X-Ray client. - */ - @Deprecated - public static AWSXRay newClient() { - DaemonConfiguration config = new DaemonConfiguration(); - - ClientConfiguration clientConfig = new ClientConfiguration() - .withRequestTimeout(TIME_OUT); - - AwsClientBuilder.EndpointConfiguration endpointConfig = new AwsClientBuilder.EndpointConfiguration( - config.getEndpointForTCPConnection(), - DUMMY_REGION - ); - - return AWSXRayClientBuilder.standard() - .withEndpointConfiguration(endpointConfig) - .withClientConfiguration(clientConfig) - .withCredentials(ANONYMOUS_CREDENTIALS) // This will entirely skip signing too - .build(); - - } -} diff --git a/aws-xray-recorder-sdk-core/src/main/java/com/amazonaws/xray/strategy/sampling/manifest/CentralizedManifest.java b/aws-xray-recorder-sdk-core/src/main/java/com/amazonaws/xray/strategy/sampling/manifest/CentralizedManifest.java index eb2e6e2a..7783dcb7 100644 --- a/aws-xray-recorder-sdk-core/src/main/java/com/amazonaws/xray/strategy/sampling/manifest/CentralizedManifest.java +++ b/aws-xray-recorder-sdk-core/src/main/java/com/amazonaws/xray/strategy/sampling/manifest/CentralizedManifest.java @@ -15,10 +15,10 @@ package com.amazonaws.xray.strategy.sampling.manifest; -import com.amazonaws.services.xray.model.SamplingRule; -import com.amazonaws.services.xray.model.SamplingStatisticsDocument; -import com.amazonaws.services.xray.model.SamplingTargetDocument; import com.amazonaws.xray.strategy.sampling.CentralizedSamplingStrategy; +import com.amazonaws.xray.strategy.sampling.GetSamplingRulesResponse.SamplingRule; +import com.amazonaws.xray.strategy.sampling.GetSamplingTargetsRequest.SamplingStatisticsDocument; +import com.amazonaws.xray.strategy.sampling.GetSamplingTargetsResponse.SamplingTargetDocument; import com.amazonaws.xray.strategy.sampling.SamplingRequest; import com.amazonaws.xray.strategy.sampling.rand.RandImpl; import com.amazonaws.xray.strategy.sampling.rule.CentralizedRule; @@ -130,16 +130,30 @@ public List snapshots(Instant now) { } SamplingStatisticsDocument snapshot = rule.snapshot(date); - snapshot.withClientID(CentralizedSamplingStrategy.getClientID()); - - snapshots.add(snapshot); + SamplingStatisticsDocument newSnapshot = SamplingStatisticsDocument.newBuilder() + .setClientId(CentralizedSamplingStrategy.getClientID()) + .setBorrowCount(snapshot.getBorrowCount()) + .setRequestCount(snapshot.getRequestCount()) + .setRuleName(snapshot.getRuleName()) + .setSampledCount(snapshot.getSampledCount()) + .setTimestamp(snapshot.getTimestamp()) + .build(); + + snapshots.add(newSnapshot); } if (defaultRule != null && defaultRule.isStale(now)) { SamplingStatisticsDocument snapshot = defaultRule.snapshot(date); - snapshot.withClientID(CentralizedSamplingStrategy.getClientID()); - - snapshots.add(snapshot); + SamplingStatisticsDocument newSnapshot = SamplingStatisticsDocument.newBuilder() + .setClientId(CentralizedSamplingStrategy.getClientID()) + .setBorrowCount(snapshot.getBorrowCount()) + .setRequestCount(snapshot.getRequestCount()) + .setRuleName(snapshot.getRuleName()) + .setSampledCount(snapshot.getSampledCount()) + .setTimestamp(snapshot.getTimestamp()) + .build(); + + snapshots.add(newSnapshot); } return snapshots; diff --git a/aws-xray-recorder-sdk-core/src/main/java/com/amazonaws/xray/strategy/sampling/pollers/RulePoller.java b/aws-xray-recorder-sdk-core/src/main/java/com/amazonaws/xray/strategy/sampling/pollers/RulePoller.java index bb2ee9e2..f5914102 100644 --- a/aws-xray-recorder-sdk-core/src/main/java/com/amazonaws/xray/strategy/sampling/pollers/RulePoller.java +++ b/aws-xray-recorder-sdk-core/src/main/java/com/amazonaws/xray/strategy/sampling/pollers/RulePoller.java @@ -15,12 +15,11 @@ package com.amazonaws.xray.strategy.sampling.pollers; -import com.amazonaws.services.xray.AWSXRay; -import com.amazonaws.services.xray.model.GetSamplingRulesRequest; -import com.amazonaws.services.xray.model.GetSamplingRulesResult; -import com.amazonaws.services.xray.model.SamplingRule; -import com.amazonaws.services.xray.model.SamplingRuleRecord; import com.amazonaws.xray.internal.UnsignedXrayClient; +import com.amazonaws.xray.strategy.sampling.GetSamplingRulesRequest; +import com.amazonaws.xray.strategy.sampling.GetSamplingRulesResponse; +import com.amazonaws.xray.strategy.sampling.GetSamplingRulesResponse.SamplingRule; +import com.amazonaws.xray.strategy.sampling.GetSamplingRulesResponse.SamplingRuleRecord; import com.amazonaws.xray.strategy.sampling.manifest.CentralizedManifest; import com.amazonaws.xray.strategy.sampling.rand.Rand; import com.amazonaws.xray.strategy.sampling.rand.RandImpl; @@ -51,14 +50,6 @@ public class RulePoller { @Nullable private volatile ScheduledFuture pollFuture; - /** - * @deprecated Use {@link #RulePoller(UnsignedXrayClient, CentralizedManifest, Clock)}. - */ - @Deprecated - public RulePoller(CentralizedManifest manifest, AWSXRay unused, Clock clock) { - this(new UnsignedXrayClient(), manifest, clock); - } - public RulePoller(UnsignedXrayClient client, CentralizedManifest manifest, Clock clock) { this.client = client; this.manifest = manifest; @@ -96,8 +87,8 @@ private void pollRule() { Instant now = clock.instant(); logger.info("Polling sampling rules."); - GetSamplingRulesRequest req = new GetSamplingRulesRequest(); - GetSamplingRulesResult records = client.getSamplingRules(req); + GetSamplingRulesRequest req = GetSamplingRulesRequest.create(null); + GetSamplingRulesResponse records = client.getSamplingRules(req); List rules = records.getSamplingRuleRecords() .stream() .map(SamplingRuleRecord::getSamplingRule) diff --git a/aws-xray-recorder-sdk-core/src/main/java/com/amazonaws/xray/strategy/sampling/pollers/TargetPoller.java b/aws-xray-recorder-sdk-core/src/main/java/com/amazonaws/xray/strategy/sampling/pollers/TargetPoller.java index 50991548..df420747 100644 --- a/aws-xray-recorder-sdk-core/src/main/java/com/amazonaws/xray/strategy/sampling/pollers/TargetPoller.java +++ b/aws-xray-recorder-sdk-core/src/main/java/com/amazonaws/xray/strategy/sampling/pollers/TargetPoller.java @@ -15,11 +15,10 @@ package com.amazonaws.xray.strategy.sampling.pollers; -import com.amazonaws.services.xray.AWSXRay; -import com.amazonaws.services.xray.model.GetSamplingTargetsRequest; -import com.amazonaws.services.xray.model.GetSamplingTargetsResult; -import com.amazonaws.services.xray.model.SamplingStatisticsDocument; import com.amazonaws.xray.internal.UnsignedXrayClient; +import com.amazonaws.xray.strategy.sampling.GetSamplingTargetsRequest; +import com.amazonaws.xray.strategy.sampling.GetSamplingTargetsRequest.SamplingStatisticsDocument; +import com.amazonaws.xray.strategy.sampling.GetSamplingTargetsResponse; import com.amazonaws.xray.strategy.sampling.manifest.CentralizedManifest; import com.amazonaws.xray.strategy.sampling.rand.Rand; import com.amazonaws.xray.strategy.sampling.rand.RandImpl; @@ -46,14 +45,6 @@ public class TargetPoller { @Nullable private volatile ScheduledFuture pollFuture; - /** - * @deprecated Use {@link #TargetPoller(UnsignedXrayClient, CentralizedManifest, Clock)}. - */ - @Deprecated - public TargetPoller(CentralizedManifest manifest, AWSXRay unused, Clock clock) { - this(new UnsignedXrayClient(), manifest, clock); - } - public TargetPoller(UnsignedXrayClient client, CentralizedManifest manifest, Clock clock) { this.client = client; this.manifest = manifest; @@ -95,11 +86,10 @@ private void pollManifest() { } logger.debug("Polling sampling targets."); - GetSamplingTargetsRequest req = new GetSamplingTargetsRequest() - .withSamplingStatisticsDocuments(statistics); + GetSamplingTargetsRequest req = GetSamplingTargetsRequest.create(statistics); - GetSamplingTargetsResult result = client.getSamplingTargets(req); - manifest.putTargets(result.getSamplingTargetDocuments(), clock.instant()); + GetSamplingTargetsResponse result = client.getSamplingTargets(req); + manifest.putTargets(result.getDocuments(), clock.instant()); } private long getIntervalWithJitter() { diff --git a/aws-xray-recorder-sdk-core/src/main/java/com/amazonaws/xray/strategy/sampling/reservoir/CentralizedReservoir.java b/aws-xray-recorder-sdk-core/src/main/java/com/amazonaws/xray/strategy/sampling/reservoir/CentralizedReservoir.java index b0572d20..d366621e 100644 --- a/aws-xray-recorder-sdk-core/src/main/java/com/amazonaws/xray/strategy/sampling/reservoir/CentralizedReservoir.java +++ b/aws-xray-recorder-sdk-core/src/main/java/com/amazonaws/xray/strategy/sampling/reservoir/CentralizedReservoir.java @@ -15,8 +15,8 @@ package com.amazonaws.xray.strategy.sampling.reservoir; -import com.amazonaws.services.xray.model.SamplingRule; -import com.amazonaws.services.xray.model.SamplingTargetDocument; +import com.amazonaws.xray.strategy.sampling.GetSamplingRulesResponse.SamplingRule; +import com.amazonaws.xray.strategy.sampling.GetSamplingTargetsResponse.SamplingTargetDocument; import java.time.Instant; public class CentralizedReservoir { @@ -40,7 +40,7 @@ public CentralizedReservoir(long capacity) { } public void update(SamplingRule r) { - capacity = r.getReservoirSize().longValue(); + capacity = r.getReservoirSize(); } public boolean isExpired(Instant now) { @@ -65,12 +65,12 @@ public void update(SamplingTargetDocument target, Instant now) { quota = target.getReservoirQuota(); } - if (target.getReservoirQuotaTTL() != null) { - expiresAt = target.getReservoirQuotaTTL().toInstant(); + if (target.getReservoirQuotaTtl() != null) { + expiresAt = target.getReservoirQuotaTtl().toInstant(); } - if (target.getInterval() != null) { - interval = target.getInterval(); + if (target.getIntervalSecs() != null) { + interval = target.getIntervalSecs(); } refreshedAt = now; diff --git a/aws-xray-recorder-sdk-core/src/main/java/com/amazonaws/xray/strategy/sampling/rule/CentralizedRule.java b/aws-xray-recorder-sdk-core/src/main/java/com/amazonaws/xray/strategy/sampling/rule/CentralizedRule.java index 1fdf5534..ee83a55e 100644 --- a/aws-xray-recorder-sdk-core/src/main/java/com/amazonaws/xray/strategy/sampling/rule/CentralizedRule.java +++ b/aws-xray-recorder-sdk-core/src/main/java/com/amazonaws/xray/strategy/sampling/rule/CentralizedRule.java @@ -15,9 +15,9 @@ package com.amazonaws.xray.strategy.sampling.rule; -import com.amazonaws.services.xray.model.SamplingRule; -import com.amazonaws.services.xray.model.SamplingStatisticsDocument; -import com.amazonaws.services.xray.model.SamplingTargetDocument; +import com.amazonaws.xray.strategy.sampling.GetSamplingRulesResponse.SamplingRule; +import com.amazonaws.xray.strategy.sampling.GetSamplingTargetsRequest.SamplingStatisticsDocument; +import com.amazonaws.xray.strategy.sampling.GetSamplingTargetsResponse.SamplingTargetDocument; import com.amazonaws.xray.strategy.sampling.SamplingRequest; import com.amazonaws.xray.strategy.sampling.SamplingResponse; import com.amazonaws.xray.strategy.sampling.rand.Rand; @@ -120,13 +120,13 @@ public static boolean isValid(SamplingRule rule) { return false; } - if (!rule.getResourceARN().equals("*") || !rule.getAttributes().isEmpty()) { + if (!rule.getResourceArn().equals("*") || !rule.getAttributes().isEmpty()) { logger.error("Detect invalid rule. Please check sampling rule format."); return false; } - if (rule.getHost() == null || rule.getServiceName() == null || rule.getHTTPMethod() == null || - rule.getURLPath() == null || rule.getServiceType() == null) { + if (rule.getHost() == null || rule.getServiceName() == null || rule.getHttpMethod() == null || + rule.getUrlPath() == null || rule.getServiceType() == null) { logger.error("Detect invalid rule. Please check sampling rule format."); return false; } @@ -149,22 +149,22 @@ public void update(SamplingTargetDocument t, Instant now) { } public SamplingStatisticsDocument snapshot(Date now) { - SamplingStatisticsDocument s = new SamplingStatisticsDocument() - .withRuleName(name) - .withTimestamp(now); + SamplingStatisticsDocument.Builder statisticsDocBuilder = SamplingStatisticsDocument.newBuilder() + .setRuleName(name) + .setTimestamp(now); lock.writeLock().lock(); try { - s.setRequestCount(statistics.getRequests()); - s.setSampledCount(statistics.getSampled()); - s.setBorrowCount(statistics.getBorrowed()); + statisticsDocBuilder.setRequestCount(statistics.getRequests()); + statisticsDocBuilder.setSampledCount(statistics.getSampled()); + statisticsDocBuilder.setBorrowCount(statistics.getBorrowed()); statistics.reset(); } finally { lock.writeLock().unlock(); } - return s; + return statisticsDocBuilder.build(); } public boolean match(SamplingRequest r) { diff --git a/aws-xray-recorder-sdk-core/src/main/java/com/amazonaws/xray/strategy/sampling/rule/Matchers.java b/aws-xray-recorder-sdk-core/src/main/java/com/amazonaws/xray/strategy/sampling/rule/Matchers.java index 52a659ab..67c030f3 100644 --- a/aws-xray-recorder-sdk-core/src/main/java/com/amazonaws/xray/strategy/sampling/rule/Matchers.java +++ b/aws-xray-recorder-sdk-core/src/main/java/com/amazonaws/xray/strategy/sampling/rule/Matchers.java @@ -15,8 +15,8 @@ package com.amazonaws.xray.strategy.sampling.rule; -import com.amazonaws.services.xray.model.SamplingRule; import com.amazonaws.xray.entities.SearchPattern; +import com.amazonaws.xray.strategy.sampling.GetSamplingRulesResponse.SamplingRule; import com.amazonaws.xray.strategy.sampling.SamplingRequest; import java.util.Collections; import java.util.Map; @@ -38,8 +38,8 @@ public class Matchers { public Matchers(SamplingRule r) { this.host = r.getHost(); this.service = r.getServiceName(); - this.method = r.getHTTPMethod(); - this.url = r.getURLPath(); + this.method = r.getHttpMethod(); + this.url = r.getUrlPath(); this.serviceType = r.getServiceType(); this.attributes = r.getAttributes() == null ? Collections.emptyMap() : r.getAttributes(); diff --git a/aws-xray-recorder-sdk-core/src/test/java/com/amazonaws/xray/internal/UnsignedXrayClientTest.java b/aws-xray-recorder-sdk-core/src/test/java/com/amazonaws/xray/internal/UnsignedXrayClientTest.java index 996ac4cc..61a9afd9 100644 --- a/aws-xray-recorder-sdk-core/src/test/java/com/amazonaws/xray/internal/UnsignedXrayClientTest.java +++ b/aws-xray-recorder-sdk-core/src/test/java/com/amazonaws/xray/internal/UnsignedXrayClientTest.java @@ -21,20 +21,25 @@ import static com.github.tomakehurst.wiremock.client.WireMock.anyUrl; import static com.github.tomakehurst.wiremock.client.WireMock.equalTo; import static com.github.tomakehurst.wiremock.client.WireMock.equalToJson; +import static com.github.tomakehurst.wiremock.client.WireMock.matchingJsonPath; import static com.github.tomakehurst.wiremock.client.WireMock.postRequestedFor; import static com.github.tomakehurst.wiremock.client.WireMock.stubFor; import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo; import static com.github.tomakehurst.wiremock.client.WireMock.verify; import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig; +import static java.util.Arrays.asList; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; -import com.amazonaws.services.xray.model.GetSamplingRulesRequest; -import com.amazonaws.services.xray.model.GetSamplingRulesResult; -import com.amazonaws.services.xray.model.GetSamplingTargetsRequest; -import com.amazonaws.services.xray.model.GetSamplingTargetsResult; -import com.amazonaws.services.xray.model.SamplingStatisticsDocument; +import com.amazonaws.xray.strategy.sampling.GetSamplingRulesRequest; +import com.amazonaws.xray.strategy.sampling.GetSamplingRulesResponse; +import com.amazonaws.xray.strategy.sampling.GetSamplingTargetsRequest; +import com.amazonaws.xray.strategy.sampling.GetSamplingTargetsRequest.SamplingStatisticsDocument; +import com.amazonaws.xray.strategy.sampling.GetSamplingTargetsResponse; import com.github.tomakehurst.wiremock.junit.WireMockClassRule; +import java.time.Instant; +import java.util.Date; +import java.util.List; import org.junit.Before; import org.junit.ClassRule; import org.junit.Test; @@ -222,9 +227,10 @@ public void getSamplingRules() throws Exception { .withStatus(200) .withBody(SAMPLING_RULES))); - GetSamplingRulesResult result = client.getSamplingRules(new GetSamplingRulesRequest()); + GetSamplingRulesRequest request = GetSamplingRulesRequest.create(null); + GetSamplingRulesResponse result = client.getSamplingRules(request); - GetSamplingRulesResult expected = OBJECT_MAPPER.readValue(SAMPLING_RULES, GetSamplingRulesResult.class); + GetSamplingRulesResponse expected = OBJECT_MAPPER.readValue(SAMPLING_RULES, GetSamplingRulesResponse.class); assertThat(expected).isEqualTo(result); verify(postRequestedFor(urlEqualTo("/GetSamplingRules")) @@ -238,23 +244,26 @@ public void getSamplingTargets() throws Exception { .withStatus(200) .withBody(SAMPLING_TARGETS))); - GetSamplingTargetsRequest request = new GetSamplingTargetsRequest() - .withSamplingStatisticsDocuments(new SamplingStatisticsDocument().withClientID("client-id")); + List documents = asList( + SamplingStatisticsDocument.newBuilder().setClientId("client-id") + .setBorrowCount(3) + .setRequestCount(0) + .setRuleName("rule-foo") + .setSampledCount(0) + .setTimestamp(Date.from(Instant.now())) + .build()); + GetSamplingTargetsRequest request = GetSamplingTargetsRequest.create(documents); - GetSamplingTargetsResult result = client.getSamplingTargets(request); + GetSamplingTargetsResponse result = client.getSamplingTargets(request); - GetSamplingTargetsResult expected = OBJECT_MAPPER.readValue(SAMPLING_TARGETS, GetSamplingTargetsResult.class); + GetSamplingTargetsResponse expected = OBJECT_MAPPER.readValue(SAMPLING_TARGETS, GetSamplingTargetsResponse.class); assertThat(expected).isEqualTo(result); verify(postRequestedFor(urlEqualTo("/SamplingTargets")) - .withHeader("Content-Type", equalTo("application/json")) - .withRequestBody(equalToJson("{" - + " \"SamplingStatisticsDocuments\": [" - + " {" - + " \"ClientID\": \"client-id\"" - + " }" - + " ] " - + "}"))); + .withHeader("Content-Type", equalTo("application/json")) + .withRequestBody(matchingJsonPath("$.SamplingStatisticsDocuments[0].ClientID", equalTo("client-id"))) + .withRequestBody(matchingJsonPath("$.SamplingStatisticsDocuments[0].BorrowCount", equalTo("3"))) + .withRequestBody(matchingJsonPath("$.SamplingStatisticsDocuments[0].RuleName", equalTo("rule-foo")))); } @Test @@ -265,7 +274,7 @@ public void badStatus() { .withStatus(500) .withBody(expectedMessage))); - assertThatThrownBy(() -> client.getSamplingRules(new GetSamplingRulesRequest())) + assertThatThrownBy(() -> client.getSamplingRules(GetSamplingRulesRequest.create(null))) .isInstanceOf(XrayClientException.class) .hasMessageContaining(expectedMessage); } @@ -275,7 +284,7 @@ public void badStatus() { public void cannotSend() { client = new UnsignedXrayClient("http://localhost:" + (server.port() + 1234)); - assertThatThrownBy(() -> client.getSamplingRules(new GetSamplingRulesRequest())) + assertThatThrownBy(() -> client.getSamplingRules(GetSamplingRulesRequest.create(null))) .isInstanceOf(XrayClientException.class) .hasMessageContaining("Could not serialize and send request"); } diff --git a/aws-xray-recorder-sdk-core/src/test/java/com/amazonaws/xray/strategy/sampling/manifest/CentralizedManifestTest.java b/aws-xray-recorder-sdk-core/src/test/java/com/amazonaws/xray/strategy/sampling/manifest/CentralizedManifestTest.java index 2fa4f985..81e1d120 100644 --- a/aws-xray-recorder-sdk-core/src/test/java/com/amazonaws/xray/strategy/sampling/manifest/CentralizedManifestTest.java +++ b/aws-xray-recorder-sdk-core/src/test/java/com/amazonaws/xray/strategy/sampling/manifest/CentralizedManifestTest.java @@ -15,11 +15,13 @@ package com.amazonaws.xray.strategy.sampling.manifest; -import com.amazonaws.services.xray.model.SamplingRule; -import com.amazonaws.services.xray.model.SamplingStatisticsDocument; +import com.amazonaws.xray.strategy.sampling.GetSamplingRulesResponse.SamplingRule; +import com.amazonaws.xray.strategy.sampling.GetSamplingTargetsRequest.SamplingStatisticsDocument; import com.amazonaws.xray.strategy.sampling.SamplingRequest; import com.amazonaws.xray.strategy.sampling.rand.RandImpl; import com.amazonaws.xray.strategy.sampling.rule.CentralizedRule; +import com.amazonaws.xray.strategy.sampling.rule.RuleBuilder; +import com.amazonaws.xray.strategy.sampling.rule.RuleBuilder.RuleParams; import java.time.Instant; import java.util.ArrayList; import java.util.Arrays; @@ -77,17 +79,17 @@ void testPositiveMatch() { CentralizedManifest manifest = new CentralizedManifest(); - SamplingRule r1 = new SamplingRule() - .withRuleName("r1") - .withPriority(10) - .withReservoirSize(20) - .withFixedRate(0.05) - .withHost("*") - .withServiceName("*") - .withHTTPMethod("*") - .withURLPath("*") - .withResourceARN("*") - .withServiceType("*"); + RuleParams params = new RuleParams("r1"); + params.priority = 10; + params.reservoirSize = 20; + params.fixedRate = 0.05; + params.host = "*"; + params.serviceName = "*"; + params.httpMethod = "*"; + params.urlPath = "*"; + params.resourceArn = "*"; + params.serviceType = "*"; + SamplingRule r1 = RuleBuilder.createRule(params); manifest.putRules(Arrays.asList(r1), now); @@ -111,10 +113,10 @@ void testPositiveDefaultRuleMatch() { CentralizedManifest manifest = new CentralizedManifest(); - SamplingRule r2 = new SamplingRule() - .withRuleName(CentralizedRule.DEFAULT_RULE_NAME) - .withReservoirSize(20) - .withFixedRate(0.05); + RuleParams params = new RuleParams(CentralizedRule.DEFAULT_RULE_NAME); + params.reservoirSize = 20; + params.fixedRate = 0.05; + SamplingRule r2 = RuleBuilder.createRule(params); manifest.putRules(Arrays.asList(rule("r1"), r2), now); @@ -140,17 +142,17 @@ void testPutRules() { CentralizedManifest manifest = new CentralizedManifest(); // Liberal sampling rule - SamplingRule r1 = new SamplingRule() - .withRuleName("r1") - .withPriority(10) - .withReservoirSize(20) - .withFixedRate(0.05) - .withHost("*") - .withServiceName("*") - .withHTTPMethod("*") - .withURLPath("*") - .withResourceARN("*") - .withServiceType("*"); + RuleParams params = new RuleParams("r1"); + params.priority = 10; + params.reservoirSize = 20; + params.fixedRate = 0.05; + params.host = "*"; + params.serviceName = "*"; + params.httpMethod = "*"; + params.urlPath = "*"; + params.resourceArn = "*"; + params.serviceType = "*"; + SamplingRule r1 = RuleBuilder.createRule(params); manifest.putRules(Arrays.asList(r1), now); @@ -192,7 +194,9 @@ void testPutRulesWithoutRebuild() { manifest.putRules(Arrays.asList(rule("r1")), Instant.now()); Map rules1 = Whitebox.getInternalState(manifest, "rules", CentralizedManifest.class); - SamplingRule r = rule("r1").withResourceARN("arn3"); + RuleParams params = createRuleParams("r1"); + params.resourceArn = "arn3"; + SamplingRule r = RuleBuilder.createRule(params); manifest.putRules(Arrays.asList(r), Instant.now()); Map rules2 = Whitebox.getInternalState(manifest, "rules", CentralizedManifest.class); @@ -208,7 +212,9 @@ void testRebuildOnPriorityChange() { manifest.putRules(Arrays.asList(rule("r1")), Instant.now()); Map rules1 = Whitebox.getInternalState(manifest, "rules", CentralizedManifest.class); - SamplingRule r = rule("r1").withPriority(200); + RuleParams paramsBar = createRuleParams("r1"); + paramsBar.priority = 200; + SamplingRule r = RuleBuilder.createRule(paramsBar); manifest.putRules(Arrays.asList(r), Instant.now()); Map rules2 = Whitebox.getInternalState(manifest, "rules", CentralizedManifest.class); @@ -241,10 +247,10 @@ void testRebuildOnRuleDeletion() { void testManifestSizeWithDefaultRule() { CentralizedManifest m = new CentralizedManifest(); - SamplingRule r2 = new SamplingRule() - .withRuleName(CentralizedRule.DEFAULT_RULE_NAME) - .withReservoirSize(20) - .withFixedRate(0.05); + RuleParams params = new RuleParams(CentralizedRule.DEFAULT_RULE_NAME); + params.reservoirSize = 20; + params.fixedRate = 0.05; + SamplingRule r2 = RuleBuilder.createRule(params); m.putRules(Arrays.asList(rule("r1"), r2), Instant.now()); @@ -255,10 +261,10 @@ void testManifestSizeWithDefaultRule() { void testManifestSizeWithoutDefaultRule() { CentralizedManifest m = new CentralizedManifest(); - SamplingRule r1 = new SamplingRule() - .withRuleName(CentralizedRule.DEFAULT_RULE_NAME) - .withReservoirSize(20) - .withFixedRate(0.05); + RuleParams params = new RuleParams(CentralizedRule.DEFAULT_RULE_NAME); + params.reservoirSize = 20; + params.fixedRate = 0.05; + SamplingRule r1 = RuleBuilder.createRule(params); m.putRules(Arrays.asList(r1), Instant.now()); @@ -308,7 +314,9 @@ void testSnapshotsWithoutDefaultRule() { @Test void testRebuild() { Map rules = new HashMap<>(); - rules.put("r1", new CentralizedRule(rule("r1").withPriority(11), new RandImpl())); + RuleParams params = createRuleParams("r1"); + params.priority = 11; + rules.put("r1", new CentralizedRule(RuleBuilder.createRule(params), new RandImpl())); rules.put("r2", new CentralizedRule(rule("r2"), new RandImpl())); List inputs = new ArrayList<>(); @@ -329,19 +337,22 @@ void testRebuild() { Assertions.assertEquals("r1", orderedList[2]); } + private SamplingRule rule(String ruleName) { - SamplingRule r = new SamplingRule() - .withRuleName(ruleName) - .withPriority(10) - .withReservoirSize(20) - .withFixedRate(0.05) - .withHost("*") - .withServiceName("s2") - .withHTTPMethod("POST") - .withURLPath("/foo") - .withResourceARN("arn2"); - - return r; + return RuleBuilder.createRule(createRuleParams(ruleName)); } + private RuleParams createRuleParams(String ruleName) { + RuleParams params = new RuleParams(ruleName); + params.priority = 10; + params.reservoirSize = 20; + params.fixedRate = 0.05; + params.host = "*"; + params.serviceName = "s2"; + params.httpMethod = "POST"; + params.urlPath = "/foo"; + params.resourceArn = "arn2"; + + return params; + } } diff --git a/aws-xray-recorder-sdk-core/src/test/java/com/amazonaws/xray/strategy/sampling/rule/CentralizedRuleTest.java b/aws-xray-recorder-sdk-core/src/test/java/com/amazonaws/xray/strategy/sampling/rule/CentralizedRuleTest.java index e367991f..3394aa56 100644 --- a/aws-xray-recorder-sdk-core/src/test/java/com/amazonaws/xray/strategy/sampling/rule/CentralizedRuleTest.java +++ b/aws-xray-recorder-sdk-core/src/test/java/com/amazonaws/xray/strategy/sampling/rule/CentralizedRuleTest.java @@ -15,13 +15,14 @@ package com.amazonaws.xray.strategy.sampling.rule; -import com.amazonaws.services.xray.model.SamplingRule; -import com.amazonaws.services.xray.model.SamplingStatisticsDocument; -import com.amazonaws.services.xray.model.SamplingTargetDocument; +import com.amazonaws.xray.strategy.sampling.GetSamplingRulesResponse.SamplingRule; +import com.amazonaws.xray.strategy.sampling.GetSamplingTargetsRequest.SamplingStatisticsDocument; +import com.amazonaws.xray.strategy.sampling.GetSamplingTargetsResponse.SamplingTargetDocument; import com.amazonaws.xray.strategy.sampling.SamplingResponse; import com.amazonaws.xray.strategy.sampling.rand.Rand; import com.amazonaws.xray.strategy.sampling.rand.RandImpl; import com.amazonaws.xray.strategy.sampling.reservoir.CentralizedReservoir; +import com.amazonaws.xray.strategy.sampling.rule.RuleBuilder.RuleParams; import java.time.Clock; import java.time.Instant; import java.time.ZoneId; @@ -211,28 +212,22 @@ public void testSnapshot() { // Assert snapshot contains expected statistics Assert.assertEquals("r1", snapshot.getRuleName()); Assert.assertEquals(TimeUnit.SECONDS.toMillis(1500000000), snapshot.getTimestamp().toInstant().toEpochMilli()); - Assert.assertEquals(1, snapshot.getRequestCount().intValue()); - Assert.assertEquals(1, snapshot.getSampledCount().intValue()); - Assert.assertEquals(0, snapshot.getBorrowCount().intValue()); + Assert.assertEquals(1, snapshot.getRequestCount()); + Assert.assertEquals(1, snapshot.getSampledCount()); + Assert.assertEquals(0, snapshot.getBorrowCount()); // Assert current statistics are empty - Assert.assertEquals(0, rule.snapshot(Date.from(clock.instant())).getRequestCount().intValue()); - Assert.assertEquals(0, rule.snapshot(Date.from(clock.instant())).getSampledCount().intValue()); - Assert.assertEquals(0, rule.snapshot(Date.from(clock.instant())).getBorrowCount().intValue()); + Assert.assertEquals(0, rule.snapshot(Date.from(clock.instant())).getRequestCount()); + Assert.assertEquals(0, rule.snapshot(Date.from(clock.instant())).getSampledCount()); + Assert.assertEquals(0, rule.snapshot(Date.from(clock.instant())).getBorrowCount()); } @Test public void testRuleUpdateWithInvalidation() { - SamplingRule input = createInput("r1", 300, 10, 0.0) - .withHTTPMethod("POST") - .withServiceName("s1") - .withURLPath("/foo/bar"); + SamplingRule input = createInput("r1", 300, 10, 0.0, "POST", "s1", "/foo/bar"); CentralizedRule r = new CentralizedRule(input, new RandImpl()); - SamplingRule update = createInput("r1", 301, 5, 0.5) - .withHTTPMethod("GET") - .withServiceName("s2") - .withURLPath("/bar/foo"); + SamplingRule update = createInput("r1", 301, 5, 0.5, "GET", "s2", "/bar/foo"); boolean invalidate = r.update(update); Matchers m = Whitebox.getInternalState(r, "matchers", CentralizedRule.class); @@ -245,16 +240,10 @@ public void testRuleUpdateWithInvalidation() { @Test public void testRuleUpdateWithoutInvalidation() { - SamplingRule input = createInput("r1", 300, 10, 0.0) - .withHTTPMethod("POST") - .withServiceName("s1") - .withURLPath("/foo/bar"); + SamplingRule input = createInput("r1", 300, 10, 0.0, "POST", "s1", "/foo/bar"); CentralizedRule r = new CentralizedRule(input, new RandImpl()); - SamplingRule update = createInput("r1", 300, 10, 0.0) - .withHTTPMethod("GET") - .withServiceName("s2") - .withURLPath("/bar/foo"); + SamplingRule update = createInput("r1", 300, 10, 0.0, "GET", "s2", "/bar/foo"); boolean invalidate = r.update(update); Matchers m = Whitebox.getInternalState(r, "matchers", CentralizedRule.class); @@ -270,10 +259,8 @@ public void testTargetUpdate() { SamplingRule input = createInput("r1", 300, 10, 0.0); CentralizedRule r = new CentralizedRule(input, new RandImpl()); - SamplingTargetDocument update = new SamplingTargetDocument() - .withRuleName("r1") - .withFixedRate(0.5) - .withInterval(20); + SamplingTargetDocument update = SamplingTargetDocument.create(0.5, + 20, null, null, "r1"); r.update(update, Instant.now()); @@ -283,23 +270,33 @@ public void testTargetUpdate() { } public static SamplingRule createInput(String name, int priority, int capacity, double rate) { - SamplingRule input = new SamplingRule() - .withRuleName(name) - .withPriority(priority) - .withFixedRate(rate) - .withReservoirSize(capacity); + RuleParams params = new RuleParams(name); + params.priority = priority; + params.reservoirSize = capacity; + params.fixedRate = rate; + return RuleBuilder.createRule(params); + } - return input; + public static SamplingRule createInput(String name, int priority, int capacity, double rate, + String httpMethod, String serviceName, String urlPath) { + RuleParams params = new RuleParams(name); + params.priority = priority; + params.reservoirSize = capacity; + params.fixedRate = rate; + params.httpMethod = httpMethod; + params.serviceName = serviceName; + params.urlPath = urlPath; + return RuleBuilder.createRule(params); } public static SamplingTargetDocument createTarget(int quota, double rate, long expiresAt) { - SamplingTargetDocument target = new SamplingTargetDocument() - .withReservoirQuota(quota) - .withReservoirQuotaTTL(Date.from(Instant.ofEpochSecond(expiresAt))) - .withFixedRate(rate) - .withInterval(10); + SamplingTargetDocument target = SamplingTargetDocument.create( + rate, + 10, + quota, + Date.from(Instant.ofEpochSecond(expiresAt)), + ""); return target; } - } diff --git a/aws-xray-recorder-sdk-core/src/test/java/com/amazonaws/xray/strategy/sampling/rule/MatchersTest.java b/aws-xray-recorder-sdk-core/src/test/java/com/amazonaws/xray/strategy/sampling/rule/MatchersTest.java index 70c2f364..daa72c9f 100644 --- a/aws-xray-recorder-sdk-core/src/test/java/com/amazonaws/xray/strategy/sampling/rule/MatchersTest.java +++ b/aws-xray-recorder-sdk-core/src/test/java/com/amazonaws/xray/strategy/sampling/rule/MatchersTest.java @@ -15,8 +15,10 @@ package com.amazonaws.xray.strategy.sampling.rule; -import com.amazonaws.services.xray.model.SamplingRule; +import com.amazonaws.xray.strategy.sampling.GetSamplingRulesResponse.SamplingRule; import com.amazonaws.xray.strategy.sampling.SamplingRequest; +import com.amazonaws.xray.strategy.sampling.rule.RuleBuilder; +import com.amazonaws.xray.strategy.sampling.rule.RuleBuilder.RuleParams; import java.util.HashMap; import java.util.Map; import org.junit.jupiter.api.Assertions; @@ -26,14 +28,15 @@ class MatchersTest { @Test void testSimpleMatch() { - SamplingRule rule = new SamplingRule() - .withAttributes(null) - .withHost("192.168.1.1") - .withServiceName("www.foo.com") - .withHTTPMethod("POST") - .withResourceARN("arn:aws:service:us-east-1:111111111111:resource") - .withURLPath("/bar/123") - .withServiceType("AWS::EC2::Instance"); + RuleParams params = new RuleParams(null); + params.attributes = null; + params.host = "192.168.1.1"; + params.serviceName = "www.foo.com"; + params.httpMethod = "POST"; + params.resourceArn = "arn:aws:service:us-east-1:111111111111:resource"; + params.urlPath = "/bar/123"; + params.serviceType = "AWS::EC2::Instance"; + SamplingRule rule = RuleBuilder.createRule(params); SamplingRequest req = new SamplingRequest( "role-arn", @@ -53,14 +56,15 @@ void testSimpleMatch() { @Test void testSimpleMismatch() { - SamplingRule rule = new SamplingRule() - .withAttributes(null) - .withHost("192.168.1.1") - .withServiceName("www.foo.com") - .withHTTPMethod("POST") - .withResourceARN("arn:aws:service:us-east-1:111111111111:resource") - .withURLPath("/bar/123") - .withServiceType("AWS::EC2::Instance"); + RuleParams params = new RuleParams(null); + params.attributes = null; + params.host = "192.168.1.1"; + params.serviceName = "www.foo.com"; + params.httpMethod = "POST"; + params.resourceArn = "arn:aws:service:us-east-1:111111111111:resource"; + params.urlPath = "/bar/123"; + params.serviceType = "AWS::EC2::Instance"; + SamplingRule rule = RuleBuilder.createRule(params); SamplingRequest req = new SamplingRequest( "role-arn", @@ -89,14 +93,15 @@ void testFullGlobMatch() { reqAttributes.put("compression", "gzip"); reqAttributes.put("encoding", "json"); - SamplingRule rule = new SamplingRule() - .withAttributes(ruleAttributes) - .withHost("*") - .withServiceName("*") - .withHTTPMethod("*") - .withResourceARN("*") - .withURLPath("*") - .withServiceType("*"); + RuleParams params = new RuleParams(null); + params.attributes = ruleAttributes; + params.host = "*"; + params.serviceName = "*"; + params.httpMethod = "*"; + params.resourceArn = "*"; + params.urlPath = "*"; + params.serviceType = "*"; + SamplingRule rule = RuleBuilder.createRule(params); SamplingRequest req = new SamplingRequest( "role-arn", @@ -125,14 +130,15 @@ void testPartialGlobMatch() { reqAttributes.put("compression", "gzip"); reqAttributes.put("encoding", "json"); - SamplingRule rule = new SamplingRule() - .withAttributes(ruleAttributes) - .withHost("*") - .withServiceName("*.foo.*") - .withHTTPMethod("*") - .withResourceARN("*") - .withURLPath("/bar/*") - .withServiceType("AWS::EC2::Instance"); + RuleParams params = new RuleParams(null); + params.attributes = ruleAttributes; + params.host = "*"; + params.serviceName = "*.foo.*"; + params.httpMethod = "*"; + params.resourceArn = "*"; + params.urlPath = "/bar/*"; + params.serviceType = "AWS::EC2::Instance"; + SamplingRule rule = RuleBuilder.createRule(params); SamplingRequest req = new SamplingRequest( "role-arn", @@ -152,14 +158,15 @@ void testPartialGlobMatch() { @Test void testPartialGlobMismatch() { - SamplingRule rule = new SamplingRule() - .withAttributes(null) - .withHost("*") - .withServiceName("*.foo.*") - .withHTTPMethod("*") - .withResourceARN("*") - .withURLPath("/bar/*") - .withServiceType("AWS::EC2::Instance"); + RuleParams params = new RuleParams(null); + params.attributes = null; + params.host = "*"; + params.serviceName = "*.foo.*"; + params.httpMethod = "*"; + params.resourceArn = "*"; + params.urlPath = "/bar/*"; + params.serviceType = "AWS::EC2::Instance"; + SamplingRule rule = RuleBuilder.createRule(params); SamplingRequest req = new SamplingRequest( "role-arn", @@ -188,14 +195,15 @@ void testPartialAttributeGlobMismatch() { reqAttributes.put("compression", "gzip"); reqAttributes.put("encoding", "json"); - SamplingRule rule = new SamplingRule() - .withAttributes(ruleAttributes) - .withHost("*") - .withServiceName("*") - .withHTTPMethod("*") - .withResourceARN("*") - .withURLPath("*") - .withServiceType("AWS::EC2::Instance"); + RuleParams params = new RuleParams(null); + params.attributes = ruleAttributes; + params.host = "*"; + params.serviceName = "*"; + params.httpMethod = "*"; + params.resourceArn = "*"; + params.urlPath = "*"; + params.serviceType = "AWS::EC2::Instance"; + SamplingRule rule = RuleBuilder.createRule(params); SamplingRequest req = new SamplingRequest( "role-arn", @@ -215,14 +223,15 @@ void testPartialAttributeGlobMismatch() { @Test void testPartialRequestMismatch() { - SamplingRule rule = new SamplingRule() - .withAttributes(null) - .withHost("192.168.1.1") - .withServiceName("www.foo.com") - .withHTTPMethod("POST") - .withResourceARN("arn:aws:service:us-east-1:111111111111:resource") - .withURLPath("/bar/123") - .withServiceType("AWS::EC2::Instance"); + RuleParams params = new RuleParams(null); + params.attributes = null; + params.host = "192.168.1.1"; + params.serviceName = "www.foo.com"; + params.httpMethod = "POST"; + params.resourceArn = "arn:aws:service:us-east-1:111111111111:resource"; + params.urlPath = "/bar/123"; + params.serviceType = "AWS::EC2::Instance"; + SamplingRule rule = RuleBuilder.createRule(params); SamplingRequest req = new SamplingRequest( "role-arn", diff --git a/aws-xray-recorder-sdk-core/src/test/java/com/amazonaws/xray/strategy/sampling/rule/RuleBuilder.java b/aws-xray-recorder-sdk-core/src/test/java/com/amazonaws/xray/strategy/sampling/rule/RuleBuilder.java new file mode 100644 index 00000000..c4bba593 --- /dev/null +++ b/aws-xray-recorder-sdk-core/src/test/java/com/amazonaws/xray/strategy/sampling/rule/RuleBuilder.java @@ -0,0 +1,49 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://aws.amazon.com/apache2.0 + * + * or in the "license" file accompanying this file. This file is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package com.amazonaws.xray.strategy.sampling.rule; + +import com.amazonaws.xray.strategy.sampling.GetSamplingRulesResponse.SamplingRule; +import java.util.Map; + +public final class RuleBuilder { + private RuleBuilder() { + throw new UnsupportedOperationException("Utility class for testing."); + } + + public static class RuleParams { + public String name; + public int priority = 1; + public int reservoirSize = 10; + public double fixedRate = 0.05; + public String host; + public String serviceName; + public String serviceType; + public String httpMethod; + public String urlPath; + public String resourceArn; + public Map attributes; + + public RuleParams(String ruleName) { + name = ruleName; + } + } + + public static SamplingRule createRule(RuleParams params) { + return SamplingRule.create(params.attributes, params.fixedRate, + params.host, params.httpMethod, params.priority, params.reservoirSize, params.resourceArn, null, + params.name, params.serviceName, params.serviceType, params.urlPath, null); + } +} diff --git a/build.gradle.kts b/build.gradle.kts index 49f187f8..ded53902 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -118,8 +118,11 @@ allprojects { excludeTests = true - // TODO(anuraaga): Enable on all projects. - skipCheckerFramework = project.name != "aws-xray-recorder-sdk-core" || JavaVersion.current() != JavaVersion.VERSION_11 + // Two reasons we cannot run the Nullness Checker on aws-xray-recorder-sdk-core: + // 1. Google AutoValue does not generate @Nullable or @NonNull annotations on methods like equals() and hashCode(). + // 2. The existing codebase does not consistently perform null checks, in line with the behavior of the X-Ray SDK: + // https://docs.aws.amazon.com/xray/latest/api/API_SamplingTargetDocument.html + skipCheckerFramework = true } dependencies {