当前位置: 首页 > 知识库问答 >
问题:

Hazelcast客户机指标没有值(总是0.0)

璩慎之
2023-03-14
    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
    }

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

  • 让Spring生成CacheManagerbean:相同的结果是,Spring在生成的CacheManagerbean中包装了一个HazelCastClientCacheManager.
  • CacheManagement中注入JCacheCacheManagerbean。Spring仍然将HazelCastClientCacheManagerbean包装在JCacheCacheManager中,但是现在只导出了JCache缓存度量,而没有一个Hazelcast特定的度量(比如cache_partition_gets_total,我认为根据micrometer问题#586,cache_gets_total{result=“miss”}度量必须导出为cache_partition_gets_total{result=“miss”}的替代方法)。所有值仍为0.0

我的最后一个想法/想法是,缓存度量需要在Hazelcast成员上启用,但我找不到任何关于这方面的信息。

共有1个答案

高才
2023-03-14

@Steve-McGarrett,默认情况下Hazelcast中的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

 类似资料:
  • 在构建Retor Netty应用程序时,我得到了两个相似的指标。但是它们之间到底有什么区别呢? vs. 我不知道他们在测量响应时间的方式/位置上有什么不同。哪种方法测量的时间更长并不一致。 Http客户端指标测量时间更长 ReactorNetty指标延长了时间

  • 我正在使用java客户端连接到hazelcast集群。每次我连接到集群时,我都会观察到在成员的jvm上创建了大约5个客户机线程。这些线程在被销毁之前会停留大约30-40秒。这些线是什么?如何控制创建的客户端线程数? 我正在使用hazelcast all。3.3.3

  • 我正在尝试了解Spring Boot如何关闭分布式Hazelcast缓存。当我连接然后关闭第二个实例时,我会得到以下日志: 似乎当我关闭它时,第二个实例并没有向第一个实例报告它正在正确关闭。我们在它无法连接到它几秒钟后收到警告,因此从集群中删除。 它表示它正在尝试运行一个关闭挂钩,但它所做的最后一个报告仍然是“活动的”,并且它从来没有像本文中提到的那样转到“关机”或“关机”。 pom。xml 只是

  • 我刚刚开始使用hazelcast[3.3.1]。根据hazelcast应用程序和客户端教程,我创建了一个hazelcast应用程序实例和一个客户端(使用eclipse IDE)。 从客户端,我能够将对象添加到地图并成功获取它们。但是,我在实例的控制台上看到以下警告,它们似乎警告客户端断开连接。这是每个客户端get/put的正常行为吗? 在退出客户端程序之前,是否有适当的方法断开客户端与实例的连接?

  • 我有以下Quarkus Rest客户端代码(基于此文档https://quarkus.io/guides/rest-client) 当我调用getToken()方法并获取http 200时,我会在localhost中自动生成指标:8080/q/metrics(如本文所述)https://quarkus.io/guides/micrometer#review-自动生成的指标) 例如 我没有得到任何非

  • 我对监视应用程序使用的HTTP REST API很感兴趣。 使用spring boot、dropwizard和EnablePrometheUseEndpoint。我能够在prometheusendpoint上生成这样的prometheus指标: 我想在grafana中构建一个图形来显示对uri上GET方法的所有调用api_v1_objects不同的状态代码(每个状态代码一行)。 我应该将状态代码设