Skip to content

Commit ad5b4a0

Browse files
committed
Rework the existing metricsEnabled into a more complex object with extra properties
1 parent 88af5ac commit ad5b4a0

File tree

13 files changed

+721
-868
lines changed

13 files changed

+721
-868
lines changed

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

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

18+
import io.awspring.cloud.autoconfigure.core.CloudWatchMetricsPublisherProperties;
1819
import java.net.URI;
1920
import org.springframework.lang.Nullable;
2021

@@ -41,7 +42,7 @@ public abstract class AwsClientProperties {
4142
* Overrides the global enablement of the CloudWatch MetricsPublisher.
4243
*/
4344
@Nullable
44-
private Boolean metricsEnabled;
45+
private CloudWatchMetricsPublisherProperties metrics;
4546

4647
@Nullable
4748
public URI getEndpoint() {
@@ -62,11 +63,11 @@ public void setRegion(String region) {
6263
}
6364

6465
@Nullable
65-
public Boolean getMetricsEnabled() {
66-
return metricsEnabled;
66+
public CloudWatchMetricsPublisherProperties getMetrics() {
67+
return metrics;
6768
}
6869

69-
public void setMetricsEnabled(@Nullable Boolean metricsEnabled) {
70-
this.metricsEnabled = metricsEnabled;
70+
public void setMetrics(@Nullable CloudWatchMetricsPublisherProperties metrics) {
71+
this.metrics = metrics;
7172
}
7273
}

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

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

1818
import io.awspring.cloud.autoconfigure.AwsClientProperties;
19-
import io.awspring.cloud.autoconfigure.config.parameterstore.ParameterStorePropertySources;
2019
import io.awspring.cloud.autoconfigure.core.AwsProperties;
2120
import io.awspring.cloud.autoconfigure.core.CredentialsProperties;
2221
import io.awspring.cloud.autoconfigure.core.CredentialsProviderAutoConfiguration;
2322
import io.awspring.cloud.autoconfigure.core.RegionProperties;
2423
import io.awspring.cloud.autoconfigure.core.RegionProviderAutoConfiguration;
2524
import io.awspring.cloud.core.SpringCloudClientConfiguration;
26-
import org.apache.commons.logging.Log;
27-
import org.apache.commons.logging.LogFactory;
25+
import io.micrometer.core.lang.Nullable;
26+
import java.util.Arrays;
27+
import java.util.Collections;
28+
import java.util.List;
2829
import org.springframework.boot.BootstrapContext;
2930
import org.springframework.boot.BootstrapRegistry;
3031
import org.springframework.boot.ConfigurableBootstrapContext;
@@ -42,15 +43,9 @@
4243
import software.amazon.awssdk.awscore.client.builder.AwsClientBuilder;
4344
import software.amazon.awssdk.core.client.config.ClientOverrideConfiguration;
4445
import software.amazon.awssdk.metrics.MetricPublisher;
45-
import software.amazon.awssdk.metrics.publishers.cloudwatch.CloudWatchMetricPublisher;
4646
import software.amazon.awssdk.regions.Region;
4747
import software.amazon.awssdk.regions.providers.AwsRegionProvider;
4848

49-
import java.util.Arrays;
50-
import java.util.Collections;
51-
import java.util.List;
52-
import java.util.Optional;
53-
5449
/**
5550
* Base class for AWS specific {@link ConfigDataLocationResolver}s.
5651
*
@@ -160,23 +155,27 @@ else if (awsProperties.getEndpoint() != null) {
160155
}
161156
builder.credentialsProvider(credentialsProvider);
162157

163-
Optional<MetricPublisher> metricPublisher;
158+
MetricPublisher metricPublisher = getMetricPublisher(context);
159+
160+
if ((awsProperties.getMetrics() == null || awsProperties.getMetrics().getEnabled() == null
161+
|| (awsProperties.getMetrics().getEnabled() != null && awsProperties.getMetrics().getEnabled()))
162+
&& metricPublisher != null) {
163+
ClientOverrideConfiguration.Builder clientOverrideConfigurationBuilder = new SpringCloudClientConfiguration()
164+
.clientOverrideConfiguration().toBuilder();
165+
clientOverrideConfigurationBuilder.addMetricPublisher(metricPublisher);
166+
builder.overrideConfiguration(clientOverrideConfigurationBuilder.build());
167+
}
168+
return builder;
169+
}
170+
171+
private static @Nullable MetricPublisher getMetricPublisher(BootstrapContext context) {
164172
try {
165173
Class.forName("software.amazon.awssdk.metrics.publishers.cloudwatch.CloudWatchMetricPublisher");
166-
metricPublisher = Optional.of(context.get(MetricPublisher.class));
174+
return context.get(MetricPublisher.class);
167175
}
168176
catch (IllegalStateException | ClassNotFoundException e) {
169-
metricPublisher = Optional.empty();
177+
return null;
170178
}
171-
ClientOverrideConfiguration.Builder clientOverrideConfigurationBuilder = new SpringCloudClientConfiguration()
172-
.clientOverrideConfigurationBuilder();
173-
if ((awsProperties.getMetricsEnabled() == null || awsProperties.getMetricsEnabled())
174-
&& (properties.getMetricsEnabled() == null || properties.getMetricsEnabled())
175-
&& metricPublisher.isPresent()) {
176-
clientOverrideConfigurationBuilder.addMetricPublisher(metricPublisher.get());
177-
}
178-
builder.overrideConfiguration(clientOverrideConfigurationBuilder.build());
179-
return builder;
180179
}
181180

182181
protected void createMetricPublisher(ConfigDataLocationResolverContext resolverContext) {
@@ -187,7 +186,7 @@ protected void createMetricPublisher(ConfigDataLocationResolverContext resolverC
187186
// ignored, means that the optional dependency is not in the classpath
188187
return;
189188
}
190-
registerBean(resolverContext, MetricPublisher.class, CloudWatchMetricPublisher.builder().build());
189+
191190
}
192191

193192
}

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

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,10 @@
2222
import org.springframework.context.annotation.Bean;
2323
import org.springframework.context.annotation.Configuration;
2424
import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider;
25-
import software.amazon.awssdk.metrics.LoggingMetricPublisher;
2625
import software.amazon.awssdk.metrics.MetricPublisher;
2726
import software.amazon.awssdk.metrics.publishers.cloudwatch.CloudWatchMetricPublisher;
2827
import software.amazon.awssdk.regions.providers.AwsRegionProvider;
2928

30-
import java.time.Duration;
31-
3229
/**
3330
* Autoconfigures AWS environment.
3431
*

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

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

1818
import io.awspring.cloud.autoconfigure.AwsClientProperties;
1919
import io.awspring.cloud.core.SpringCloudClientConfiguration;
20+
import java.util.Optional;
2021
import org.springframework.lang.Nullable;
2122
import org.springframework.util.Assert;
2223
import org.springframework.util.StringUtils;
@@ -27,8 +28,6 @@
2728
import software.amazon.awssdk.regions.Region;
2829
import software.amazon.awssdk.regions.providers.AwsRegionProvider;
2930

30-
import java.util.Optional;
31-
3231
/**
3332
* Provides a convenience method to apply common configuration to any {@link AwsClientBuilder}.
3433
*
@@ -46,8 +45,7 @@ public class AwsClientBuilderConfigurer {
4645
this.credentialsProvider = credentialsProvider;
4746
this.regionProvider = regionProvider;
4847
this.awsProperties = awsProperties;
49-
this.clientOverrideConfiguration = new SpringCloudClientConfiguration()
50-
.clientOverrideConfiguration();
48+
this.clientOverrideConfiguration = new SpringCloudClientConfiguration().clientOverrideConfiguration();
5149
}
5250

5351
public <T extends AwsClientBuilder<?, ?>> T configure(T builder) {
@@ -56,14 +54,15 @@ public class AwsClientBuilderConfigurer {
5654

5755
public <T extends AwsClientBuilder<?, ?>> T configure(T builder, @Nullable AwsClientProperties clientProperties,
5856
@Nullable AwsClientCustomizer<T> customizer, MetricPublisher metricPublisher) {
59-
ClientOverrideConfiguration.Builder clientOverrideConfigurationBuilder = clientOverrideConfiguration.toBuilder();
57+
ClientOverrideConfiguration.Builder clientOverrideConfigurationBuilder = clientOverrideConfiguration
58+
.toBuilder();
6059
Assert.notNull(builder, "builder is required");
6160
Assert.notNull(clientProperties, "clientProperties are required");
62-
if(metricPublisher != null) {
61+
if (metricPublisher != null) {
6362
clientOverrideConfigurationBuilder.addMetricPublisher(metricPublisher).build();
6463
}
6564
builder.credentialsProvider(this.credentialsProvider).region(resolveRegion(clientProperties))
66-
.overrideConfiguration(clientOverrideConfigurationBuilder.build());
65+
.overrideConfiguration(clientOverrideConfigurationBuilder.build());
6766
Optional.ofNullable(this.awsProperties.getEndpoint()).ifPresent(builder::endpointOverride);
6867
Optional.ofNullable(clientProperties).map(AwsClientProperties::getEndpoint)
6968
.ifPresent(builder::endpointOverride);

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

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +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;
1821
import org.springframework.boot.context.properties.ConfigurationProperties;
22+
import org.springframework.boot.context.properties.NestedConfigurationProperty;
1923
import org.springframework.lang.Nullable;
2024
import software.amazon.awssdk.awscore.defaultsmode.DefaultsMode;
2125

22-
import java.net.URI;
23-
24-
import static io.awspring.cloud.autoconfigure.core.AwsProperties.CONFIG_PREFIX;
25-
2626
/**
2727
* Configuration properties for AWS environment.
2828
*
@@ -56,13 +56,17 @@ public class AwsProperties {
5656
private Boolean dualstackEnabled;
5757

5858
/**
59-
* Configure whether the SDK should use the AWS fips endpoints.
59+
* Configure metrics properties to send to CloudWatch if needed
6060
*/
61+
@NestedConfigurationProperty
6162
@Nullable
62-
private Boolean fipsEnabled;
63+
private CloudWatchMetricsPublisherProperties metrics;
6364

65+
/**
66+
* Configure whether the SDK should use the AWS fips endpoints.
67+
*/
6468
@Nullable
65-
private Boolean metricsEnabled;
69+
private Boolean fipsEnabled;
6670

6771
@Nullable
6872
public URI getEndpoint() {
@@ -101,11 +105,11 @@ public void setFipsEnabled(@Nullable Boolean fipsEnabled) {
101105
}
102106

103107
@Nullable
104-
public Boolean getMetricsEnabled() {
105-
return metricsEnabled;
108+
public CloudWatchMetricsPublisherProperties getMetrics() {
109+
return metrics;
106110
}
107111

108-
public void setMetricsEnabled(@Nullable Boolean metricsEnabled) {
109-
this.metricsEnabled = metricsEnabled;
112+
public void setMetrics(@Nullable CloudWatchMetricsPublisherProperties metrics) {
113+
this.metrics = metrics;
110114
}
111115
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
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 org.springframework.lang.Nullable;
19+
20+
public class CloudWatchMetricsPublisherProperties {
21+
@Nullable
22+
Boolean enabled;
23+
@Nullable
24+
String namespace;
25+
@Nullable
26+
Long uploadFrequencyInSeconds;
27+
28+
@Nullable
29+
public Boolean getEnabled() {
30+
return enabled;
31+
}
32+
33+
public void setEnabled(@Nullable Boolean enabled) {
34+
this.enabled = enabled;
35+
}
36+
37+
@Nullable
38+
public String getNamespace() {
39+
return namespace;
40+
}
41+
42+
public void setNamespace(@Nullable String namespace) {
43+
this.namespace = namespace;
44+
}
45+
46+
@Nullable
47+
public Long getUploadFrequencyInSeconds() {
48+
return uploadFrequencyInSeconds;
49+
}
50+
51+
public void setUploadFrequencyInSeconds(@Nullable Long uploadFrequencyInSeconds) {
52+
this.uploadFrequencyInSeconds = uploadFrequencyInSeconds;
53+
}
54+
}

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import org.springframework.context.annotation.Bean;
3232
import org.springframework.context.annotation.Configuration;
3333
import software.amazon.awssdk.enhanced.dynamodb.DynamoDbEnhancedClient;
34+
import software.amazon.awssdk.metrics.MetricPublisher;
3435
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
3536
import software.amazon.awssdk.services.dynamodb.DynamoDbClientBuilder;
3637

@@ -56,9 +57,10 @@ public DynamoDbAutoConfiguration(DynamoDbProperties properties) {
5657
@ConditionalOnMissingBean
5758
@Bean
5859
public DynamoDbClient dynamoDbClient(AwsClientBuilderConfigurer awsClientBuilderConfigurer,
59-
ObjectProvider<AwsClientCustomizer<DynamoDbClientBuilder>> configurer) {
60-
return awsClientBuilderConfigurer.configure(DynamoDbClient.builder(), properties, configurer.getIfAvailable())
61-
.build();
60+
ObjectProvider<AwsClientCustomizer<DynamoDbClientBuilder>> configurer,
61+
ObjectProvider<MetricPublisher> metricPublisher) {
62+
return awsClientBuilderConfigurer.configure(DynamoDbClient.builder(), properties, configurer.getIfAvailable(),
63+
metricPublisher.getIfAvailable()).build();
6264
}
6365

6466
@ConditionalOnMissingBean

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import org.springframework.boot.context.properties.EnableConfigurationProperties;
3535
import org.springframework.context.annotation.Bean;
3636
import org.springframework.context.annotation.Configuration;
37+
import software.amazon.awssdk.metrics.MetricPublisher;
3738
import software.amazon.awssdk.regions.providers.AwsRegionProvider;
3839
import software.amazon.awssdk.services.cloudwatch.CloudWatchAsyncClient;
3940
import software.amazon.awssdk.services.cloudwatch.CloudWatchAsyncClientBuilder;
@@ -67,9 +68,10 @@ public CloudWatchMeterRegistry cloudWatchMeterRegistry(CloudWatchConfig config,
6768
@ConditionalOnMissingBean
6869
public CloudWatchAsyncClient cloudWatchAsyncClient(CloudWatchProperties properties,
6970
AwsClientBuilderConfigurer awsClientBuilderConfigurer,
70-
ObjectProvider<AwsClientCustomizer<CloudWatchAsyncClientBuilder>> configurer) {
71-
return awsClientBuilderConfigurer
72-
.configure(CloudWatchAsyncClient.builder(), properties, configurer.getIfAvailable()).build();
71+
ObjectProvider<AwsClientCustomizer<CloudWatchAsyncClientBuilder>> configurer,
72+
ObjectProvider<MetricPublisher> metricPublisher) {
73+
return awsClientBuilderConfigurer.configure(CloudWatchAsyncClient.builder(), properties,
74+
configurer.getIfAvailable(), metricPublisher.getIfAvailable()).build();
7375
}
7476

7577
@Bean

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
import org.springframework.context.annotation.Bean;
4444
import org.springframework.context.annotation.Configuration;
4545
import org.springframework.context.annotation.Import;
46+
import software.amazon.awssdk.metrics.MetricPublisher;
4647
import software.amazon.awssdk.services.s3.S3Client;
4748
import software.amazon.awssdk.services.s3.S3ClientBuilder;
4849
import software.amazon.awssdk.services.s3.S3Configuration;
@@ -68,9 +69,10 @@ public S3AutoConfiguration(S3Properties properties) {
6869
@Bean
6970
@ConditionalOnMissingBean
7071
S3ClientBuilder s3ClientBuilder(AwsClientBuilderConfigurer awsClientBuilderConfigurer,
71-
ObjectProvider<AwsClientCustomizer<S3ClientBuilder>> configurer) {
72+
ObjectProvider<AwsClientCustomizer<S3ClientBuilder>> configurer,
73+
ObjectProvider<MetricPublisher> metricPublisher) {
7274
S3ClientBuilder builder = awsClientBuilderConfigurer.configure(S3Client.builder(), this.properties,
73-
configurer.getIfAvailable());
75+
configurer.getIfAvailable(), metricPublisher.getIfAvailable());
7476
builder.serviceConfiguration(s3ServiceConfiguration());
7577
return builder;
7678
}

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import org.springframework.context.annotation.Configuration;
3434
import org.springframework.mail.MailSender;
3535
import org.springframework.mail.javamail.JavaMailSender;
36+
import software.amazon.awssdk.metrics.MetricPublisher;
3637
import software.amazon.awssdk.services.ses.SesClient;
3738
import software.amazon.awssdk.services.ses.SesClientBuilder;
3839

@@ -54,9 +55,10 @@ public class SesAutoConfiguration {
5455
@Bean
5556
@ConditionalOnMissingBean
5657
public SesClient sesClient(SesProperties properties, AwsClientBuilderConfigurer awsClientBuilderConfigurer,
57-
ObjectProvider<AwsClientCustomizer<SesClientBuilder>> configurer) {
58-
return awsClientBuilderConfigurer.configure(SesClient.builder(), properties, configurer.getIfAvailable())
59-
.build();
58+
ObjectProvider<AwsClientCustomizer<SesClientBuilder>> configurer,
59+
ObjectProvider<MetricPublisher> metricPublisher) {
60+
return awsClientBuilderConfigurer.configure(SesClient.builder(), properties, configurer.getIfAvailable(),
61+
metricPublisher.getIfAvailable()).build();
6062
}
6163

6264
@Bean

0 commit comments

Comments
 (0)