Skip to content

Commit 03011a6

Browse files
AWS metrics v2
1 parent 2cf3e09 commit 03011a6

File tree

5 files changed

+182
-52
lines changed

5 files changed

+182
-52
lines changed

src/main/java/com/orange/lo/sample/mqtt2eventhub/ConnectorApplication.java

Lines changed: 0 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -7,65 +7,13 @@
77

88
package com.orange.lo.sample.mqtt2eventhub;
99

10-
import com.orange.lo.sample.mqtt2eventhub.utils.MetricsProperties;
11-
import io.micrometer.cloudwatch2.CloudWatchConfig;
12-
import io.micrometer.cloudwatch2.CloudWatchMeterRegistry;
13-
import io.micrometer.core.instrument.Clock;
14-
import io.micrometer.core.instrument.MeterRegistry;
15-
import io.micrometer.core.instrument.config.MeterFilter;
16-
import org.slf4j.Logger;
17-
import org.slf4j.LoggerFactory;
1810
import org.springframework.boot.SpringApplication;
1911
import org.springframework.boot.autoconfigure.SpringBootApplication;
20-
import org.springframework.context.annotation.Bean;
21-
import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider;
22-
import software.amazon.awssdk.regions.providers.AwsProfileRegionProvider;
23-
import software.amazon.awssdk.services.cloudwatch.CloudWatchAsyncClient;
24-
25-
import java.lang.invoke.MethodHandles;
2612

