Skip to content

Commit 8d24920

Browse files
authored
Update user agent construction and deprecate old SdkUserAgent class (#5596)
* Update user agent construction and deprecate old SdkUserAgent class * Add japicmp exclusion for USER_REGION * Removing validation of user agent prefix and user agent suffix from testing, since client no longer depends on those values to be an empty string * Reverting setting default values for prefix/suffix params and some other changes * Updating codegen tests and fixing internal marker bug * Small log name change * Unused import
1 parent efe5fef commit 8d24920

File tree

23 files changed

+1134
-322
lines changed

23 files changed

+1134
-322
lines changed
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"type": "feature",
3+
"category": "AWS SDK for Java v2",
4+
"contributor": "",
5+
"description": "Refactoring the user agent string format to be more consistent across SDKs"
6+
}

build-tools/src/main/resources/software/amazon/awssdk/spotbugs-suppressions.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,7 @@
280280
<Class name="software.amazon.awssdk.codegen.model.service.Waiters"/>
281281
<Class name="software.amazon.awssdk.regions.EndpointTag"/>
282282
<Class name="software.amazon.awssdk.regions.Region"/>
283+
<Class name="software.amazon.awssdk.core.internal.useragent.DefaultSystemUserAgent"/>
283284
<Class name="software.amazon.awssdk.core.util.DefaultSdkAutoConstructList"/>
284285
<Class name="software.amazon.awssdk.core.util.DefaultSdkAutoConstructMap"/>
285286
<Class name="software.amazon.awssdk.http.nio.netty.internal.http2.FlushOnReadHandler"/>

core/imds/src/main/java/software/amazon/awssdk/imds/internal/RequestMarshaller.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
import java.net.URI;
1919
import java.time.Duration;
2020
import software.amazon.awssdk.annotations.SdkInternalApi;
21-
import software.amazon.awssdk.core.util.SdkUserAgent;
21+
import software.amazon.awssdk.core.util.SystemUserAgent;
2222
import software.amazon.awssdk.http.SdkHttpFullRequest;
2323
import software.amazon.awssdk.http.SdkHttpMethod;
2424

