Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion powertools-core/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<directory>src/main/resources-filtered</directory>
<filtering>true</filtering>
</resource>
</resources>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,18 @@

import static software.amazon.lambda.powertools.core.internal.SystemWrapper.getenv;

public class UserAgentConfigurer {
/**
* Can be used to create a string that can server as a User-Agent suffix in requests made with the AWS SDK clients
*/
public class UserAgentConfigurator {

public static final String NA = "NA";
public static final String VERSION_KEY = "powertools.version";
public static final String PT_FEATURE_VARIABLE = "${PT_FEATURE}";
public static final String PT_EXEC_ENV_VARIABLE = "${PT_EXEC_ENV}";
public static final String VERSION_PROPERTIES_FILENAME = "version.properties";
public static final String AWS_EXECUTION_ENV = "AWS_EXECUTION_ENV";
private static final Logger LOG = LoggerFactory.getLogger(UserAgentConfigurer.class);
private static final Logger LOG = LoggerFactory.getLogger(UserAgentConfigurator.class);
private static final String NO_OP = "no-op";
private static String PT_VERSION = getProjectVersion();
private static String USER_AGENT_PATTERN = "PT/" + PT_FEATURE_VARIABLE + "/" + PT_VERSION + " PTEnv/" + PT_EXEC_ENV_VARIABLE;
Expand Down Expand Up @@ -86,5 +89,4 @@ public static String getUserAgent(String ptFeature) {
.replace(PT_FEATURE_VARIABLE, ptFeature)
.replace(PT_EXEC_ENV_VARIABLE, ptExecEnv);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# The filtered properties can have variables that are filled in y system properties or project properties.
Comment thread
jeromevdl marked this conversation as resolved.
Outdated
# See https://maven.apache.org/plugins/maven-resources-plugin/examples/filter.html
#
# The values are replaced before copying the resources to the main output directory. Therefore, ass soon as the build phase is completed,
# the values should have been replaced if the properties are available and if 'filtering' is set to true in the pom.xml
#
#
# The ${project.version} is retrieved from the respective pom.xml property
powertools.version=${project.version}
1 change: 0 additions & 1 deletion powertools-core/src/main/resources/version.properties

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -9,17 +9,17 @@
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mockStatic;
import static software.amazon.lambda.powertools.core.internal.SystemWrapper.getenv;
import static software.amazon.lambda.powertools.core.internal.UserAgentConfigurer.VERSION_KEY;
import static software.amazon.lambda.powertools.core.internal.UserAgentConfigurer.getVersionFromProperties;
import static software.amazon.lambda.powertools.core.internal.UserAgentConfigurer.VERSION_PROPERTIES_FILENAME;
import static software.amazon.lambda.powertools.core.internal.UserAgentConfigurer.AWS_EXECUTION_ENV;
import static software.amazon.lambda.powertools.core.internal.UserAgentConfigurator.VERSION_KEY;
import static software.amazon.lambda.powertools.core.internal.UserAgentConfigurator.getVersionFromProperties;
import static software.amazon.lambda.powertools.core.internal.UserAgentConfigurator.VERSION_PROPERTIES_FILENAME;
import static software.amazon.lambda.powertools.core.internal.UserAgentConfigurator.AWS_EXECUTION_ENV;



public class UserAgentConfigurerTest {
public class UserAgentConfiguratorTest {

private static final String SEM_VER_PATTERN = "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$";
private static final String VERSION = UserAgentConfigurer.getProjectVersion();
private static final String VERSION = UserAgentConfigurator.getProjectVersion();


@Test
Expand Down Expand Up @@ -65,7 +65,7 @@ public void testGetVersionFromProperties_EmptyVersion() {

@Test
public void testGetUserAgent() {
String userAgent = UserAgentConfigurer.getUserAgent("test-feature");
String userAgent = UserAgentConfigurator.getUserAgent("test-feature");

assertThat(userAgent).isNotNull();
assertThat(userAgent).isEqualTo("PT/test-feature/" + VERSION + " PTEnv/NA");
Expand All @@ -74,15 +74,15 @@ public void testGetUserAgent() {

@Test
public void testGetUserAgent_NoFeature() {
String userAgent = UserAgentConfigurer.getUserAgent("");
String userAgent = UserAgentConfigurator.getUserAgent("");

assertThat(userAgent).isNotNull();
assertThat(userAgent).isEqualTo("PT/no-op/" + VERSION + " PTEnv/NA");
}

@Test
public void testGetUserAgent_NullFeature() {
String userAgent = UserAgentConfigurer.getUserAgent(null);
String userAgent = UserAgentConfigurator.getUserAgent(null);

assertThat(userAgent).isNotNull();
assertThat(userAgent).isEqualTo("PT/no-op/" + VERSION + " PTEnv/NA");
Expand All @@ -92,7 +92,7 @@ public void testGetUserAgent_NullFeature() {
public void testGetUserAgent_SetAWSExecutionEnv() {
try (MockedStatic<SystemWrapper> mockedSystemWrapper = mockStatic(SystemWrapper.class)) {
mockedSystemWrapper.when(() -> getenv(AWS_EXECUTION_ENV)).thenReturn("AWS_Lambda_java8");
String userAgent = UserAgentConfigurer.getUserAgent("test-feature");
String userAgent = UserAgentConfigurator.getUserAgent("test-feature");

assertThat(userAgent).isNotNull();
assertThat(userAgent).isEqualTo("PT/test-feature/" + VERSION + " PTEnv/AWS_Lambda_java8");
Expand Down
3 changes: 2 additions & 1 deletion powertools-core/src/test/resources/unreadable.properties
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
powertools.version=${project.version}
# This is intentionally left empty
# It used during testing and is set to un-readable to fulfil the test purposes.
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,14 @@

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import software.amazon.awssdk.auth.credentials.EnvironmentVariableCredentialsProvider;
import software.amazon.awssdk.core.client.config.ClientOverrideConfiguration;
import software.amazon.awssdk.core.client.config.SdkAdvancedClientOption;
import software.amazon.awssdk.http.urlconnection.UrlConnectionHttpClient;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
import software.amazon.awssdk.services.dynamodb.model.*;
import software.amazon.awssdk.utils.StringUtils;
import software.amazon.lambda.powertools.core.internal.UserAgentConfigurer;
import software.amazon.lambda.powertools.core.internal.UserAgentConfigurator;
import software.amazon.lambda.powertools.idempotency.Constants;
import software.amazon.lambda.powertools.idempotency.exceptions.IdempotencyItemAlreadyExistsException;
import software.amazon.lambda.powertools.idempotency.exceptions.IdempotencyItemNotFoundException;
Expand Down Expand Up @@ -91,18 +90,9 @@ private DynamoDBPersistenceStore(String tableName,
if (idempotencyDisabledEnv == null || idempotencyDisabledEnv.equalsIgnoreCase("false")) {
this.dynamoDbClient = DynamoDbClient.builder()
.httpClient(UrlConnectionHttpClient.builder().build())
.overrideConfiguration(ClientOverrideConfiguration.builder().putAdvancedOption(SdkAdvancedClientOption.USER_AGENT_SUFFIX, UserAgentConfigurer.getUserAgent(IDEMPOTENCY)).build())
.region(Region.of(System.getenv(AWS_REGION_ENV)));

// AWS_LAMBDA_INITIALIZATION_TYPE has two values on-demand and snap-start
// when using snap-start mode, the env var creds provider isn't used and causes a fatal error if set
// fall back to the default provider chain if the mode is anything other than on-demand.
String initializationType = System.getenv().get(AWS_LAMBDA_INITIALIZATION_TYPE);
if (initializationType != null && initializationType.equals(ON_DEMAND)) {
ddbBuilder.credentialsProvider(EnvironmentVariableCredentialsProvider.create());
}

this.dynamoDbClient = ddbBuilder.build();
.overrideConfiguration(ClientOverrideConfiguration.builder().putAdvancedOption(SdkAdvancedClientOption.USER_AGENT_SUFFIX, UserAgentConfigurator.getUserAgent(IDEMPOTENCY)).build())
.region(Region.of(System.getenv(AWS_REGION_ENV)))
.build();
} else {
// we do not want to create a DynamoDbClient if idempotency is disabled
// null is ok as idempotency won't be called
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,7 @@
import software.amazon.awssdk.services.appconfigdata.model.GetLatestConfigurationRequest;
import software.amazon.awssdk.services.appconfigdata.model.GetLatestConfigurationResponse;
import software.amazon.awssdk.services.appconfigdata.model.StartConfigurationSessionRequest;
import software.amazon.lambda.powertools.core.internal.LambdaConstants;
import software.amazon.lambda.powertools.core.internal.UserAgentConfigurer;
import software.amazon.lambda.powertools.core.internal.UserAgentConfigurator;
import software.amazon.lambda.powertools.parameters.cache.CacheManager;
import software.amazon.lambda.powertools.parameters.transform.TransformationManager;

Expand Down Expand Up @@ -147,17 +146,8 @@ public AppConfigProvider build() {
.httpClientBuilder(UrlConnectionHttpClient.builder())
.region(Region.of(System.getenv(SdkSystemSetting.AWS_REGION.environmentVariable())))
.overrideConfiguration(ClientOverrideConfiguration.builder()
.putAdvancedOption(SdkAdvancedClientOption.USER_AGENT_SUFFIX, UserAgentConfigurer.getUserAgent(PARAMETERS)).build());

// AWS_LAMBDA_INITIALIZATION_TYPE has two values on-demand and snap-start
// when using snap-start mode, the env var creds provider isn't used and causes a fatal error if set
// fall back to the default provider chain if the mode is anything other than on-demand.
String initializationType = System.getenv().get(AWS_LAMBDA_INITIALIZATION_TYPE);
if (initializationType != null && initializationType.equals(LambdaConstants.ON_DEMAND)) {
appConfigDataClientBuilder.credentialsProvider(EnvironmentVariableCredentialsProvider.create());
}

client = appConfigDataClientBuilder.build();
.putAdvancedOption(SdkAdvancedClientOption.USER_AGENT_SUFFIX, UserAgentConfigurator.getUserAgent(PARAMETERS)).build())
.build();
}

AppConfigProvider provider = new AppConfigProvider(cacheManager, client, environment, application);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,8 @@
import software.amazon.awssdk.http.urlconnection.UrlConnectionHttpClient;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
import software.amazon.awssdk.services.dynamodb.model.AttributeValue;
import software.amazon.awssdk.services.dynamodb.model.GetItemRequest;
import software.amazon.awssdk.services.dynamodb.model.GetItemResponse;
import software.amazon.awssdk.services.dynamodb.model.QueryRequest;
import software.amazon.awssdk.services.dynamodb.model.QueryResponse;
import software.amazon.lambda.powertools.core.internal.LambdaConstants;
import software.amazon.lambda.powertools.core.internal.UserAgentConfigurer;
import software.amazon.awssdk.services.dynamodb.model.*;
Comment thread
jeromevdl marked this conversation as resolved.
import software.amazon.lambda.powertools.core.internal.UserAgentConfigurator;
import software.amazon.lambda.powertools.parameters.cache.CacheManager;
import software.amazon.lambda.powertools.parameters.exception.DynamoDbProviderSchemaException;
import software.amazon.lambda.powertools.parameters.transform.TransformationManager;
Expand Down Expand Up @@ -192,17 +187,8 @@ private static DynamoDbClient createClient() {
return DynamoDbClient.builder()
.httpClientBuilder(UrlConnectionHttpClient.builder())
.region(Region.of(System.getenv(SdkSystemSetting.AWS_REGION.environmentVariable())))
.overrideConfiguration(ClientOverrideConfiguration.builder().putAdvancedOption(SdkAdvancedClientOption.USER_AGENT_SUFFIX, UserAgentConfigurer.getUserAgent(PARAMETERS)).build());

// AWS_LAMBDA_INITIALIZATION_TYPE has two values on-demand and snap-start
// when using snap-start mode, the env var creds provider isn't used and causes a fatal error if set
// fall back to the default provider chain if the mode is anything other than on-demand.
String initializationType = System.getenv().get(AWS_LAMBDA_INITIALIZATION_TYPE);
if (initializationType != null && initializationType.equals(LambdaConstants.ON_DEMAND)) {
dynamoDbClientBuilder.credentialsProvider(EnvironmentVariableCredentialsProvider.create());
}

return dynamoDbClientBuilder.build();
.overrideConfiguration(ClientOverrideConfiguration.builder().putAdvancedOption(SdkAdvancedClientOption.USER_AGENT_SUFFIX, UserAgentConfigurator.getUserAgent(PARAMETERS)).build())
.build();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,7 @@
import software.amazon.awssdk.services.ssm.model.GetParametersByPathRequest;
import software.amazon.awssdk.services.ssm.model.GetParametersByPathResponse;
import software.amazon.awssdk.utils.StringUtils;
import software.amazon.lambda.powertools.core.internal.LambdaConstants;
import software.amazon.lambda.powertools.core.internal.UserAgentConfigurer;
import software.amazon.lambda.powertools.core.internal.UserAgentConfigurator;
import software.amazon.lambda.powertools.parameters.cache.CacheManager;
import software.amazon.lambda.powertools.parameters.transform.TransformationManager;
import software.amazon.lambda.powertools.parameters.transform.Transformer;
Expand Down Expand Up @@ -285,18 +284,8 @@ private static SsmClient createClient() {
return SsmClient.builder()
.httpClientBuilder(UrlConnectionHttpClient.builder())
.region(Region.of(System.getenv(SdkSystemSetting.AWS_REGION.environmentVariable())))
.overrideConfiguration(ClientOverrideConfiguration.builder().putAdvancedOption(SdkAdvancedClientOption.USER_AGENT_SUFFIX, UserAgentConfigurer.getUserAgent(PARAMETERS)).build());
;

// AWS_LAMBDA_INITIALIZATION_TYPE has two values on-demand and snap-start
// when using snap-start mode, the env var creds provider isn't used and causes a fatal error if set
// fall back to the default provider chain if the mode is anything other than on-demand.
String initializationType = System.getenv().get(AWS_LAMBDA_INITIALIZATION_TYPE);
if (initializationType != null && initializationType.equals(LambdaConstants.ON_DEMAND)) {
ssmClientBuilder.credentialsProvider(EnvironmentVariableCredentialsProvider.create());
}

return ssmClientBuilder.build();
.overrideConfiguration(ClientOverrideConfiguration.builder().putAdvancedOption(SdkAdvancedClientOption.USER_AGENT_SUFFIX, UserAgentConfigurator.getUserAgent(PARAMETERS)).build())
.build();
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,7 @@
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.secretsmanager.SecretsManagerClient;
import software.amazon.awssdk.services.secretsmanager.model.GetSecretValueRequest;
import software.amazon.lambda.powertools.core.internal.LambdaConstants;
import software.amazon.lambda.powertools.core.internal.UserAgentConfigurer;
import software.amazon.lambda.powertools.core.internal.UserAgentConfigurator;
import software.amazon.lambda.powertools.parameters.cache.CacheManager;
import software.amazon.lambda.powertools.parameters.transform.TransformationManager;
import software.amazon.lambda.powertools.parameters.transform.Transformer;
Expand Down Expand Up @@ -194,17 +193,8 @@ private static SecretsManagerClient createClient() {
return SecretsManagerClient.builder()
.httpClientBuilder(UrlConnectionHttpClient.builder())
.region(Region.of(System.getenv(SdkSystemSetting.AWS_REGION.environmentVariable())))
.overrideConfiguration(ClientOverrideConfiguration.builder().putAdvancedOption(SdkAdvancedClientOption.USER_AGENT_SUFFIX, UserAgentConfigurer.getUserAgent(PARAMETERS)).build());

// AWS_LAMBDA_INITIALIZATION_TYPE has two values on-demand and snap-start
// when using snap-start mode, the env var creds provider isn't used and causes a fatal error if set
// fall back to the default provider chain if the mode is anything other than on-demand.
String initializationType = System.getenv().get(AWS_LAMBDA_INITIALIZATION_TYPE);
if (initializationType != null && initializationType.equals(LambdaConstants.ON_DEMAND)) {
secretsManagerClientBuilder.credentialsProvider(EnvironmentVariableCredentialsProvider.create());
}

return secretsManagerClientBuilder.build();
.overrideConfiguration(ClientOverrideConfiguration.builder().putAdvancedOption(SdkAdvancedClientOption.USER_AGENT_SUFFIX, UserAgentConfigurator.getUserAgent(PARAMETERS)).build())
.build();
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
import software.amazon.awssdk.core.client.config.SdkAdvancedClientOption;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.sqs.SqsClient;
import software.amazon.lambda.powertools.core.internal.UserAgentConfigurer;
import software.amazon.lambda.powertools.core.internal.UserAgentConfigurator;
import software.amazon.lambda.powertools.sqs.exception.SkippedMessageDueToFailedBatchException;
import software.amazon.lambda.powertools.sqs.internal.BatchContext;
import software.amazon.lambda.powertools.sqs.internal.SqsLargeMessageAspect;
Expand Down Expand Up @@ -495,7 +495,7 @@ public static <R> List<R> batchProcessor(final SQSEvent event,

if (client == null) {
client = (SqsClient) SqsClient.builder()
.overrideConfiguration(ClientOverrideConfiguration.builder().putAdvancedOption(SdkAdvancedClientOption.USER_AGENT_SUFFIX, UserAgentConfigurer.getUserAgent(SQS)).build());
.overrideConfiguration(ClientOverrideConfiguration.builder().putAdvancedOption(SdkAdvancedClientOption.USER_AGENT_SUFFIX, UserAgentConfigurator.getUserAgent(SQS)).build());
}

BatchContext batchContext = new BatchContext(client);
Expand Down Expand Up @@ -581,7 +581,7 @@ public static ObjectMapper objectMapper() {
public static S3Client s3Client() {
if (null == s3Client) {
s3Client = (S3Client) S3Client.builder().
overrideConfiguration(ClientOverrideConfiguration.builder().putAdvancedOption(SdkAdvancedClientOption.USER_AGENT_SUFFIX, UserAgentConfigurer.getUserAgent(SQS)).build());
overrideConfiguration(ClientOverrideConfiguration.builder().putAdvancedOption(SdkAdvancedClientOption.USER_AGENT_SUFFIX, UserAgentConfigurator.getUserAgent(SQS)).build());
}

return s3Client;
Expand Down