Tolerate Hazelcast 4
This commit updates HazelcastHealthIndicator and HazelcastCacheMeterBinderProvider so that they work with Hazelcast 4 while retaining compatibility with Hazelcast 3. Reflection is used when necessary. This commit also adds a smoke test that validates those features are working when Hazelcast 4 is on the classpath. Closes gh-21169
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2012-2019 the original author or authors.
|
||||
* Copyright 2012-2020 the original author or authors.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -16,12 +16,16 @@
|
||||
|
||||
package org.springframework.boot.actuate.hazelcast;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
import java.util.UUID;
|
||||
|
||||
import com.hazelcast.core.HazelcastInstance;
|
||||
|
||||
import org.springframework.boot.actuate.health.AbstractHealthIndicator;
|
||||
import org.springframework.boot.actuate.health.Health;
|
||||
import org.springframework.boot.actuate.health.HealthIndicator;
|
||||
import org.springframework.util.Assert;
|
||||
import org.springframework.util.ReflectionUtils;
|
||||
|
||||
/**
|
||||
* {@link HealthIndicator} for Hazelcast.
|
||||
@@ -43,10 +47,22 @@ public class HazelcastHealthIndicator extends AbstractHealthIndicator {
|
||||
@Override
|
||||
protected void doHealthCheck(Health.Builder builder) {
|
||||
this.hazelcast.executeTransaction((context) -> {
|
||||
builder.up().withDetail("name", this.hazelcast.getName()).withDetail("uuid",
|
||||
this.hazelcast.getLocalEndpoint().getUuid());
|
||||
builder.up().withDetail("name", this.hazelcast.getName()).withDetail("uuid", extractUuid());
|
||||
return null;
|
||||
});
|
||||
}
|
||||
|
||||
private String extractUuid() {
|
||||
try {
|
||||
return this.hazelcast.getLocalEndpoint().getUuid();
|
||||
}
|
||||
catch (NoSuchMethodError ex) {
|
||||
// Hazelcast 4
|
||||
Method endpointAccessor = ReflectionUtils.findMethod(HazelcastInstance.class, "getLocalEndpoint");
|
||||
Object endpoint = ReflectionUtils.invokeMethod(endpointAccessor, this.hazelcast);
|
||||
Method uuidAccessor = ReflectionUtils.findMethod(endpoint.getClass(), "getUuid");
|
||||
return ((UUID) ReflectionUtils.invokeMethod(uuidAccessor, endpoint)).toString();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -16,11 +16,15 @@
|
||||
|
||||
package org.springframework.boot.actuate.metrics.cache;
|
||||
|
||||
import java.lang.reflect.Method;
|
||||
|
||||
import com.hazelcast.spring.cache.HazelcastCache;
|
||||
import io.micrometer.core.instrument.Tag;
|
||||
import io.micrometer.core.instrument.binder.MeterBinder;
|
||||
import io.micrometer.core.instrument.binder.cache.HazelcastCacheMetrics;
|
||||
|
||||
import org.springframework.util.ReflectionUtils;
|
||||
|
||||
/**
|
||||
* {@link CacheMeterBinderProvider} implementation for Hazelcast.
|
||||
*
|
||||
@@ -31,7 +35,25 @@ public class HazelcastCacheMeterBinderProvider implements CacheMeterBinderProvid
|
||||
|
||||
@Override
|
||||
public MeterBinder getMeterBinder(HazelcastCache cache, Iterable<Tag> tags) {
|
||||
return new HazelcastCacheMetrics(cache.getNativeCache(), tags);
|
||||
try {
|
||||
return new HazelcastCacheMetrics(cache.getNativeCache(), tags);
|
||||
}
|
||||
catch (NoSuchMethodError ex) {
|
||||
// Hazelcast 4
|
||||
return createHazelcast4CacheMetrics(cache, tags);
|
||||
}
|
||||
}
|
||||
|
||||
private MeterBinder createHazelcast4CacheMetrics(HazelcastCache cache, Iterable<Tag> tags) {
|
||||
try {
|
||||
Method nativeCacheAccessor = ReflectionUtils.findMethod(HazelcastCache.class, "getNativeCache");
|
||||
Object nativeCache = ReflectionUtils.invokeMethod(nativeCacheAccessor, cache);
|
||||
return HazelcastCacheMetrics.class.getConstructor(Object.class, Iterable.class).newInstance(nativeCache,
|
||||
tags);
|
||||
}
|
||||
catch (Exception ex) {
|
||||
throw new IllegalStateException("Failed to create MeterBinder for Hazelcast", ex);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user