Фоновая настройка / настройка проекта:
Мы разрабатываем (микро-) сервис в Springboot (2.0.4.RELEASE
) с JCache (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;
}
Наконец, я аннотирую методы chacheable с помощью
@Cacheable(
cacheNames = "someGeneratedName",
cacheResolver = "cacheManagement",
keyGenerator = "cacheKeyGenerator",
unless = /*..*/,
condition = /*..*/
)
public Object someCacheableMethod(Object... someParameters) {
// logic
}
Теперь кэширование работает отлично.Кэши создаются во время выполнения, и с помощью отладки я могу убедиться, что механизм кэширования работает так, как ожидалось.Метрики также экспортируются через Прометей.Единственная проблема состоит в том, что все связанные с кэшированием метрики всегда имеют значение 0.0.
При отладке я обнаружил, что метод setHits(long hits)
в com.hazelcast.monitor.impl.LocalMapStatsImpl
никогда не вызывается.Поэтому, когда очистка Прометея приводит к вызову getHits()
, он всегда возвращает 0.
Что еще я пробовал:
- Пусть Spring генерирует бин
CacheManager
: тот же результат, Spring оборачивает HazelcastClientCacheManager
всгенерированный CacheManager
bean. - Внедрить
JCacheCacheManager
bean в CacheManagement
.Spring по-прежнему упаковывает bean-компонент HazelcastClientCacheManager
в JCacheCacheManager
, но теперь экспортируются только метрики кэша JCache, но ни одна из специфических для Hazelcast (например, cache_partition_gets_total
, которую я думал, должен быть экспортирован как альтернатива метрике cache_gets_total{result="miss"}
согласнок вопросу о микрометре # 586 ).Все значения по-прежнему равны 0,0
Еще одна мысль / мысль, которая у меня возникла, заключается в том, что метрики кэширования необходимо как-то включить на членах Hazelcast, но я не смог найти никакой информации по этому вопросу.