Skip to content

Commit b732488

Browse files
krimszantonpperez
authored andcommitted
Rebase with upstream main
1 parent 225ec81 commit b732488

File tree

7 files changed

+96
-17
lines changed

7 files changed

+96
-17
lines changed

spring-cloud-aws-autoconfigure/pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,11 @@
7575
<artifactId>s3-transfer-manager</artifactId>
7676
<optional>true</optional>
7777
</dependency>
78+
<dependency>
79+
<groupId>software.amazon.awssdk</groupId>
80+
<artifactId>cloudwatch-metric-publisher</artifactId>
81+
<optional>true</optional>
82+
</dependency>
7883
<dependency>
7984
<groupId>io.awspring.cloud</groupId>
8085
<artifactId>spring-cloud-aws-s3-cross-region-client</artifactId>

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

Lines changed: 15 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 this.endpoint;
@@ -54,4 +60,13 @@ public String getRegion() {
5460
public void setRegion(String region) {
5561
this.region = region;
5662
}
63+
64+
@Nullable
65+
public Boolean getMetricsEnabled() {
66+
return metricsEnabled;
67+
}
68+
69+
public void setMetricsEnabled(@Nullable Boolean metricsEnabled) {
70+
this.metricsEnabled = metricsEnabled;
71+
}
5772
}

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: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,18 @@
1717

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

30+
import java.util.Optional;
31+
3032
/**
3133
* Provides a convenience method to apply common configuration to any {@link AwsClientBuilder}.
3234
*
@@ -44,20 +46,24 @@ public class AwsClientBuilderConfigurer {
4446
this.credentialsProvider = credentialsProvider;
4547
this.regionProvider = regionProvider;
4648
this.awsProperties = awsProperties;
47-
this.clientOverrideConfiguration = new SpringCloudClientConfiguration().clientOverrideConfiguration();
49+
this.clientOverrideConfiguration = new SpringCloudClientConfiguration()
50+
.clientOverrideConfiguration();
4851
}
4952

5053
public <T extends AwsClientBuilder<?, ?>> T configure(T builder) {
51-
return configure(builder, null, null);
54+
return configure(builder, null, null, null);
5255
}
5356

5457
public <T extends AwsClientBuilder<?, ?>> T configure(T builder, @Nullable AwsClientProperties clientProperties,
55-
@Nullable AwsClientCustomizer<T> customizer) {
58+
@Nullable AwsClientCustomizer<T> customizer, MetricPublisher metricPublisher) {
59+
ClientOverrideConfiguration.Builder clientOverrideConfigurationBuilder = clientOverrideConfiguration.toBuilder();
5660
Assert.notNull(builder, "builder is required");
5761
Assert.notNull(clientProperties, "clientProperties are required");
58-
62+
if(metricPublisher != null) {
63+
clientOverrideConfigurationBuilder.addMetricPublisher(metricPublisher).build();
64+
}
5965
builder.credentialsProvider(this.credentialsProvider).region(resolveRegion(clientProperties))
60-
.overrideConfiguration(this.clientOverrideConfiguration);
66+
.overrideConfiguration(clientOverrideConfigurationBuilder.build());
6167
Optional.ofNullable(this.awsProperties.getEndpoint()).ifPresent(builder::endpointOverride);
6268
Optional.ofNullable(clientProperties).map(AwsClientProperties::getEndpoint)
6369
.ifPresent(builder::endpointOverride);
@@ -68,6 +74,7 @@ public class AwsClientBuilderConfigurer {
6874
if (customizer != null) {
6975
AwsClientCustomizer.apply(customizer, builder);
7076
}
77+
7178
return builder;
7279
}
7380

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,13 +15,14 @@
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
import software.amazon.awssdk.awscore.defaultsmode.DefaultsMode;
2421

22+
import java.net.URI;
23+
24+
import static io.awspring.cloud.autoconfigure.core.AwsProperties.CONFIG_PREFIX;
25+
2526
/**
2627
* Configuration properties for AWS environment.
2728
*
@@ -60,6 +61,9 @@ public class AwsProperties {
6061
@Nullable
6162
private Boolean fipsEnabled;
6263

64+
@Nullable
65+
private Boolean metricsEnabled;
66+
6367
@Nullable
6468
public URI getEndpoint() {
6569
return this.endpoint;
@@ -95,4 +99,13 @@ public Boolean getFipsEnabled() {
9599
public void setFipsEnabled(@Nullable Boolean fipsEnabled) {
96100
this.fipsEnabled = fipsEnabled;
97101
}
102+
103+
@Nullable
104+
public Boolean getMetricsEnabled() {
105+
return metricsEnabled;
106+
}
107+
108+
public void setMetricsEnabled(@Nullable Boolean metricsEnabled) {
109+
this.metricsEnabled = metricsEnabled;
110+
}
98111
}

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,11 @@ class SpringCloudClientConfigurationTests {
3030

3131
@Test
3232
void returnsClientConfigurationWithVersion() {
33-
ClientOverrideConfiguration clientOverrideConfiguration = new SpringCloudClientConfiguration()
34-
.clientOverrideConfiguration();
33+
ClientOverrideConfiguration.Builder clientOverrideConfigurationBuilder = new SpringCloudClientConfiguration()
34+
.clientOverrideConfigurationBuilder();
3535

36-
assertThat(clientOverrideConfiguration.advancedOption(SdkAdvancedClientOption.USER_AGENT_SUFFIX)).isPresent()
37-
.hasValueSatisfying(value -> {
36+
assertThat(clientOverrideConfigurationBuilder.build().advancedOption(SdkAdvancedClientOption.USER_AGENT_SUFFIX))
37+
.isPresent().hasValueSatisfying(value -> {
3838
assertThat(value).startsWith("spring-cloud-aws");
3939
});
4040
}

0 commit comments

Comments
 (0)