背景/项目设置:我们正在使用2.0.4.RELEASE
( JCache,javax.cache:cache-api:1.1.0
)在Springboot中开发一个(微)服务。我们最近从Ehcache转向了Hazelcast (3.10.4
),为我们的分布式微服务提供了一个中央缓存集群。我们还使用Prometheus (io.micrometer:micrometer-registry-prometheus:1.0.6
)导出重要的度量。切换后,导出的缓存度量值除0.0外没有任何值。详细信息:我对Hazelcast使用了以下Spring配置(删除了无关的导入)
import org.springframework.cache.CacheManager;
import com.hazelcast.client.HazelcastClient;
import com.hazelcast.client.config.ClientConfig;
import com.hazelcast.core.HazelcastInstance;
import com.hazelcast.spring.cache.HazelcastCacheManager;
@Configuration
public class HazelcastCacheConfig {
@Bean
public ClientConfig config() {
ClientConfig config = new ClientConfig();
// set group and network config
return config;
}
@Bean
@DependsOn("config")
public HazelcastInstance hazelcastInstance() {
return HazelcastClient.newHazelcastClient(config());
}
@Bean
@DependsOn("hazelcastInstance")
public CacheManager cacheManager() {
return new HazelcastCacheManager(hazelcastInstance());
}
}
我们的项目需要动态创建缓存。因此,我实现了一个定制的CacheResolver
来创建和注册这些缓存及其相应的度量:
import org.springframework.boot.actuate.metrics.cache.CacheMetricsRegistrar;
import org.springframework.cache.Cache;
import org.springframework.cache.CacheManager;
import io.micrometer.core.instrument.binder.cache.HazelcastCacheMetrics;
import io.micrometer.prometheus.PrometheusMeterRegistry;
@Component
public class CacheManagement implements CacheResolver {
@Autowired
CacheManager cacheManager;
@Autowired
CacheMetricsRegistrar cacheMetricsRegistrar;
@Autowired
PrometheusMeterRegistry meterRegistry;
@Override
public Collection<? extends Cache> resolveCaches(CacheOperationInvocationContext<?> context) {
String cacheName = context.getMethod().getAnnotation(Cacheable.class).cacheNames()[0];
Cache cache = cacheManager.getCache("some Name");
// checks if cache already exists in io.micrometer.prometheus.PrometheusMeterRegistry
if (!cacheRegistered(cache)) {
if (cache.getNativeCache() instanceof IMap<?, ?>)
HazelcastCacheMetrics.monitor(meterRegistry, (IMap<?, ?>) cache.getNativeCache(), /*some tags*/);
// same result with this
// cacheMetricsRegistrar.bindCacheToRegistry(cache, /*some tags*/)
}
}
return cache;
}
最后,我用
@Cacheable(
cacheNames = "someGeneratedName",
cacheResolver = "cacheManagement",
keyGenerator = "cacheKeyGenerator",
unless = /*..*/,
condition = /*..*/
)
public Object someCacheableMethod(Object... someParameters) {
// logic
}
现在,缓存工作得很好。缓存是在运行时生成的,通过调试,我可以验证缓存机制是否正常工作。这些指标也是通过普罗米修斯导出的。唯一的问题是所有与缓存相关的指标的值总是为0.0。
通过调试,我发现com.hazelcast.monitor.impl.LocalMapStatsImpl
中的com.hazelcast.monitor.impl.LocalMapStatsImpl
方法从未被调用过。因此,当Prometheus导致调用getHits()
时,它总是返回0。
我还试过什么:
CacheManager
bean:同样的结果,Spring在生成的CacheManager
bean中包装一个HazelcastClientCacheManager
。JCacheCacheManager
中注入CacheManagement
。Spring仍然将HazelcastClientCacheManager
bean封装在JCacheCacheManager
中,但现在只有JCache缓存度量被导出,没有一个是哈泽尔广播特定的指标(比如,我认为必须导出的cache_partition_gets_total
,作为千分尺问题#586的cache_gets_total{result="miss"}
度量的替代)。所有值仍为0.0我的最后一个想法/想法是,缓存度量需要以某种方式在Hazelcast成员上启用,但我找不到有关这方面的任何信息。
发布于 2018-08-26 22:36:29
@steve-mcgarrett,JCache统计数据在黑兹尔广播中是默认禁用的。您需要通过编程或将下面的配置添加到hazelcast.xml
文件中来启用它:
<cache name="default">
<statistics-enabled>false</statistics-enabled>
</cache>
请参阅:http://docs.hazelcast.org/docs/latest/manual/html-single/index.html#jcache-declarative-configuration
https://stackoverflow.com/questions/52001718
复制相似问题