Skip to content

Commit fe6c549

Browse files
committed
Add opt-out for specific clients with normal autoconfiguration
1 parent 06a2072 commit fe6c549

15 files changed

+273
-72
lines changed

spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/core/AwsAutoConfiguration.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616
package io.awspring.cloud.autoconfigure.core;
1717

18+
import java.time.Duration;
1819
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
1920
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
2021
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
@@ -27,8 +28,6 @@
2728
import software.amazon.awssdk.metrics.publishers.cloudwatch.CloudWatchMetricPublisher;
2829
import software.amazon.awssdk.regions.providers.AwsRegionProvider;
2930

30-
import java.time.Duration;
31-
3231
/**
3332
* Autoconfigures AWS environment.
3433
*
@@ -56,7 +55,7 @@ MetricPublisher cloudWatchMetricPublisher() {
5655
if (awsProperties.getMetrics() != null) {
5756
propertyMapper.from(awsProperties.getMetrics()::getNamespace).whenNonNull().to(builder::namespace);
5857
propertyMapper.from(awsProperties.getMetrics()::getUploadFrequencyInSeconds).whenNonNull()
59-
.to(v -> builder.uploadFrequency(Duration.ofSeconds(v)));
58+
.to(v -> builder.uploadFrequency(Duration.ofSeconds(v)));
6059
}
6160
return builder.build();
6261
}

spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/core/AwsClientBuilderConfigurer.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,18 @@
1717

1818
import io.awspring.cloud.autoconfigure.AwsClientProperties;
1919
import io.awspring.cloud.core.SpringCloudClientConfiguration;
20+
import java.time.Duration;
2021
import java.util.Optional;
22+
import org.springframework.boot.context.properties.PropertyMapper;
2123
import org.springframework.lang.Nullable;
2224
import org.springframework.util.Assert;
25+
import org.springframework.util.ClassUtils;
2326
import org.springframework.util.StringUtils;
2427
import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider;
2528
import software.amazon.awssdk.awscore.client.builder.AwsClientBuilder;
2629
import software.amazon.awssdk.core.client.config.ClientOverrideConfiguration;
2730
import software.amazon.awssdk.metrics.MetricPublisher;
31+
import software.amazon.awssdk.metrics.publishers.cloudwatch.CloudWatchMetricPublisher;
2832
import software.amazon.awssdk.regions.Region;
2933
import software.amazon.awssdk.regions.providers.AwsRegionProvider;
3034

@@ -82,4 +86,24 @@ public Region resolveRegion(@Nullable AwsClientProperties clientProperties) {
8286
? Region.of(clientProperties.getRegion())
8387
: this.regionProvider.getRegion();
8488
}
89+
90+
public static @Nullable MetricPublisher createSpecificMetricPublisher(MetricPublisher metricPublisher,
91+
AwsClientProperties properties) {
92+
if (ClassUtils.isPresent("software.amazon.awssdk.metrics.publishers.cloudwatch.CloudWatchMetricPublisher", null)
93+
&& properties.getMetrics() != null) {
94+
if (properties.getMetrics().getEnabled() == null || properties.getMetrics().getEnabled()) {
95+
CloudWatchMetricPublisher.Builder builder = CloudWatchMetricPublisher.builder();
96+
PropertyMapper propertyMapper = PropertyMapper.get();
97+
propertyMapper.from(properties.getMetrics()::getNamespace).whenNonNull().to(builder::namespace);
98+
propertyMapper.from(properties.getMetrics()::getUploadFrequencyInSeconds).whenNonNull()
99+
.to(v -> builder.uploadFrequency(Duration.ofSeconds(v)));
100+
return builder.build();
101+
}
102+
if (properties.getMetrics().getEnabled() != null && !properties.getMetrics().getEnabled()) {
103+
return null;
104+
}
105+
106+
}
107+
return metricPublisher;
108+
}
85109
}

spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/dynamodb/DynamoDbAutoConfiguration.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
*/
1616
package io.awspring.cloud.autoconfigure.dynamodb;
1717