2713
@SpringBootApplication
2814
public class ConnectorApplication {
2915

30-
private static final String AWS_SERVICE_PROFILE_NAME = "service-profile";
31-
private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
32-
private final MetricsProperties metricsProperties;
33-
34-
ConnectorApplication(MetricsProperties metricsProperties) {
35-
this.metricsProperties = metricsProperties;
36-
}
37-
3816
public static void main(String[] args) {
3917
SpringApplication.run(ConnectorApplication.class, args);
4018
}
41-
42-
@Bean
43-
public MeterRegistry meterRegistry() {
44-
CloudWatchAsyncClient cloudWatchAsyncClient = CloudWatchAsyncClient.builder()
45-
.credentialsProvider(ProfileCredentialsProvider.create(AWS_SERVICE_PROFILE_NAME))
46-
.region(new AwsProfileRegionProvider(null, AWS_SERVICE_PROFILE_NAME).getRegion())
47-
.build();
48-
49-
CloudWatchMeterRegistry cloudWatchMeterRegistry = new CloudWatchMeterRegistry(cloudWatchConfig(), Clock.SYSTEM, cloudWatchAsyncClient);
50-
51-
cloudWatchMeterRegistry.config()
52-
.meterFilter(MeterFilter.deny(id -> !id.getName().startsWith("message")))
53-
.commonTags(metricsProperties.getDimensionName(), metricsProperties.getDimensionValue());
54-
return cloudWatchMeterRegistry;
55-
}
56-
57-
private CloudWatchConfig cloudWatchConfig() {
58-
return new CloudWatchConfig() {
59-
60-
@Override
61-
public String get(String key) {
62-
return null;
63-
}
64-
65-
@Override
66-
public String namespace() {
67-
return metricsProperties.getNamespace();
68-
}
69-
};
70-
}
7119
}
Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
1+
/**
2+
* Copyright (c) Orange. All Rights Reserved.
3+
* <p>
4+
* This source code is licensed under the MIT license found in the
5+
* LICENSE file in the root directory of this source tree.
6+
*/
7+
8+
package com.orange.lo.sample.mqtt2eventhub.utils;
9+
10+
import io.micrometer.cloudwatch2.CloudWatchConfig;
11+
import io.micrometer.cloudwatch2.CloudWatchMeterRegistry;
12+
import io.micrometer.core.instrument.Clock;
13+
import io.micrometer.core.instrument.Counter;
14+
import io.micrometer.core.instrument.MeterRegistry;
15+
import io.micrometer.core.instrument.config.MeterFilter;
16+
import io.micrometer.core.instrument.step.StepMeterRegistry;
17+
import io.micrometer.core.instrument.step.StepRegistryConfig;
18+
import org.jetbrains.annotations.NotNull;
19+
import org.slf4j.Logger;
20+
import org.slf4j.LoggerFactory;
21+
import org.springframework.context.annotation.Bean;
22+
import org.springframework.context.annotation.Configuration;
23+
import software.amazon.awssdk.auth.credentials.AwsCredentialsProvider;
24+
import software.amazon.awssdk.auth.credentials.InstanceProfileCredentialsProvider;
25+
import software.amazon.awssdk.auth.credentials.ProfileCredentialsProvider;
26+
import software.amazon.awssdk.regions.Region;
27+
import software.amazon.awssdk.regions.providers.AwsProfileRegionProvider;
28+
import software.amazon.awssdk.regions.providers.InstanceProfileRegionProvider;
29+
import software.amazon.awssdk.services.cloudwatch.CloudWatchAsyncClient;
30+
31+
import java.lang.invoke.MethodHandles;
32+
import java.time.Duration;
33+
import java.util.concurrent.Executors;
34+
import java.util.concurrent.ThreadFactory;
35+
import java.util.concurrent.TimeUnit;
36+
37+
@Configuration
38+
public class MeterRegistryConfig {
39+
40+
private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
41+
private static final String AWS_SERVICE_PROFILE_NAME = "service-profile";
42+
private final MetricsProperties metricsProperties;
43+
44+
public MeterRegistryConfig(MetricsProperties metricsProperties) {
45+
this.metricsProperties = metricsProperties;
46+
}
47+
48+
@Bean
49+
public MeterRegistry meterRegistry() {
50+
MeterRegistry meterRegistry;
51+
if (metricsProperties.isSendToCloudwatch()) {
52+
meterRegistry = getCloudWatchMeterRegistry();
53+
} else {
54+
meterRegistry = stepMeterRegistry();
55+
}
56+
return meterRegistry;
57+
}
58+
59+
@NotNull
60+
private CloudWatchMeterRegistry getCloudWatchMeterRegistry() {
61+
CloudWatchAsyncClient cloudWatchAsyncClient = CloudWatchAsyncClient.builder()
62+
.credentialsProvider(getAwsCredentialsProvider())
63+
.region(getRegion())
64+
.build();
65+
66+
CloudWatchMeterRegistry cloudWatchMeterRegistry = new CloudWatchMeterRegistry(cloudWatchConfig(), Clock.SYSTEM, cloudWatchAsyncClient);
67+
68+
cloudWatchMeterRegistry.config()
69+
.meterFilter(MeterFilter.deny(id -> !id.getName().startsWith("message")))
70+
.commonTags(metricsProperties.getDimensionName(), metricsProperties.getDimensionValue());
71+
return cloudWatchMeterRegistry;
72+
}
73+
74+
private AwsCredentialsProvider getAwsCredentialsProvider() {
75+
return metricsProperties.isUseServiceProfile()
76+
? ProfileCredentialsProvider.create(AWS_SERVICE_PROFILE_NAME)
77+
: InstanceProfileCredentialsProvider.create();
78+
}
79+
80+
private Region getRegion() {
81+
return metricsProperties.isUseServiceProfile()
82+
? new AwsProfileRegionProvider(null, AWS_SERVICE_PROFILE_NAME).getRegion()
83+
: new InstanceProfileRegionProvider().getRegion();
84+
}
85+
86+
private CloudWatchConfig cloudWatchConfig() {
87+
return new CloudWatchConfig() {
88+
89+
@Override
90+
public String get(@NotNull String key) {
91+
return null;
92+
}
93+
94+
@NotNull
95+
@Override
96+
public String namespace() {
97+
return metricsProperties.getNamespace();
98+
}
99+
};
100+
}
101+
102+
private StepMeterRegistry stepMeterRegistry() {
103+
StepMeterRegistry stepMeterRegistry = new StepMeterRegistry(stepRegistryConfig(), Clock.SYSTEM) {
104+
105+
@NotNull
106+
@Override
107+
protected TimeUnit getBaseTimeUnit() {
108+
return TimeUnit.MILLISECONDS;
109+
}
110+
111+
@Override
112+
protected void publish() {
113+
getMeters().stream()
114+
.filter(m -> m.getId().getName().startsWith("message") )
115+
.map(m -> get(m.getId().getName()).counter())
116+
.forEach(c -> LOG.info(c.getId().getName() + " = " + val(c)));
117+
}
118+
119+
@Override
120+
public void start(@NotNull ThreadFactory threadFactory) {
121+
super.start(Executors.defaultThreadFactory());
122+
}
123+
};
124+
stepMeterRegistry.start(Executors.defaultThreadFactory());
125+
return stepMeterRegistry;
126+
}
127+
128+
private StepRegistryConfig stepRegistryConfig() {
129+
return new StepRegistryConfig() {
130+
131+
@NotNull
132+
@Override
133+
public Duration step() {
134+
return Duration.ofMinutes(1);
135+
}
136+
137+
@NotNull
138+
@Override
139+
public String prefix() {
140+
return "";
141+
}
142+
143+
@Override
144+
public String get(@NotNull String key) {
145+
return null;
146+
}
147+
};
148+
}
149+
150+
private long val(Counter cnt) {
151+
return Math.round(cnt.count());
152+
}
153+
}

