Hazelcast客户指标没有价值(始终为0.0)

时间:2018-08-24 09:44:27

标签: spring-boot hazelcast metrics prometheus jcache

背景/项目设置:

我们正在使用JCache(2.0.4.RELEASE)在Springboot(javax.cache:cache-api:1.1.0)中开发(微)服务。我们最近从Ehcache切换到Hazelcast(3.10.4),以为我们的分布式微服务提供一个中央缓存集群。 此外,我们使用Prometheus(io.micrometer:micrometer-registry-prometheus:1.0.6)导出重要指标。切换后,导出的缓存指标除0.0外没有其他任何值。

细节:

我将以下Spring配置用于Hazelcast(已删除的不相关导入)

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;
}

最后,我用

注释了可chache方法
@Cacheable(
    cacheNames = "someGeneratedName",
    cacheResolver = "cacheManagement",
    keyGenerator = "cacheKeyGenerator",
    unless = /*..*/,
    condition = /*..*/
)
public Object someCacheableMethod(Object... someParameters) {
    // logic
}

现在缓存效果很好。缓存是在运行时生成的,通过调试,我可以验证缓存机制是否按预期工作。度量标准也通过Prometheus导出。唯一的问题是所有与缓存相关的指标的值始终为0.0。

通过调试,我发现从未调用setHits(long hits)中的com.hazelcast.monitor.impl.LocalMapStatsImpl方法。因此,当Prometheus抓取导致调用getHits()时,它总是返回0。

我还尝试了什么:
  • 让Spring生成CacheManager bean:相同的结果,Spring在生成的HazelcastClientCacheManager bean中包装CacheManager
  • JCacheCacheManager中注入CacheManagement bean。 Spring仍将HazelcastClientCacheManager bean封装在JCacheCacheManager中,但现在仅导出JCache缓存指标,没有任何Hazelcast特定指标(例如cache_partition_gets_total,我认为必须将其导出为替代) cache_gets_total{result="miss"}度量(根据千分尺问题#586)。所有值仍为0.0

我最后一个想法/想法是需要以某种方式在Hazelcast成员上启用缓存指标,但是我找不到任何信息。

1 个答案:

答案 0 :(得分:0)

@ steve-mcgarrett,默认情况下,Hazelcast中的JCache统计信息处于禁用状态。您需要以编程方式将其启用,或者将以下配置添加到hazelcast.xml文件中:

<cache name="default">
  <statistics-enabled>false</statistics-enabled>
</cache>

请参阅:http://www.yourdomain.com