18+
import static io.awspring.cloud.autoconfigure.core.AwsClientBuilderConfigurer.createSpecificMetricPublisher;
19+
1820
import io.awspring.cloud.autoconfigure.core.AwsClientBuilderConfigurer;
1921
import io.awspring.cloud.autoconfigure.core.AwsClientCustomizer;
2022
import io.awspring.cloud.autoconfigure.core.CredentialsProviderAutoConfiguration;
@@ -58,9 +60,11 @@ public DynamoDbAutoConfiguration(DynamoDbProperties properties) {
5860
@Bean
5961
public DynamoDbClientBuilder dynamoDbClientBuilder(AwsClientBuilderConfigurer awsClientBuilderConfigurer,
6062
ObjectProvider<AwsClientCustomizer<DynamoDbClientBuilder>> configurer,
61-
ObjectProvider<MetricPublisher> metricPublisher) {
63+
ObjectProvider<MetricPublisher> metricPublisherObjectProvider) {
64+
MetricPublisher metricPublisher = createSpecificMetricPublisher(metricPublisherObjectProvider.getIfAvailable(),
65+
properties);
6266
return awsClientBuilderConfigurer.configure(DynamoDbClient.builder(), properties, configurer.getIfAvailable(),
63-
metricPublisher.getIfAvailable());
67+
metricPublisher);
6468
}
6569

6670
@ConditionalOnMissingBean

spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/metrics/CloudWatchExportAutoConfiguration.java

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@
3838
import software.amazon.awssdk.regions.providers.AwsRegionProvider;
3939
import software.amazon.awssdk.services.cloudwatch.CloudWatchAsyncClient;
4040
import software.amazon.awssdk.services.cloudwatch.CloudWatchAsyncClientBuilder;
41-
import software.amazon.awssdk.services.cloudwatch.CloudWatchClientBuilder;
4241

4342
/**
4443
* Configuration for exporting metrics to CloudWatch.
@@ -65,20 +64,14 @@ public CloudWatchMeterRegistry cloudWatchMeterRegistry(CloudWatchConfig config,
6564
return new CloudWatchMeterRegistry(config, clock, client);
6665
}
6766

68-
6967
@Bean
7068
@ConditionalOnMissingBean
71-
public CloudWatchAsyncClientBuilder cloudWatchAsyncClientBuilder(CloudWatchProperties properties,
72-
AwsClientBuilderConfigurer awsClientBuilderConfigurer,
73-
ObjectProvider<AwsClientCustomizer<CloudWatchAsyncClientBuilder>> configurer,
74-
ObjectProvider<MetricPublisher> metricPublisher) {
69+
public CloudWatchAsyncClient cloudWatchAsyncClient(CloudWatchProperties properties,
70+
AwsClientBuilderConfigurer awsClientBuilderConfigurer,
71+
ObjectProvider<AwsClientCustomizer<CloudWatchAsyncClientBuilder>> configurer,
72+
ObjectProvider<MetricPublisher> metricPublisherObjectProvider) {
7573
return awsClientBuilderConfigurer.configure(CloudWatchAsyncClient.builder(), properties,
76-
configurer.getIfAvailable(), metricPublisher.getIfAvailable());
77-
}
78-
@Bean
79-
@ConditionalOnMissingBean
80-
public CloudWatchAsyncClient cloudWatchAsyncClient(CloudWatchAsyncClientBuilder cloudWatchAsyncClientBuilder) {
81-
return cloudWatchAsyncClientBuilder.build();
74+
configurer.getIfAvailable(), metricPublisherObjectProvider.getIfAvailable()).build();
8275
}
8376

8477
@Bean

spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/s3/S3AutoConfiguration.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
*/
1616
package io.awspring.cloud.autoconfigure.s3;
1717