src/main/java/com/orange/lo/sample/mqtt2eventhub/utils/MetricsProperties.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
/**
2+
* Copyright (c) Orange. All Rights Reserved.
3+
* <p>
4+
* This source code is licensed under the MIT license found in the
5+
* LICENSE file in the root directory of this source tree.
6+
*/
7+
18
package com.orange.lo.sample.mqtt2eventhub.utils;
29

310
import org.springframework.boot.context.properties.ConfigurationProperties;
@@ -9,6 +16,8 @@ public class MetricsProperties {
916
private String namespace;
1017
private String dimensionName;
1118
private String dimensionValue;
19+
private boolean sendToCloudwatch;
20+
private boolean useServiceProfile;
1221

1322
public String getNamespace() {
1423
return namespace;
@@ -33,4 +42,20 @@ public String getDimensionValue() {
3342
public void setDimensionValue(String dimensionValue) {
3443
this.dimensionValue = dimensionValue;
3544
}
45+
46+
public boolean isSendToCloudwatch() {
47+
return sendToCloudwatch;
48+
}
49+
50+
public void setSendToCloudwatch(boolean sendToCloudwatch) {
51+
this.sendToCloudwatch = sendToCloudwatch;
52+
}
53+
54+
public boolean isUseServiceProfile() {
55+
return useServiceProfile;
56+
}
57+
58+
public void setUseServiceProfile(boolean useServiceProfile) {
59+
this.useServiceProfile = useServiceProfile;
60+
}
3661
}

src/main/resources/application.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ azure:
2121
max-send-attempts: 3
2222

2323
metrics:
24+
send-to-cloudwatch: false
25+
use-service-profile: false
2426
namespace: CCS
2527
dimension-name: connector-id
2628
dimension-value:

src/main/resources/logback.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@
2929
</appender>
3030
<logger name="com.orange.lo.sample.mqtt2eventhub" level="DEBUG" />
3131
<Logger name="org.eclipse.paho.client.mqttv3" level="FINE" />
32+
<Logger name="org.apache.catalina.core" level="WARN" />
33+
<Logger name="org.springframework.boot.web.embedded.tomcat" level="WARN" />
3234

3335
<root level="INFO">
3436
<appender-ref ref="STDOUT" />

0 commit comments

Comments
 (0)