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。
CacheManager
bean:相同的结果是,Spring在生成的CacheManager
bean中包装了一个HazelCastClientCacheManager
.CacheManagement
中注入JCacheCacheManager
bean。Spring仍然将HazelCastClientCacheManager
bean包装在JCacheCacheManager
中,但是现在只导出了JCache缓存度量,而没有一个Hazelcast特定的度量(比如cache_partition_gets_total
,我认为根据micrometer问题#586,cache_gets_total{result=“miss”}
度量必须导出为cache_partition_gets_total{result=“miss”}
的替代方法)。所有值仍为0.0我的最后一个想法/想法是,缓存度量需要在Hazelcast成员上启用,但我找不到任何关于这方面的信息。
@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不同的状态代码(每个状态代码一行)。 我应该将状态代码设