18+
import static io.awspring.cloud.autoconfigure.core.AwsClientBuilderConfigurer.createSpecificMetricPublisher;
19+
1820
import com.fasterxml.jackson.databind.ObjectMapper;
1921
import io.awspring.cloud.autoconfigure.core.AwsClientBuilderConfigurer;
2022
import io.awspring.cloud.autoconfigure.core.AwsClientCustomizer;
@@ -60,7 +62,7 @@
6062
@ConditionalOnProperty(name = "spring.cloud.aws.s3.enabled", havingValue = "true", matchIfMissing = true)
6163
public class S3AutoConfiguration {
6264

63-
private final S3Properties properties;
65+
private static S3Properties properties;
6466

6567
public S3AutoConfiguration(S3Properties properties) {
6668
this.properties = properties;
@@ -70,9 +72,11 @@ public S3AutoConfiguration(S3Properties properties) {
7072
@ConditionalOnMissingBean
7173
S3ClientBuilder s3ClientBuilder(AwsClientBuilderConfigurer awsClientBuilderConfigurer,
7274
ObjectProvider<AwsClientCustomizer<S3ClientBuilder>> configurer,
73-
ObjectProvider<MetricPublisher> metricPublisher) {
75+
ObjectProvider<MetricPublisher> metricPublisherObjectProvider) {
76+
MetricPublisher metricPublisher = createSpecificMetricPublisher(metricPublisherObjectProvider.getIfAvailable(),
77+
properties);
7478
S3ClientBuilder builder = awsClientBuilderConfigurer.configure(S3Client.builder(), this.properties,
75-
configurer.getIfAvailable(), metricPublisher.getIfAvailable());
79+
configurer.getIfAvailable(), metricPublisher);
7680
builder.serviceConfiguration(s3ServiceConfiguration());
7781
return builder;
7882
}
@@ -139,5 +143,4 @@ S3OutputStreamProvider inMemoryBufferingS3StreamProvider(S3Client s3Client,
139143
return new InMemoryBufferingS3OutputStreamProvider(s3Client,
140144
contentTypeResolver.orElseGet(PropertiesS3ObjectContentTypeResolver::new));
141145
}
142-
143146
}

spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/ses/SesAutoConfiguration.java

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
*/
1616
package io.awspring.cloud.autoconfigure.ses;
1717

18+
import static io.awspring.cloud.autoconfigure.core.AwsClientBuilderConfigurer.createSpecificMetricPublisher;
19+
1820
import io.awspring.cloud.autoconfigure.core.AwsClientBuilderConfigurer;
1921
import io.awspring.cloud.autoconfigure.core.AwsClientCustomizer;
2022
import io.awspring.cloud.autoconfigure.core.CredentialsProviderAutoConfiguration;
@@ -54,12 +56,16 @@ public class SesAutoConfiguration {
5456

5557
@Bean
5658
@ConditionalOnMissingBean
57-
public SesClientBuilder sesClientBuilder(SesProperties properties, AwsClientBuilderConfigurer awsClientBuilderConfigurer,
58-
ObjectProvider<AwsClientCustomizer<SesClientBuilder>> configurer,
59-
ObjectProvider<MetricPublisher> metricPublisher) {
59+
public SesClientBuilder sesClientBuilder(SesProperties properties,
60+
AwsClientBuilderConfigurer awsClientBuilderConfigurer,
61+
ObjectProvider<AwsClientCustomizer<SesClientBuilder>> configurer,
62+
ObjectProvider<MetricPublisher> metricPublisherObjectProvider) {
63+
MetricPublisher metricPublisher = createSpecificMetricPublisher(metricPublisherObjectProvider.getIfAvailable(),
64+
properties);
6065
return awsClientBuilderConfigurer.configure(SesClient.builder(), properties, configurer.getIfAvailable(),
61-
metricPublisher.getIfAvailable());
66+
metricPublisher);
6267
}
68+
6369
@Bean
6470
@ConditionalOnMissingBean
6571
public SesClient sesClient(SesClientBuilder sesClientBuilder) {

spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/sns/SnsAutoConfiguration.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616
package io.awspring.cloud.autoconfigure.sns;
1717

18+
import static io.awspring.cloud.autoconfigure.core.AwsClientBuilderConfigurer.createSpecificMetricPublisher;
1819
import static io.awspring.cloud.sns.configuration.NotificationHandlerMethodArgumentResolverConfigurationUtils.getNotificationHandlerMethodArgumentResolver;
1920

2021
import com.fasterxml.jackson.databind.ObjectMapper;
@@ -59,14 +60,16 @@
5960
@ConditionalOnProperty(name = "spring.cloud.aws.sns.enabled", havingValue = "true", matchIfMissing = true)
6061
public class SnsAutoConfiguration {
6162

62-
6363
@ConditionalOnMissingBean
6464
@Bean
65-
public SnsClientBuilder snsClientBuilder(SnsProperties properties, AwsClientBuilderConfigurer awsClientBuilderConfigurer,
66-
ObjectProvider<AwsClientCustomizer<SnsClientBuilder>> configurer,
67-
ObjectProvider<MetricPublisher> metricPublisher) {
65+
public SnsClientBuilder snsClientBuilder(SnsProperties properties,
66+
AwsClientBuilderConfigurer awsClientBuilderConfigurer,
67+
ObjectProvider<AwsClientCustomizer<SnsClientBuilder>> configurer,
68+
ObjectProvider<MetricPublisher> metricPublisherObjectProvider) {
69+
MetricPublisher metricPublisher = createSpecificMetricPublisher(metricPublisherObjectProvider.getIfAvailable(),
70+
properties);
6871
return awsClientBuilderConfigurer.configure(SnsClient.builder(), properties, configurer.getIfAvailable(),
69-
metricPublisher.getIfAvailable());
72+
metricPublisher);
7073
}
7174

7275
@ConditionalOnMissingBean
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
/*
2+
* Copyright 2013-2022 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package io.awspring.cloud.autoconfigure.core;
17+
18+
import static org.assertj.core.api.Assertions.assertThat;
19+
20+
import org.junit.jupiter.api.Test;
21+
import org.springframework.boot.autoconfigure.AutoConfigurations;
22+
import org.springframework.boot.test.context.FilteredClassLoader;
23+
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
24+
import software.amazon.awssdk.metrics.MetricPublisher;
25+
import software.amazon.awssdk.metrics.publishers.cloudwatch.CloudWatchMetricPublisher;
26+
27+
class AwsAutoConfigurationTests {
28+
29+
private static ApplicationContextRunner contextRunner = new ApplicationContextRunner()
30+
.withConfiguration(
31+
AutoConfigurations.of(CredentialsProviderAutoConfiguration.class, AwsAutoConfiguration.class))
32+
.withBean(CustomRegionProvider.class);
33+
34+
@Test
35+
void createsMetricsPublisherByDefaultWhenDependencyInClasspath() {
36+
contextRunner.run((context) -> assertThat(context).hasSingleBean(MetricPublisher.class));
37+
}
38+
39+
@Test
40+
void createsMetricsPublisherWhenSpecifiedExplicitlyAndDependencyInClasspath() {
41+
contextRunner.withPropertyValues("spring.cloud.aws.metrics.enabled:true")
42+
.run((context) -> assertThat(context).hasSingleBean(MetricPublisher.class));
43+
}
44+
45+
@Test
46+
void doesNotCreateMetricsPublisherWhenDisabledExplicitlyAndDependencyInClasspath() {
47+
contextRunner.withPropertyValues("spring.cloud.aws.metrics.enabled:false")
48+
.run((context) -> assertThat(context).doesNotHaveBean(MetricPublisher.class));
49+
}
50+
51+
@Test
52+
void doesNotCreateMetricsPublisherWhenDependencyNotInClasspath() {
53+
contextRunner.withClassLoader(new FilteredClassLoader(CloudWatchMetricPublisher.class))
54+
.run((context) -> assertThat(context).doesNotHaveBean(MetricPublisher.class));
55+
}
56+
57+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
/*
2+
* Copyright 2013-2022 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package io.awspring.cloud.autoconfigure.core;
17+
18+
import software.amazon.awssdk.regions.Region;
19+
import software.amazon.awssdk.regions.providers.AwsRegionProvider;
20+
21+
class CustomRegionProvider implements AwsRegionProvider {
22+
23+
@Override
24+
public Region getRegion() {
25+
return null;
26+
}
27+
28+
}

spring-cloud-aws-autoconfigure/src/test/java/io/awspring/cloud/autoconfigure/core/RegionProviderAutoConfigurationTests.java

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -143,13 +143,4 @@ public AwsRegionProvider customRegionProvider() {
143143

144144
}
145145

146-
static class CustomRegionProvider implements AwsRegionProvider {
147-
148-
@Override
149-
public Region getRegion() {
150-
return null;
151-
}
152-
153-
}
154-
155146
}

0 commit comments

Comments
 (0)