Получение статистики региона в клиентском приложении spring data geode

#caching #spring-data-gemfire #spring-boot-data-geode

#кэширование #spring-data-gemfire #spring-boot-data-geode

Вопрос:

Мне нужно получить статистику региона в приложении apache geode client-cache.

Настройка: 1 локатор, 1 сервер, 1 клиент-приложение для кэширования

Все модули создаются с использованием spring.

Сервер кэша создаст регионы на основе cache.xml

Cache.xml:

     <?xml version="1.0" encoding="UTF-8"?>
<cache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns="http://geode.apache.org/schema/cache"
       xsi:schemaLocation="http://geode.apache.org/schema/cache http://geode.apache.org/schema/cache/cache-1.0.xsd"
       version="1.0" lock-lease="120" lock-timeout="60" search-timeout="300"
       is-server="true" copy-on-read="false">

    <pdx read-serialized="true" persistent="true">
        <pdx-serializer>
            <class-name>
                org.apache.geode.pdx.ReflectionBasedAutoSerializer
            </class-name>
        </pdx-serializer>
    </pdx>

    <region name="track" refid="PARTITION_PERSISTENT_OVERFLOW">
        <region-attributes statistics-enabled="true">
            <compressor>
                <class-name>org.apache.geode.compression.SnappyCompressor</class-name>
            </compressor>
        </region-attributes>
        <index name="trackKeyIndex" from-clause="/track" expression="key" key-index="true"/>
        <index name="trackTransactionNameIndex" from-clause="/track" expression="transactions[*]"/>
    </region>
</cache>
 

Кэш-серверное приложение

 @SpringBootApplication
@org.springframework.data.gemfire.config.annotation.CacheServerApplication(name = "cacheServer", locators = "localhost[10334]")
@EnableClusterAware
@EnableCompression
@EnableStatistics
@EnableGemFireProperties(cacheXmlFile = "cache.xml")
public class CacheServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(CacheServerApplication.class, args);
    }
}
 

Клиент-кэш-приложение

 @SpringBootApplication
@ClientCacheApplication
@EnableClusterDefinedRegions //Fetch cluster defined regions for @Resource autowired prop
@EnableStatistics
public class GeodeClientApplication {
    public static void main(String[] args) {
        SpringApplication.run(GeodeClientApplication.class, args);
    }
}
 

Класс компонента в клиентском кэше для получения статистики региона.

 @Component
public class TrackedInsightsCacheService {

    private static Logger logger = LoggerFactory.getLogger(TrackedInsightsCacheService.class);

    @Autowired
    @Resource(name = "track")
    private Region trackRegion;

    public Object getRegionStatistics(){
                RegionAttributes attributes = trackRegion.getAttributes();
                if(attributes.getStatisticsEnabled()) {
                    return trackRegion.getStatistics();
                }
                return null;
            }
    public Object get(String key) {
        return trackRegion.get(key);
    }

    public void put(String key, String value){
        trackRegion.put(key, value);
    }        
}
 

Автоматически подключенный TrackRegion является локальным регионом. Всякий раз, когда я выполняю вызов get, он сначала проверяет локальный регион, а затем проверяет ключ в регионе сервера.

Но когда я выполняю вызов getStatistics, он сообщает, что статистика для региона отключена.

Чего мне здесь не хватает? Это правильный способ получения статистики региона.

Я могу получить статистику кластера через командную строку gfsh, и вывод выглядит примерно так,

 gfsh>show metrics
Cluster-wide Metrics

Category  |        Metric         | Value
--------- | --------------------- | -----
cluster   | totalHeapSize         | 4846
cache     | totalRegionEntryCount | 1
          | totalRegionCount      | 1
          | totalMissCount        | 81
          | totalHitCount         | 15
diskstore | totalDiskUsage        | 0
          | diskReadsRate         | 0.0
          | diskWritesRate        | 0.0
          | flushTimeAvgLatency   | 0
          | totalBackupInProgress | 0
query     | activeCQCount         | 0
          | queryRequestRate      | 0.0
 

У меня есть несколько регионов в настройке, и просмотра статистики по кластеру недостаточно, поэтому требуется получить данные метрик по регионам.

Ответ №1:

getStatistics() Метод возвращает статистику для фактического Region экземпляра. Поскольку вы выполняете этот метод на стороне клиента, фактическая возвращаемая статистика будет для локального клиента Region , а это не то, что вы хотите.

gfsh show metrics Команда фактически извлекает статистику региона, используя JMX , вы можете проверить исходный код и адаптировать его к вашим потребностям здесь.

Другим вариантом, если вы не хотите использовать JMX , было бы написать пользовательскую функцию Geode и вручную получить статистику, которую вы ищете, с помощью StatisticsManager.

Ваше здоровье.