@@ -69,7 +69,7 @@ public SdkHttpFullRequest createDataRequest(String path, String token, Duration
6969

7070
private SdkHttpFullRequest.Builder defaulttHttpBuilder() {
7171
return SdkHttpFullRequest.builder()
72-
.putHeader(USER_AGENT, SdkUserAgent.create().userAgent())
72+
.putHeader(USER_AGENT, SystemUserAgent.getOrCreate().userAgentString())
7373
.putHeader(ACCEPT, "*/*")
7474
.putHeader(CONNECTION, "keep-alive");
7575
}

core/sdk-core/src/main/java/software/amazon/awssdk/core/client/builder/SdkDefaultClientBuilder.java

Lines changed: 39 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,10 @@
4848
import static software.amazon.awssdk.core.client.config.SdkClientOption.RETRY_STRATEGY;
4949
import static software.amazon.awssdk.core.client.config.SdkClientOption.SCHEDULED_EXECUTOR_SERVICE;
5050
import static software.amazon.awssdk.core.client.config.SdkClientOption.SYNC_HTTP_CLIENT;
51+
import static software.amazon.awssdk.core.internal.useragent.UserAgentConstant.HTTP;
52+
import static software.amazon.awssdk.core.internal.useragent.UserAgentConstant.INTERNAL_METADATA_MARKER;
53+
import static software.amazon.awssdk.core.internal.useragent.UserAgentConstant.IO;
54+
import static software.amazon.awssdk.core.internal.useragent.UserAgentConstant.RETRY_MODE;
5155
import static software.amazon.awssdk.utils.CollectionUtils.mergeLists;
5256
import static software.amazon.awssdk.utils.Validate.paramNotNull;
5357

@@ -71,6 +75,7 @@
7175
import software.amazon.awssdk.annotations.SdkProtectedApi;
7276
import software.amazon.awssdk.annotations.SdkTestInternalApi;
7377
import software.amazon.awssdk.core.ClientEndpointProvider;
78+
import software.amazon.awssdk.core.ClientType;
7479
import software.amazon.awssdk.core.CompressionConfiguration;
7580
import software.amazon.awssdk.core.SdkPlugin;
7681
import software.amazon.awssdk.core.SdkSystemSetting;
@@ -82,13 +87,14 @@
8287
import software.amazon.awssdk.core.interceptor.ExecutionInterceptor;
8388
import software.amazon.awssdk.core.internal.http.loader.DefaultSdkAsyncHttpClientBuilder;
8489
import software.amazon.awssdk.core.internal.http.loader.DefaultSdkHttpClientBuilder;
85-
import software.amazon.awssdk.core.internal.http.pipeline.stages.ApplyUserAgentStage;
8690
import software.amazon.awssdk.core.internal.http.pipeline.stages.CompressRequestStage;
8791
import software.amazon.awssdk.core.internal.interceptor.HttpChecksumValidationInterceptor;
8892
import software.amazon.awssdk.core.internal.retry.SdkDefaultRetryStrategy;
93+
import software.amazon.awssdk.core.internal.useragent.SdkClientUserAgentProperties;
94+
import software.amazon.awssdk.core.internal.useragent.SdkUserAgentBuilder;
8995
import software.amazon.awssdk.core.retry.RetryMode;
9096
import software.amazon.awssdk.core.retry.RetryPolicy;
91-
import software.amazon.awssdk.core.util.SdkUserAgent;
97+
import software.amazon.awssdk.core.util.SystemUserAgent;
9298
import software.amazon.awssdk.http.ExecutableHttpRequest;
9399
import software.amazon.awssdk.http.HttpExecuteRequest;
94100
import software.amazon.awssdk.http.SdkHttpClient;
@@ -108,8 +114,10 @@
108114
import software.amazon.awssdk.utils.Either;
109115
import software.amazon.awssdk.utils.Lazy;
110116
import software.amazon.awssdk.utils.OptionalUtils;
117+
import software.amazon.awssdk.utils.StringUtils;
111118
import software.amazon.awssdk.utils.ThreadFactoryBuilder;
112119
import software.amazon.awssdk.utils.Validate;
120+
import software.amazon.awssdk.utils.http.SdkHttpUtils;
113121

114122
/**
115123
* An SDK-internal implementation of the methods in {@link SdkClientBuilder}, {@link SdkAsyncClientBuilder} and
@@ -283,7 +291,7 @@ private SdkClientConfiguration mergeGlobalDefaults(SdkClientConfiguration config
283291
.lazyOption(PROFILE_FILE, conf -> conf.get(PROFILE_FILE_SUPPLIER).get())
284292
.option(PROFILE_NAME,
285293
ProfileFileSystemSetting.AWS_PROFILE.getStringValueOrThrow())
286-
.option(USER_AGENT_PREFIX, SdkUserAgent.create().userAgent())
294+
.option(USER_AGENT_PREFIX, "")
287295
.option(USER_AGENT_SUFFIX, "")
288296
.option(CRC32_FROM_COMPRESSED_DATA_ENABLED, false)
289297
.option(CONFIGURED_COMPRESSION_CONFIGURATION,
@@ -384,7 +392,8 @@ protected SdkClientConfiguration invokePlugins(SdkClientConfiguration config) {
384392
return config;
385393
}
386394

387-
private String resolveRetryMode(RetryPolicy retryPolicy, RetryStrategy retryStrategy) {
395+
//TODO (useragent): Refactor this as part of moving value to business metrics (UA 2.1)
396+
private static String resolveRetryMode(RetryPolicy retryPolicy, RetryStrategy retryStrategy) {
388397
if (retryPolicy != null) {
389398
return retryPolicy.retryMode().toString();
390399
}
@@ -401,13 +410,32 @@ private String resolveRetryMode(RetryPolicy retryPolicy, RetryStrategy retryStra
401410
}
402411

403412
private String resolveClientUserAgent(LazyValueSource config) {
404-
String retryMode = resolveRetryMode(config.get(RETRY_POLICY), config.get(RETRY_STRATEGY));
405-
return ApplyUserAgentStage.resolveClientUserAgent(config.get(USER_AGENT_PREFIX),
406-
config.get(INTERNAL_USER_AGENT),
407-
config.get(CLIENT_TYPE),
408-
config.get(SYNC_HTTP_CLIENT),
409-
config.get(ASYNC_HTTP_CLIENT),
410-
retryMode);
413+
SdkClientUserAgentProperties clientProperties = new SdkClientUserAgentProperties();
414+
415+
ClientType clientType = config.get(CLIENT_TYPE);
416+
ClientType resolvedClientType = clientType == null ? ClientType.UNKNOWN : config.get(CLIENT_TYPE);
417+
418+
clientProperties.putProperty(RETRY_MODE, StringUtils.lowerCase(resolveRetryMode(config.get(RETRY_POLICY),
419+
config.get(RETRY_STRATEGY))));
420+
clientProperties.putProperty(INTERNAL_METADATA_MARKER, StringUtils.trimToEmpty(config.get(INTERNAL_USER_AGENT)));
421+
clientProperties.putProperty(IO, StringUtils.lowerCase(resolvedClientType.name()));
422+
clientProperties.putProperty(HTTP, SdkHttpUtils.urlEncode(clientName(resolvedClientType,
423+
config.get(SYNC_HTTP_CLIENT),
424+
config.get(ASYNC_HTTP_CLIENT))));
425+
426+
return SdkUserAgentBuilder.buildClientUserAgentString(SystemUserAgent.getOrCreate(), clientProperties);
427+
}
428+
429+
private static String clientName(ClientType clientType, SdkHttpClient syncHttpClient, SdkAsyncHttpClient asyncHttpClient) {
430+
if (clientType == SYNC) {
431+
return syncHttpClient == null ? "null" : syncHttpClient.clientName();
432+
}
433+
434+
if (clientType == ASYNC) {
435+
return asyncHttpClient == null ? "null" : asyncHttpClient.clientName();
436+
}
437+
438+
return ClientType.UNKNOWN.name();
411439
}
412440

413441
private RetryStrategy resolveRetryStrategy(LazyValueSource config) {

core/sdk-core/src/main/java/software/amazon/awssdk/core/client/config/SdkClientOption.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import software.amazon.awssdk.core.ServiceConfiguration;
3131
import software.amazon.awssdk.core.interceptor.ExecutionAttributes;
3232
import software.amazon.awssdk.core.interceptor.ExecutionInterceptor;
33+
import software.amazon.awssdk.core.internal.useragent.SdkClientUserAgentProperties;
3334
import software.amazon.awssdk.core.retry.RetryMode;
3435
import software.amazon.awssdk.core.retry.RetryPolicy;
3536
import software.amazon.awssdk.endpoints.EndpointProvider;
@@ -266,6 +267,8 @@ public final class SdkClientOption<T> extends ClientOption<T> {
266267

267268
/**
268269
* A user agent prefix that is specific to the client (agnostic of the request).
270+
*
271+
* Not currently in use, since the introduction of {@link SdkClientUserAgentProperties}
269272
*/
270273
public static final SdkClientOption<String> CLIENT_USER_AGENT = new SdkClientOption<>(String.class);
271274

core/sdk-core/src/main/java/software/amazon/awssdk/core/client/config/SdkClientOptionValidation.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@ private static void validateClientOptions(SdkClientConfiguration c) {
4545
require("overrideConfiguration.additionalHttpHeaders", c.option(SdkClientOption.ADDITIONAL_HTTP_HEADERS));
4646
require("overrideConfiguration.executionInterceptors", c.option(SdkClientOption.EXECUTION_INTERCEPTORS));
4747
require("overrideConfiguration.retryStrategy", c.option(SdkClientOption.RETRY_STRATEGY));
48-
4948
require("overrideConfiguration.advancedOption[USER_AGENT_PREFIX]",
5049
c.option(SdkAdvancedClientOption.USER_AGENT_PREFIX));
5150
require("overrideConfiguration.advancedOption[USER_AGENT_SUFFIX]",

0 commit comments

Comments
 (0)