Метрики клиента Hazelcast не имеют значения (всегда 0.0) - PullRequest
0 голосов
/ 24 августа 2018
Фоновая настройка / настройка проекта:

Мы разрабатываем (микро-) сервис в 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, но я не смог найти никакой информации по этому вопросу.

1 Ответ

0 голосов
/ 27 августа 2018

@ steve-mcgarrett, статистика JCache в Hazelcast отключена по умолчанию.Вам необходимо включить его, либо программно, либо добавив приведенный ниже конфиг в файл 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

...