Skip to content

Commit 5b77aab

Browse files
committed
PoC
1 parent c92371c commit 5b77aab

File tree

11 files changed

+153
-34
lines changed

11 files changed

+153
-34
lines changed

spring-cloud-aws-autoconfigure/pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,11 @@
6464
<artifactId>s3-transfer-manager</artifactId>
6565
<optional>true</optional>
6666
</dependency>
67+
<dependency>
68+
<groupId>software.amazon.awssdk</groupId>
69+
<artifactId>cloudwatch-metric-publisher</artifactId>
70+
<optional>true</optional>
71+
</dependency>
6772
<dependency>
6873
<groupId>io.awspring.cloud</groupId>
6974
<artifactId>spring-cloud-aws-s3-cross-region-client</artifactId>

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,12 @@ public abstract class AwsClientProperties {
3737
@Nullable
3838
private String region;
3939

40+
/**
41+
* Overrides the global enablement of the CloudWatch MetricsPublisher.
42+
*/
43+
@Nullable
44+
private Boolean metricsEnabled;
45+
4046
@Nullable
4147
public URI getEndpoint() {
4248
return endpoint;
@@ -55,4 +61,12 @@ public void setRegion(String region) {
5561
this.region = region;
5662
}
5763

64+
@Nullable
65+
public Boolean getMetricsEnabled() {
66+
return metricsEnabled;
67+
}
68+
69+
public void setMetricsEnabled(@Nullable Boolean metricsEnabled) {
70+
this.metricsEnabled = metricsEnabled;
71+
}
5872
}

spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/config/AbstractAwsConfigDataLocationResolver.java

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,6 @@
2222
import io.awspring.cloud.autoconfigure.core.RegionProperties;
2323
import io.awspring.cloud.autoconfigure.core.RegionProviderAutoConfiguration;
2424
import io.awspring.cloud.core.SpringCloudClientConfiguration;
25-
import java.util.Arrays;
26-
import java.util.Collections;
27-
import java.util.List;
2825
import org.springframework.boot.BootstrapContext;
2926
import org.springframework.boot.BootstrapRegistry;
3027
import org.springframework.boot.ConfigurableBootstrapContext;
@@ -40,9 +37,17 @@
4037
import org.springframework.util.StringUtils;
4138
import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider;
4239
import software.amazon.awssdk.awscore.client.builder.AwsClientBuilder;
40+
import software.amazon.awssdk.core.client.config.ClientOverrideConfiguration;
41+
import software.amazon.awssdk.metrics.MetricPublisher;
42+
import software.amazon.awssdk.metrics.publishers.cloudwatch.CloudWatchMetricPublisher;
4343
import software.amazon.awssdk.regions.Region;
4444
import software.amazon.awssdk.regions.providers.AwsRegionProvider;
4545

46+
import java.util.Arrays;
47+
import java.util.Collections;
48+
import java.util.List;
49+
import java.util.Optional;
50+
4651
/**
4752
* Base class for AWS specific {@link ConfigDataLocationResolver}s.
4853
*
@@ -151,7 +156,23 @@ else if (awsProperties.getEndpoint() != null) {
151156
builder.endpointOverride(awsProperties.getEndpoint());
152157
}
153158
builder.credentialsProvider(credentialsProvider);
154-
builder.overrideConfiguration(new SpringCloudClientConfiguration().clientOverrideConfiguration());
159+
160+
Optional<MetricPublisher> metricPublisher;
161+
try {
162+
Class.forName("software.amazon.awssdk.metrics.publishers.cloudwatch.CloudWatchMetricPublisher");
163+
metricPublisher = Optional.of(context.get(CloudWatchMetricPublisher.class));
164+
}
165+
catch (IllegalStateException | ClassNotFoundException e) {
166+
metricPublisher = Optional.empty();
167+
}
168+
ClientOverrideConfiguration.Builder clientOverrideConfigurationBuilder = new SpringCloudClientConfiguration()
169+
.clientOverrideConfigurationBuilder();
170+
if ((awsProperties.getMetricsEnabled() == null || awsProperties.getMetricsEnabled())
171+
&& (properties.getMetricsEnabled() == null || properties.getMetricsEnabled())
172+
&& metricPublisher.isPresent()) {
173+
clientOverrideConfigurationBuilder.addMetricPublisher(metricPublisher.get());
174+
}
175+
builder.overrideConfiguration(clientOverrideConfigurationBuilder.build());
155176
return builder;
156177
}
157178

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

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,20 @@
1515
*/
1616
package io.awspring.cloud.autoconfigure.core;
1717

18+
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
19+
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
20+
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
1821
import org.springframework.boot.context.properties.EnableConfigurationProperties;
1922
import org.springframework.context.annotation.Bean;
2023
import org.springframework.context.annotation.Configuration;
2124
import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider;
25+
import software.amazon.awssdk.metrics.LoggingMetricPublisher;
26+
import software.amazon.awssdk.metrics.MetricPublisher;
27+
import software.amazon.awssdk.metrics.publishers.cloudwatch.CloudWatchMetricPublisher;
2228
import software.amazon.awssdk.regions.providers.AwsRegionProvider;
2329

30+
import java.time.Duration;
31+
2432
/**
2533
* Autoconfigures AWS environment.
2634
*
@@ -37,6 +45,16 @@ public AwsAutoConfiguration(AwsProperties awsProperties) {
3745
this.awsProperties = awsProperties;
3846
}
3947

48+
@ConditionalOnClass(CloudWatchMetricPublisher.class)
49+
static class MetricsAutoConfiguration {
50+
@Bean
51+
@ConditionalOnMissingBean
52+
@ConditionalOnProperty(name = "spring.cloud.aws.metrics-enabled", havingValue = "true", matchIfMissing = true)
53+
MetricPublisher cloudWatchMetricPublisher() {
54+
return CloudWatchMetricPublisher.builder().build();
55+
}
56+
}
57+
4058
@Bean
4159
public AwsClientBuilderConfigurer awsClientBuilderConfigurer(AwsCredentialsProvider credentialsProvider,
4260
AwsRegionProvider awsRegionProvider) {

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

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,16 @@
1717

1818
import io.awspring.cloud.autoconfigure.AwsClientProperties;
1919
import io.awspring.cloud.core.SpringCloudClientConfiguration;
20-
import java.util.Optional;
2120
import org.springframework.util.StringUtils;
2221
import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider;
2322
import software.amazon.awssdk.awscore.client.builder.AwsClientBuilder;
2423
import software.amazon.awssdk.core.client.config.ClientOverrideConfiguration;
24+
import software.amazon.awssdk.metrics.MetricPublisher;
2525
import software.amazon.awssdk.regions.Region;
2626
import software.amazon.awssdk.regions.providers.AwsRegionProvider;
2727

28+
import java.util.Optional;
29+
2830
/**
2931
* Provides a convenience method to apply common configuration to any {@link AwsClientBuilder}.
3032
*
@@ -35,19 +37,22 @@ public class AwsClientBuilderConfigurer {
3537
private final AwsCredentialsProvider credentialsProvider;
3638
private final AwsRegionProvider regionProvider;
3739
private final AwsProperties awsProperties;
38-
private final ClientOverrideConfiguration clientOverrideConfiguration;
40+
private final ClientOverrideConfiguration.Builder clientOverrideConfigurationBuilder;
3941

4042
AwsClientBuilderConfigurer(AwsCredentialsProvider credentialsProvider, AwsRegionProvider regionProvider,
4143
AwsProperties awsProperties) {
4244
this.credentialsProvider = credentialsProvider;
4345
this.regionProvider = regionProvider;
4446
this.awsProperties = awsProperties;
45-
this.clientOverrideConfiguration = new SpringCloudClientConfiguration().clientOverrideConfiguration();
47+
this.clientOverrideConfigurationBuilder = new SpringCloudClientConfiguration()
48+
.clientOverrideConfigurationBuilder();
4649
}
4750

48-
public AwsClientBuilder<?, ?> configure(AwsClientBuilder<?, ?> builder, AwsClientProperties clientProperties) {
51+
public AwsClientBuilder<?, ?> configure(AwsClientBuilder<?, ?> builder, AwsClientProperties clientProperties,
52+
Optional<MetricPublisher> metricPublisher) {
53+
metricPublisher.ifPresent(clientOverrideConfigurationBuilder::addMetricPublisher);
4954
builder.credentialsProvider(credentialsProvider).region(resolveRegion(clientProperties))
50-
.overrideConfiguration(clientOverrideConfiguration);
55+
.overrideConfiguration(clientOverrideConfigurationBuilder.build());
5156
Optional.ofNullable(awsProperties.getEndpoint()).ifPresent(builder::endpointOverride);
5257
Optional.ofNullable(clientProperties.getEndpoint()).ifPresent(builder::endpointOverride);
5358
return builder;

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

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

18-
import static io.awspring.cloud.autoconfigure.core.AwsProperties.CONFIG_PREFIX;
19-
20-
import java.net.URI;
2118
import org.springframework.boot.context.properties.ConfigurationProperties;
2219
import org.springframework.lang.Nullable;
2320

21+
import java.net.URI;
22+
23+
import static io.awspring.cloud.autoconfigure.core.AwsProperties.CONFIG_PREFIX;
24+
2425
/**
2526
* Configuration properties for AWS environment.
2627
*
@@ -40,6 +41,9 @@ public class AwsProperties {
4041
@Nullable
4142
private URI endpoint;
4243

44+
@Nullable
45+
private Boolean metricsEnabled;
46+
4347
@Nullable
4448
public URI getEndpoint() {
4549
return endpoint;
@@ -48,4 +52,13 @@ public URI getEndpoint() {
4852
public void setEndpoint(@Nullable URI endpoint) {
4953
this.endpoint = endpoint;
5054
}
55+
56+
@Nullable
57+
public Boolean getMetricsEnabled() {
58+
return metricsEnabled;
59+
}
60+
61+
public void setMetricsEnabled(@Nullable Boolean metricsEnabled) {
62+
this.metricsEnabled = metricsEnabled;
63+
}
5164
}

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

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929
import io.awspring.cloud.s3.S3ProtocolResolver;
3030
import io.awspring.cloud.s3.S3Template;
3131
import io.awspring.cloud.s3.crossregion.CrossRegionS3Client;
32-
import java.util.Optional;
3332
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
3433
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
3534
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
@@ -41,10 +40,13 @@
4140
import org.springframework.context.annotation.Bean;
4241
import org.springframework.context.annotation.Configuration;
4342
import org.springframework.context.annotation.Import;
43+
import software.amazon.awssdk.metrics.MetricPublisher;
4444
import software.amazon.awssdk.services.s3.S3Client;
4545
import software.amazon.awssdk.services.s3.S3ClientBuilder;
4646
import software.amazon.awssdk.services.s3.S3Configuration;
4747

48+
import java.util.Optional;
49+
4850
/**
4951
* {@link EnableAutoConfiguration} for {@link S3Client} and {@link S3ProtocolResolver}.
5052
*
@@ -58,16 +60,26 @@
5860
public class S3AutoConfiguration {
5961

6062
private final S3Properties properties;
63+
private final AwsProperties awsProperties;
6164

62-
public S3AutoConfiguration(S3Properties properties) {
65+
public S3AutoConfiguration(AwsProperties awsProperties, S3Properties properties) {
6366
this.properties = properties;
67+
this.awsProperties = awsProperties;
6468
}
6569

6670
@Bean
6771
@ConditionalOnMissingBean
68-
S3ClientBuilder s3ClientBuilder(AwsClientBuilderConfigurer awsClientBuilderConfigurer) {
69-
S3ClientBuilder builder = (S3ClientBuilder) awsClientBuilderConfigurer.configure(S3Client.builder(),
70-
this.properties);
72+
S3ClientBuilder s3ClientBuilder(AwsClientBuilderConfigurer awsClientBuilderConfigurer,
73+
Optional<MetricPublisher> metricPublisher) {
74+
S3ClientBuilder builder;
75+
if (awsProperties.getMetricsEnabled() == null || awsProperties.getMetricsEnabled()) {
76+
builder = (S3ClientBuilder) awsClientBuilderConfigurer.configure(S3Client.builder(), this.properties,
77+
metricPublisher);
78+
}
79+
else {
80+
builder = (S3ClientBuilder) awsClientBuilderConfigurer.configure(S3Client.builder(), this.properties,
81+
Optional.empty());
82+
}
7183
builder.serviceConfiguration(s3ServiceConfiguration());
7284
return builder;
7385
}

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

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,11 @@
1616
package io.awspring.cloud.autoconfigure.ses;
1717

1818
import io.awspring.cloud.autoconfigure.core.AwsClientBuilderConfigurer;
19+
import io.awspring.cloud.autoconfigure.core.AwsProperties;
1920
import io.awspring.cloud.autoconfigure.core.CredentialsProviderAutoConfiguration;
2021
import io.awspring.cloud.autoconfigure.core.RegionProviderAutoConfiguration;
2122
import io.awspring.cloud.ses.SimpleEmailServiceJavaMailSender;
2223
import io.awspring.cloud.ses.SimpleEmailServiceMailSender;
23-
import javax.mail.Session;
2424
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
2525
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
2626
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
@@ -32,8 +32,12 @@
3232
import org.springframework.context.annotation.Configuration;
3333
import org.springframework.mail.MailSender;
3434
import org.springframework.mail.javamail.JavaMailSender;
35+
import software.amazon.awssdk.metrics.MetricPublisher;
3536
import software.amazon.awssdk.services.ses.SesClient;
3637

38+
import javax.mail.Session;
39+
import java.util.Optional;
40+
3741
/**
3842
* {@link EnableAutoConfiguration} for {@link SimpleEmailServiceMailSender} and
3943
* {@link SimpleEmailServiceJavaMailSender}.
@@ -43,16 +47,29 @@
4347
* @author Arun Patra
4448
*/
4549
@Configuration(proxyBeanMethods = false)
46-
@EnableConfigurationProperties(SesProperties.class)
50+
@EnableConfigurationProperties({ SesProperties.class, AwsProperties.class })
4751
@ConditionalOnClass({ SesClient.class, MailSender.class, SimpleEmailServiceJavaMailSender.class })
4852
@AutoConfigureAfter({ CredentialsProviderAutoConfiguration.class, RegionProviderAutoConfiguration.class })
4953
@ConditionalOnProperty(name = "spring.cloud.aws.ses.enabled", havingValue = "true", matchIfMissing = true)
5054
public class SesAutoConfiguration {
55+
private final AwsProperties awsProperties;
56+
57+
public SesAutoConfiguration(AwsProperties awsProperties) {
58+
this.awsProperties = awsProperties;
59+
}
5160

5261
@Bean
5362
@ConditionalOnMissingBean
54-
public SesClient sesClient(SesProperties properties, AwsClientBuilderConfigurer awsClientBuilderConfigurer) {
55-
return (SesClient) awsClientBuilderConfigurer.configure(SesClient.builder(), properties).build();
63+
public SesClient sesClient(SesProperties properties, AwsClientBuilderConfigurer awsClientBuilderConfigurer,
64+
Optional<MetricPublisher> metricPublisher) {
65+
if (awsProperties.getMetricsEnabled() == null || awsProperties.getMetricsEnabled()) {
66+
return (SesClient) awsClientBuilderConfigurer
67+
.configure(SesClient.builder(), properties, metricPublisher).build();
68+
}
69+
else {
70+
return (SesClient) awsClientBuilderConfigurer.configure(SesClient.builder(), properties, Optional.empty())
71+
.build();
72+
}
5673
}
5774

5875
@Bean

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

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
import com.fasterxml.jackson.databind.ObjectMapper;
2121
import io.awspring.cloud.autoconfigure.core.AwsClientBuilderConfigurer;
22+
import io.awspring.cloud.autoconfigure.core.AwsProperties;
2223
import io.awspring.cloud.autoconfigure.core.CredentialsProviderAutoConfiguration;
2324
import io.awspring.cloud.autoconfigure.core.RegionProviderAutoConfiguration;
2425
import io.awspring.cloud.sns.core.SnsTemplate;
@@ -36,6 +37,8 @@
3637
import org.springframework.messaging.converter.MappingJackson2MessageConverter;
3738
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
3839
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
40+
import software.amazon.awssdk.metrics.MetricPublisher;
41+
import software.amazon.awssdk.metrics.publishers.cloudwatch.CloudWatchMetricPublisher;
3942
import software.amazon.awssdk.services.sns.SnsClient;
4043

4144
/**
@@ -50,21 +53,31 @@
5053
*/
5154
@Configuration(proxyBeanMethods = false)
5255
@ConditionalOnClass({ SnsClient.class, SnsTemplate.class })
53-
@EnableConfigurationProperties({ SnsProperties.class })
56+
@EnableConfigurationProperties({ SnsProperties.class, AwsProperties.class })
5457
@AutoConfigureAfter({ CredentialsProviderAutoConfiguration.class, RegionProviderAutoConfiguration.class })
5558
@ConditionalOnProperty(name = "spring.cloud.aws.sns.enabled", havingValue = "true", matchIfMissing = true)
5659
public class SnsAutoConfiguration {
5760

5861
private final SnsProperties properties;
62+
private final AwsProperties awsProperties;
5963

60-
public SnsAutoConfiguration(SnsProperties properties) {
64+
public SnsAutoConfiguration(SnsProperties properties, AwsProperties awsProperties) {
6165
this.properties = properties;
66+
this.awsProperties = awsProperties;
6267
}
6368

6469
@ConditionalOnMissingBean
6570
@Bean
66-
public SnsClient snsClient(AwsClientBuilderConfigurer awsClientBuilderConfigurer) {
67-
return (SnsClient) awsClientBuilderConfigurer.configure(SnsClient.builder(), this.properties).build();
71+
public SnsClient snsClient(AwsClientBuilderConfigurer awsClientBuilderConfigurer,
72+
Optional<MetricPublisher> metricPublisher) {
73+
if (awsProperties.getMetricsEnabled() == null || awsProperties.getMetricsEnabled()) {
74+
return (SnsClient) awsClientBuilderConfigurer
75+
.configure(SnsClient.builder(), this.properties, metricPublisher).build();
76+
}
77+
else {
78+
return (SnsClient) awsClientBuilderConfigurer
79+
.configure(SnsClient.builder(), this.properties, Optional.empty()).build();
80+
}
6881
}
6982

7083
@ConditionalOnMissingBean

0 commit comments

Comments
 (0)