Skip to content

Commit aa40fb7

Browse files
committed
Add region to MetricsPublisher
1 parent 21ebd29 commit aa40fb7

14 files changed

+137
-41
lines changed

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

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

18-
import java.time.Duration;
1918
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
2019
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
2120
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
@@ -28,6 +27,8 @@
2827
import software.amazon.awssdk.metrics.publishers.cloudwatch.CloudWatchMetricPublisher;
2928
import software.amazon.awssdk.regions.providers.AwsRegionProvider;
3029

30+
import java.time.Duration;
31+
3132
/**
3233
* Autoconfigures AWS environment.
3334
*
@@ -38,29 +39,12 @@
3839
@EnableConfigurationProperties(AwsProperties.class)
3940
public class AwsAutoConfiguration {
4041

41-
private static AwsProperties awsProperties;
42+
private final AwsProperties awsProperties;
4243

4344
public AwsAutoConfiguration(AwsProperties awsProperties) {
4445
this.awsProperties = awsProperties;
4546
}
4647

47-
@ConditionalOnClass(CloudWatchMetricPublisher.class)
48-
static class MetricsAutoConfiguration {
49-
@Bean
50-
@ConditionalOnMissingBean
51-
@ConditionalOnProperty(name = "spring.cloud.aws.metrics.enabled", havingValue = "true", matchIfMissing = true)
52-
MetricPublisher cloudWatchMetricPublisher() {
53-
CloudWatchMetricPublisher.Builder builder = CloudWatchMetricPublisher.builder();
54-
PropertyMapper propertyMapper = PropertyMapper.get();
55-
if (awsProperties.getMetrics() != null) {
56-
propertyMapper.from(awsProperties.getMetrics()::getNamespace).whenNonNull().to(builder::namespace);
57-
propertyMapper.from(awsProperties.getMetrics()::getUploadFrequencyInSeconds).whenNonNull()
58-
.to(v -> builder.uploadFrequency(Duration.ofSeconds(v)));
59-
}
60-
return builder.build();
61-
}
62-
}
63-
6448
@Bean
6549
public AwsClientBuilderConfigurer awsClientBuilderConfigurer(AwsCredentialsProvider credentialsProvider,
6650
AwsRegionProvider awsRegionProvider) {

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

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,21 +16,27 @@
1616
package io.awspring.cloud.autoconfigure.core;
1717

1818
import io.awspring.cloud.autoconfigure.AwsClientProperties;
19+
import io.awspring.cloud.autoconfigure.metrics.CloudWatchProperties;
1920
import io.awspring.cloud.core.SpringCloudClientConfiguration;
2021
import java.time.Duration;
2122
import java.util.Optional;
23+
24+
import org.springframework.beans.factory.ObjectProvider;
2225
import org.springframework.boot.context.properties.PropertyMapper;
2326
import org.springframework.lang.Nullable;
2427
import org.springframework.util.Assert;
2528
import org.springframework.util.ClassUtils;
2629
import org.springframework.util.StringUtils;
2730
import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider;
2831
import software.amazon.awssdk.awscore.client.builder.AwsClientBuilder;
32+
import software.amazon.awssdk.core.client.builder.SdkClientBuilder;
2933
import software.amazon.awssdk.core.client.config.ClientOverrideConfiguration;
3034
import software.amazon.awssdk.metrics.MetricPublisher;
3135
import software.amazon.awssdk.metrics.publishers.cloudwatch.CloudWatchMetricPublisher;
3236
import software.amazon.awssdk.regions.Region;
3337
import software.amazon.awssdk.regions.providers.AwsRegionProvider;
38+
import software.amazon.awssdk.services.cloudwatch.CloudWatchAsyncClient;
39+
import software.amazon.awssdk.services.cloudwatch.CloudWatchAsyncClientBuilder;
3440

3541
/**
3642
* Provides a convenience method to apply common configuration to any {@link AwsClientBuilder}.
@@ -88,12 +94,21 @@ public Region resolveRegion(@Nullable AwsClientProperties clientProperties) {
8894
}
8995

9096
public static @Nullable MetricPublisher createSpecificMetricPublisher(MetricPublisher metricPublisher,
91-
AwsClientProperties properties) {
97+
AwsClientProperties properties, AwsClientBuilderConfigurer awsClientBuilderConfigurer) {
98+
9299
if (ClassUtils.isPresent("software.amazon.awssdk.metrics.publishers.cloudwatch.CloudWatchMetricPublisher", null)
93100
&& properties.getMetrics() != null) {
94101
if (properties.getMetrics().getEnabled() == null || properties.getMetrics().getEnabled()) {
95-
CloudWatchMetricPublisher.Builder builder = CloudWatchMetricPublisher.builder();
96102
PropertyMapper propertyMapper = PropertyMapper.get();
103+
104+
CloudWatchAsyncClientBuilder cloudWatchAsyncClientBuilder = CloudWatchAsyncClient.builder();
105+
CloudWatchProperties cloudWatchProperties = new CloudWatchProperties();
106+
propertyMapper.from(cloudWatchProperties.getEndpoint()).whenNonNull().to(cloudWatchProperties::setEndpoint);
107+
propertyMapper.from(cloudWatchProperties.getRegion()).whenNonNull().to(cloudWatchProperties::setRegion);
108+
CloudWatchAsyncClient cloudWatchAsyncClient = awsClientBuilderConfigurer.configure(cloudWatchAsyncClientBuilder, cloudWatchProperties, null, null).build();
109+
110+
CloudWatchMetricPublisher.Builder builder = CloudWatchMetricPublisher.builder();
111+
builder.cloudWatchClient(cloudWatchAsyncClient);
97112
propertyMapper.from(properties.getMetrics()::getNamespace).whenNonNull().to(builder::namespace);
98113
propertyMapper.from(properties.getMetrics()::getUploadFrequencyInSeconds).whenNonNull()
99114
.to(v -> builder.uploadFrequency(Duration.ofSeconds(v)));
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package io.awspring.cloud.autoconfigure.core;
2+
3+
import io.awspring.cloud.autoconfigure.AwsClientProperties;
4+
import io.awspring.cloud.autoconfigure.metrics.CloudWatchProperties;
5+
import org.springframework.beans.factory.ObjectProvider;
6+
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
7+
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
8+
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
9+
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
10+
import org.springframework.boot.context.properties.EnableConfigurationProperties;
11+
import org.springframework.boot.context.properties.PropertyMapper;
12+
import org.springframework.context.annotation.Bean;
13+
import org.springframework.context.annotation.Configuration;
14+
import software.amazon.awssdk.metrics.MetricPublisher;
15+
import software.amazon.awssdk.metrics.publishers.cloudwatch.CloudWatchMetricPublisher;
16+
import software.amazon.awssdk.regions.providers.AwsRegionProvider;
17+
import software.amazon.awssdk.services.cloudwatch.CloudWatchAsyncClient;
18+
import software.amazon.awssdk.services.cloudwatch.CloudWatchAsyncClientBuilder;
19+
import software.amazon.awssdk.services.dynamodb.DynamoDbClientBuilder;
20+
21+
import java.time.Duration;
22+
import java.util.Optional;
23+
24+
@Configuration(proxyBeanMethods = false)
25+
@EnableConfigurationProperties(AwsProperties.class)
26+
@ConditionalOnClass({ CloudWatchMetricPublisher.class })
27+
@AutoConfigureAfter({ CredentialsProviderAutoConfiguration.class, RegionProviderAutoConfiguration.class})
28+
public class CloudWatchMetricsPublisherAutoConfiguration {
29+
30+
private final AwsProperties awsProperties;
31+
32+
public CloudWatchMetricsPublisherAutoConfiguration(AwsProperties awsProperties) {
33+
this.awsProperties = awsProperties;
34+
}
35+
36+
@Bean
37+
@ConditionalOnMissingBean
38+
@ConditionalOnProperty(name = "spring.cloud.aws.metrics.enabled", havingValue = "true", matchIfMissing = true)
39+
MetricPublisher cloudWatchMetricPublisher(AwsClientBuilderConfigurer awsClientBuilderConfigurer, ObjectProvider<AwsClientCustomizer<CloudWatchAsyncClientBuilder>> configurer) {
40+
PropertyMapper propertyMapper = PropertyMapper.get();
41+
42+
CloudWatchAsyncClientBuilder cloudWatchAsyncClientBuilder = CloudWatchAsyncClient.builder();
43+
CloudWatchProperties cloudWatchProperties = new CloudWatchProperties();
44+
propertyMapper.from(cloudWatchProperties.getEndpoint()).whenNonNull().to(cloudWatchProperties::setEndpoint);
45+
propertyMapper.from(cloudWatchProperties.getRegion()).whenNonNull().to(cloudWatchProperties::setRegion);
46+
CloudWatchAsyncClient cloudWatchAsyncClient = awsClientBuilderConfigurer.configure(cloudWatchAsyncClientBuilder, cloudWatchProperties, configurer.getIfAvailable(), null).build();
47+
48+
CloudWatchMetricPublisher.Builder builder = CloudWatchMetricPublisher.builder();
49+
builder.cloudWatchClient(cloudWatchAsyncClient);
50+
51+
if (awsProperties.getMetrics() != null) {
52+
propertyMapper.from(awsProperties.getMetrics()::getNamespace).whenNonNull().to(builder::namespace);
53+
propertyMapper.from(awsProperties.getMetrics()::getUploadFrequencyInSeconds).whenNonNull()
54+
.to(v -> builder.uploadFrequency(Duration.ofSeconds(v)));
55+
}
56+
return builder.build();
57+
}
58+
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ public DynamoDbClientBuilder dynamoDbClientBuilder(AwsClientBuilderConfigurer aw
6262
ObjectProvider<AwsClientCustomizer<DynamoDbClientBuilder>> configurer,
6363
ObjectProvider<MetricPublisher> metricPublisherObjectProvider) {
6464
MetricPublisher metricPublisher = createSpecificMetricPublisher(metricPublisherObjectProvider.getIfAvailable(),
65-
properties);
65+
properties, awsClientBuilderConfigurer);
6666
return awsClientBuilderConfigurer.configure(DynamoDbClient.builder(), properties, configurer.getIfAvailable(),
6767
metricPublisher);
6868
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ S3ClientBuilder s3ClientBuilder(AwsClientBuilderConfigurer awsClientBuilderConfi
7474
ObjectProvider<AwsClientCustomizer<S3ClientBuilder>> configurer,
7575
ObjectProvider<MetricPublisher> metricPublisherObjectProvider) {
7676
MetricPublisher metricPublisher = createSpecificMetricPublisher(metricPublisherObjectProvider.getIfAvailable(),
77-
properties);
77+
properties, awsClientBuilderConfigurer);
7878
S3ClientBuilder builder = awsClientBuilderConfigurer.configure(S3Client.builder(), this.properties,
7979
configurer.getIfAvailable(), metricPublisher);
8080
builder.serviceConfiguration(s3ServiceConfiguration());

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ public SesClientBuilder sesClientBuilder(SesProperties properties,
6161
ObjectProvider<AwsClientCustomizer<SesClientBuilder>> configurer,
6262
ObjectProvider<MetricPublisher> metricPublisherObjectProvider) {
6363
MetricPublisher metricPublisher = createSpecificMetricPublisher(metricPublisherObjectProvider.getIfAvailable(),
64-
properties);
64+
properties, awsClientBuilderConfigurer);
6565
return awsClientBuilderConfigurer.configure(SesClient.builder(), properties, configurer.getIfAvailable(),
6666
metricPublisher);
6767
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ public SnsClientBuilder snsClientBuilder(SnsProperties properties,
6767
ObjectProvider<AwsClientCustomizer<SnsClientBuilder>> configurer,
6868
ObjectProvider<MetricPublisher> metricPublisherObjectProvider) {
6969
MetricPublisher metricPublisher = createSpecificMetricPublisher(metricPublisherObjectProvider.getIfAvailable(),
70-
properties);
70+
properties, awsClientBuilderConfigurer);
7171
return awsClientBuilderConfigurer.configure(SnsClient.builder(), properties, configurer.getIfAvailable(),
7272
metricPublisher);
7373
}

spring-cloud-aws-autoconfigure/src/main/resources/META-INF/spring.factories

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ io.awspring.cloud.autoconfigure.core.AwsAutoConfiguration,\
33
io.awspring.cloud.autoconfigure.core.CredentialsProviderAutoConfiguration,\
44
io.awspring.cloud.autoconfigure.core.RegionProviderAutoConfiguration,\
55
io.awspring.cloud.autoconfigure.metrics.CloudWatchExportAutoConfiguration,\
6+
io.awspring.cloud.autoconfigure.core.CloudWatchMetricsPublisherAutoConfiguration,\
67
io.awspring.cloud.autoconfigure.ses.SesAutoConfiguration,\
78
io.awspring.cloud.autoconfigure.s3.S3TransferManagerAutoConfiguration,\
89
io.awspring.cloud.autoconfigure.s3.S3AutoConfiguration,\

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

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -31,17 +31,6 @@ class AwsAutoConfigurationTests {
3131
AutoConfigurations.of(CredentialsProviderAutoConfiguration.class, AwsAutoConfiguration.class))
3232
.withBean(CustomRegionProvider.class);
3333

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-
4534
@Test
4635
void doesNotCreateMetricsPublisherWhenDisabledExplicitlyAndDependencyInClasspath() {
4736
contextRunner.withPropertyValues("spring.cloud.aws.metrics.enabled:false")
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
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.junit.jupiter.api.Test;
19+
import org.springframework.boot.autoconfigure.AutoConfigurations;
20+
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
21+
import software.amazon.awssdk.metrics.MetricPublisher;
22+
23+
import static org.assertj.core.api.Assertions.assertThat;
24+
25+
class CloudWatchMetricsPublisherAutoConfigurationTests {
26+
27+
private static ApplicationContextRunner contextRunner = new ApplicationContextRunner()
28+
.withPropertyValues("spring.cloud.aws.region.static:eu-west-1")
29+
.withConfiguration(AutoConfigurations.of(RegionProviderAutoConfiguration.class,
30+
CredentialsProviderAutoConfiguration.class,
31+
CloudWatchMetricsPublisherAutoConfiguration.class,
32+
AwsAutoConfiguration.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+
}

0 commit comments

Comments
 (0)