Skip to content

Commit 71dcae5

Browse files
Merge branch '1.12.x' into 1.13.x
2 parents b3ab39e + f0eb24b commit 71dcae5

File tree

2 files changed

+62
-56
lines changed

2 files changed

+62
-56
lines changed

micrometer-core/src/main/java/io/micrometer/core/instrument/binder/commonspool2/CommonsObjectPool2Metrics.java

Lines changed: 34 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -129,13 +129,18 @@ public void bindTo(@NonNull MeterRegistry registry) {
129129

130130
private Iterable<Tag> nameTag(ObjectName name, String type)
131131
throws AttributeNotFoundException, MBeanException, ReflectionException, InstanceNotFoundException {
132-
Tags tags = Tags.of("name", name.getKeyProperty("name"), "type", type);
132+
return Tags.of("name", name.getKeyProperty("name"), "type", type, "factoryType", getFactoryType(name, type));
133+
}
134+
135+
private String getFactoryType(ObjectName name, String type)
136+
throws ReflectionException, AttributeNotFoundException, InstanceNotFoundException, MBeanException {
133137
if (Objects.equals(type, "GenericObjectPool")) {
134138
// for GenericObjectPool, we want to include the name and factoryType as tags
135-
String factoryType = mBeanServer.getAttribute(name, "FactoryType").toString();
136-
tags = Tags.concat(tags, "factoryType", factoryType);
139+
return mBeanServer.getAttribute(name, "FactoryType").toString();
140+
}
141+
else {
142+
return "none";
137143
}
138-
return tags;
139144
}
140145

141146
private void registerMetricsEventually(String type, BiConsumer<ObjectName, Tags> perObject) {
@@ -170,36 +175,34 @@ private void registerNotificationListener(String type, BiConsumer<ObjectName, Ta
170175
// in notification listener, we cannot get attributes for the registered
171176
// object,
172177
// so we do it later time in a separate thread.
173-
(notification, handback) -> {
174-
executor.execute(() -> {
175-
MBeanServerNotification mbs = (MBeanServerNotification) notification;
176-
ObjectName o = mbs.getMBeanName();
177-
Iterable<Tag> nameTags = emptyList();
178-
int maxTries = 3;
179-
for (int i = 0; i < maxTries; i++) {
180-
try {
181-
Thread.sleep(1000);
182-
}
183-
catch (InterruptedException e) {
184-
Thread.currentThread().interrupt();
185-
throw new RuntimeException(e);
186-
}
187-
try {
188-
nameTags = nameTag(o, type);
189-
break;
190-
}
191-
catch (AttributeNotFoundException | MBeanException | ReflectionException
192-
| InstanceNotFoundException e) {
193-
if (i == maxTries - 1) {
194-
log.error("can not set name tag", e);
195-
}
178+
(notification, handback) -> executor.execute(() -> {
179+
MBeanServerNotification mbs = (MBeanServerNotification) notification;
180+
ObjectName o = mbs.getMBeanName();
181+
Iterable<Tag> nameTags = emptyList();
182+
int maxTries = 3;
183+
for (int i = 0; i < maxTries; i++) {
184+
try {
185+
Thread.sleep(1000);
186+
}
187+
catch (InterruptedException e) {
188+
Thread.currentThread().interrupt();
189+
throw new RuntimeException(e);
190+
}
191+
try {
192+
nameTags = nameTag(o, type);
193+
break;
194+
}
195+
catch (AttributeNotFoundException | MBeanException | ReflectionException
196+
| InstanceNotFoundException e) {
197+
if (i == maxTries - 1) {
198+
log.error("can not set name tag", e);
196199
}
197200
}
198-
perObject.accept(o, Tags.concat(tags, nameTags));
199-
});
200-
};
201+
}
202+
perObject.accept(o, Tags.concat(tags, nameTags));
203+
});
201204

202-
NotificationFilter filter = (NotificationFilter) notification -> {
205+
NotificationFilter filter = notification -> {
203206
if (!MBeanServerNotification.REGISTRATION_NOTIFICATION.equals(notification.getType()))
204207
return false;
205208
ObjectName obj = ((MBeanServerNotification) notification).getMBeanName();

micrometer-core/src/test/java/io/micrometer/core/instrument/binder/commonspool2/CommonsObjectPool2MetricsTest.java

Lines changed: 28 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import org.apache.commons.pool2.impl.GenericObjectPool;
2727
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
2828
import org.junit.jupiter.api.AfterEach;
29+
import org.junit.jupiter.api.BeforeEach;
2930
import org.junit.jupiter.api.Test;
3031

3132
import java.util.Arrays;
@@ -41,50 +42,55 @@ class CommonsObjectPool2MetricsTest {
4142

4243
private int genericObjectPoolCount = 0;
4344

44-
private Tags tags = Tags.of("app", "myapp", "version", "1");
45+
private final Tags tags = Tags.of("app", "myapp", "version", "1");
4546

46-
private final MeterRegistry registry = new SimpleMeterRegistry();
47+
private MeterRegistry registry;
4748

4849
// tag::setup[]
4950
private final CommonsObjectPool2Metrics commonsObjectPool2Metrics = new CommonsObjectPool2Metrics(tags);
5051

5152
// end::setup[]
53+
@BeforeEach
54+
void setUp() {
55+
registry = new SimpleMeterRegistry();
56+
}
5257

5358
@AfterEach
54-
void afterEach() {
59+
void tearDown() {
5560
commonsObjectPool2Metrics.close();
5661
}
5762

5863
@Test
59-
void verifyMetricsWithExpectedTags() {
64+
void verifyGenericObjectPoolMetricsWithExpectedTags() {
6065
// tag::generic_pool[]
61-
try (GenericObjectPool<Object> p = createGenericObjectPool()) {
62-
MeterRegistry registry = new SimpleMeterRegistry();
66+
try (GenericObjectPool<Object> ignored = createGenericObjectPool()) {
6367
commonsObjectPool2Metrics.bindTo(registry);
68+
Tags tagsToMatch = tags.and("name", "pool", "type", "GenericObjectPool", "factoryType",
69+
"io.micrometer.core.instrument.binder.commonspool2.CommonsObjectPool2MetricsTest$1<java.lang.Object>");
6470

65-
registry.get("commons.pool2.num.idle").tags(tags).gauge();
66-
registry.get("commons.pool2.num.waiters").tags(tags).gauge();
71+
registry.get("commons.pool2.num.idle").tags(tagsToMatch).gauge();
72+
registry.get("commons.pool2.num.waiters").tags(tagsToMatch).gauge();
6773

6874
Arrays
6975
.asList("commons.pool2.created", "commons.pool2.borrowed", "commons.pool2.returned",
7076
"commons.pool2.destroyed", "commons.pool2.destroyed.by.evictor",
7177
"commons.pool2.destroyed.by.borrow.validation")
72-
.forEach(name -> registry.get(name).tags(tags).functionCounter());
78+
.forEach(name -> registry.get(name).tags(tagsToMatch).functionCounter());
7379

7480
Arrays
7581
.asList("commons.pool2.max.borrow.wait", "commons.pool2.mean.active", "commons.pool2.mean.idle",
7682
"commons.pool2.mean.borrow.wait")
77-
.forEach(name -> registry.get(name).tags(tags).timeGauge());
83+
.forEach(name -> registry.get(name).tags(tagsToMatch).timeGauge());
7884
}
7985
// end::generic_pool[]
8086
}
8187

8288
@Test
8389
void verifyGenericKeyedObjectPoolMetricsWithExpectedTags() {
8490
// tag::generic_keyed_pool[]
85-
try (GenericKeyedObjectPool<Object, Object> p = createGenericKeyedObjectPool()) {
86-
Tags tagsToMatch = tags.and("type", "GenericKeyedObjectPool");
91+
try (GenericKeyedObjectPool<Object, Object> ignored = createGenericKeyedObjectPool()) {
8792
commonsObjectPool2Metrics.bindTo(registry);
93+
Tags tagsToMatch = tags.and("name", "pool", "type", "GenericKeyedObjectPool", "factoryType", "none");
8894

8995
Arrays.asList("commons.pool2.num.idle", "commons.pool2.num.waiters")
9096
.forEach(name -> registry.get(name).tags(tagsToMatch).gauge());
@@ -113,13 +119,13 @@ void verifyIdleAndActiveInstancesAreReported() throws Exception {
113119
});
114120

115121
try (GenericObjectPool<Object> genericObjectPool = createGenericObjectPool()) {
116-
latch.await(10, TimeUnit.SECONDS);
117-
final Object o = genericObjectPool.borrowObject(10_000L);
122+
assertThat(latch.await(10, TimeUnit.SECONDS)).isTrue();
123+
Object object = genericObjectPool.borrowObject(10_000L);
118124

119125
assertThat(registry.get("commons.pool2.num.active").gauge().value()).isEqualTo(1.0);
120126
assertThat(registry.get("commons.pool2.num.idle").gauge().value()).isEqualTo(0.0);
121127

122-
genericObjectPool.returnObject(o);
128+
genericObjectPool.returnObject(object);
123129

124130
assertThat(registry.get("commons.pool2.num.active").gauge().value()).isEqualTo(0.0);
125131
assertThat(registry.get("commons.pool2.num.idle").gauge().value()).isEqualTo(1.0);
@@ -128,11 +134,9 @@ void verifyIdleAndActiveInstancesAreReported() throws Exception {
128134

129135
@Test
130136
void metricsReportedPerMultiplePools() {
131-
try (final GenericObjectPool<Object> p1 = createGenericObjectPool();
132-
final GenericObjectPool<Object> p2 = createGenericObjectPool();
133-
final GenericObjectPool<Object> p3 = createGenericObjectPool()) {
134-
135-
MeterRegistry registry = new SimpleMeterRegistry();
137+
try (GenericObjectPool<Object> ignored1 = createGenericObjectPool();
138+
GenericObjectPool<Object> ignored2 = createGenericObjectPool();
139+
GenericObjectPool<Object> ignored3 = createGenericObjectPool()) {
136140
commonsObjectPool2Metrics.bindTo(registry);
137141

138142
registry.get("commons.pool2.num.waiters").tag("name", "pool" + genericObjectPoolCount).gauge();
@@ -142,7 +146,6 @@ void metricsReportedPerMultiplePools() {
142146

143147
@Test
144148
void newPoolsAreDiscoveredByListener() throws InterruptedException {
145-
MeterRegistry registry = new SimpleMeterRegistry();
146149
commonsObjectPool2Metrics.bindTo(registry);
147150

148151
CountDownLatch latch = new CountDownLatch(1);
@@ -151,8 +154,8 @@ void newPoolsAreDiscoveredByListener() throws InterruptedException {
151154
latch.countDown();
152155
});
153156

154-
try (GenericObjectPool<Object> p = createGenericObjectPool()) {
155-
latch.await(10, TimeUnit.SECONDS);
157+
try (GenericObjectPool<Object> ignored = createGenericObjectPool()) {
158+
assertThat(latch.await(10, TimeUnit.SECONDS)).isTrue();
156159
}
157160
}
158161

@@ -161,7 +164,7 @@ private GenericObjectPool<Object> createGenericObjectPool() {
161164
GenericObjectPoolConfig<Object> config = new GenericObjectPoolConfig<>();
162165
config.setMaxTotal(10);
163166

164-
return new GenericObjectPool<>(new BasePooledObjectFactory<Object>() {
167+
return new GenericObjectPool<>(new BasePooledObjectFactory<>() {
165168
@Override
166169
public Object create() {
167170
return new Object();
@@ -175,7 +178,7 @@ public PooledObject<Object> wrap(Object testObject) {
175178
}
176179

177180
private GenericKeyedObjectPool<Object, Object> createGenericKeyedObjectPool() {
178-
return new GenericKeyedObjectPool<>(new BaseKeyedPooledObjectFactory<Object, Object>() {
181+
return new GenericKeyedObjectPool<>(new BaseKeyedPooledObjectFactory<>() {
179182
@Override
180183
public Object create(Object key) {
181184
return key;

0 commit comments

Comments
 (0)