Hi,
I am trying to use partitioned cache on server nodes to which I connect
with client node. Statistics of cache in the cluster are updated, but only
for hits metric - misses metric is always 0.

To reproduce this problem I created cluster of two nodes:

Server node 1 adds 100 random test cases and prints cache statistics
continuously:

public class IgniteClusterNode1 {
    public static void main(String[] args) throws InterruptedException {
        IgniteConfiguration igniteConfiguration = new IgniteConfiguration();

        CacheConfiguration cacheConfiguration = new CacheConfiguration();
        cacheConfiguration.setName("test");
        cacheConfiguration.setCacheMode(CacheMode.PARTITIONED);
        cacheConfiguration.setAtomicityMode(CacheAtomicityMode.ATOMIC);
        cacheConfiguration.setStatisticsEnabled(true);
        igniteConfiguration.setCacheConfiguration(cacheConfiguration);

        TcpCommunicationSpi communicationSpi = new TcpCommunicationSpi();
        communicationSpi.setLocalPort(47500);
        igniteConfiguration.setCommunicationSpi(communicationSpi);

        TcpDiscoverySpi discoverySpi = new TcpDiscoverySpi();
        discoverySpi.setLocalPort(47100);
        discoverySpi.setLocalPortRange(100);
        TcpDiscoveryVmIpFinder ipFinder = new TcpDiscoveryVmIpFinder();
        ipFinder.setAddresses(Arrays.asList("127.0.0.1:47100..47200",
"127.0.0.1:48100..48200"));
        igniteConfiguration.setDiscoverySpi(discoverySpi);

        try (Ignite ignite = Ignition.start(igniteConfiguration)) {
            try (IgniteCache<String, String> cache =
ignite.getOrCreateCache("test")) {
                new Random().ints(1000).map(i -> Math.abs(i %
1000)).distinct().limit(100).forEach(i -> {
                            String key = "data_" + i;
                            String value = UUID.randomUUID().toString();
                            cache.put(key, value);
                        }
                );
            }
            while (true) {
                System.out.println(ignite.cache("test").metrics());
                Thread.sleep(5000);
            }
        }
    }
}

Server node 2 only prints cache statistics continuously:

public class IgniteClusterNode2 {
    public static void main(String[] args) throws InterruptedException {
        IgniteConfiguration igniteConfiguration = new IgniteConfiguration();

        CacheConfiguration cacheConfiguration = new CacheConfiguration();
        cacheConfiguration.setName("test");
        cacheConfiguration.setCacheMode(CacheMode.PARTITIONED);
        cacheConfiguration.setStatisticsEnabled(true);
        igniteConfiguration.setCacheConfiguration(cacheConfiguration);

        TcpCommunicationSpi communicationSpi = new TcpCommunicationSpi();
        communicationSpi.setLocalPort(48500);
        igniteConfiguration.setCommunicationSpi(communicationSpi);

        TcpDiscoverySpi discoverySpi = new TcpDiscoverySpi();
        discoverySpi.setLocalPort(48100);
        discoverySpi.setLocalPortRange(100);
        TcpDiscoveryVmIpFinder ipFinder = new TcpDiscoveryVmIpFinder();
        ipFinder.setAddresses(Arrays.asList("127.0.0.1:47100..47200",
"127.0.0.1:48100..48200"));
        igniteConfiguration.setDiscoverySpi(discoverySpi);

        try (Ignite ignite = Ignition.start(igniteConfiguration)) {
            while (true) {
                System.out.println(ignite.cache("test").metrics());
                Thread.sleep(5000);
            }
        }
    }
}

Next I start a client node which continuously read data from the cluster:

public class CacheClusterReader {
    public static void main(String[] args) throws InterruptedException {
        IgniteConfiguration cfg = new IgniteConfiguration();
        cfg.setClientMode(true);

        TcpDiscoverySpi spi = new TcpDiscoverySpi();
        TcpDiscoveryVmIpFinder tcMp = new TcpDiscoveryVmIpFinder();
        tcMp.setAddresses(Arrays.asList("127.0.0.1:47100..47200",
"127.0.0.1:48100..48200"));
        spi.setIpFinder(tcMp);
        cfg.setDiscoverySpi(spi);

        CacheConfiguration<String, String> cacheConfig = new
CacheConfiguration<>("test");
        cacheConfig.setStatisticsEnabled(true);
        cacheConfig.setCacheMode(CacheMode.PARTITIONED);
        cfg.setCacheConfiguration(cacheConfig);

        try (Ignite ignite = Ignition.start(cfg)) {
            System.out.println(ignite.cacheNames());

            while (true) {
                try (IgniteCache<String, String> cache =
ignite.getOrCreateCache(cacheConfig)) {
                    cache.enableStatistics(true);

                    new Random().ints(1000).map(i -> Math.abs(i %
2000)).distinct().limit(100).forEach(i -> {
                                String key = "data_" + i;
                                String value = cache.get(key);
                                System.out.println("Found " + key + " with
value " + value);
                            }
                    );

                    System.out.println(cache.metrics());
                    System.out.println(cache.localMetrics());
                }
                Thread.sleep(3000);
            }
        }
    }
}

On server and client nodes cluster statistics are synchronized, but misses
counter is always equal to 0, e. g.

CacheMetricsSnapshot [reads=93, puts=100, entryProcessorPuts=0,
entryProcessorReadOnlyInvocations=0,
entryProcessorAverageInvocationTime=0.0, entryProcessorInvocations=0,
entryProcessorRemovals=0, entryProcessorMisses=0, entryProcessorHits=0,
entryProcessorMissPercentage=0.0, entryProcessorHitPercentage=0.0,
entryProcessorMaxInvocationTime=0.0,
entryProcessorMinInvocationTime=0.0, *hits=93,
misses=0*, txCommits=0, txRollbacks=0, evicts=0, removes=0,
putAvgTimeNanos=259.4794, getAvgTimeNanos=0.0, rmvAvgTimeNanos=0.0,
commitAvgTimeNanos=0.0, rollbackAvgTimeNanos=0.0, cacheName=test,
offHeapGets=0, offHeapPuts=0, offHeapRemoves=0, offHeapEvicts=0,
offHeapHits=0, offHeapMisses=0, offHeapEntriesCnt=100, heapEntriesCnt=0,
offHeapPrimaryEntriesCnt=100, offHeapBackupEntriesCnt=0,
offHeapAllocatedSize=0, size=56, cacheSize=56, keySize=56, isEmpty=false,
dhtEvictQueueCurrSize=-1, txThreadMapSize=0, txXidMapSize=0,
txCommitQueueSize=0, txPrepareQueueSize=0, txStartVerCountsSize=0,
txCommittedVersionsSize=0, txRolledbackVersionsSize=0,
txDhtThreadMapSize=0, txDhtXidMapSize=-1, txDhtCommitQueueSize=0,
txDhtPrepareQueueSize=0, txDhtStartVerCountsSize=0,
txDhtCommittedVersionsSize=-1, txDhtRolledbackVersionsSize=-1,
isWriteBehindEnabled=false, writeBehindFlushSize=-1,
writeBehindFlushThreadCnt=-1, writeBehindFlushFreq=-1,
writeBehindStoreBatchSize=-1, writeBehindTotalCriticalOverflowCnt=-1,
writeBehindCriticalOverflowCnt=-1, writeBehindErrorRetryCnt=-1,
writeBehindBufSize=-1, totalPartitionsCnt=1024, rebalancingPartitionsCnt=0,
rebalancedKeys=44, estimatedRebalancingKeys=44, keysToRebalanceLeft=0,
rebalancingKeysRate=0, rebalancingBytesRate=0, rebalanceStartTime=0,
rebalanceFinishTime=0, rebalanceClearingPartitionsLeft=0,
keyType=java.lang.Object, valType=java.lang.Object, isStoreByVal=true,
isStatisticsEnabled=true, isManagementEnabled=false, isReadThrough=false,
isWriteThrough=false, isValidForReading=true, isValidForWriting=true]

In comparision, I also have also a thin client which connects to server and
read some random data once:

public class CacheClusterThinClientReader {
    public static void main(String[] args) throws Exception {
        ClientConfiguration clientConfiguration = new ClientConfiguration()
                .setAddresses("127.0.0.1:10800");

        try (IgniteClient ignite =
Ignition.startClient(clientConfiguration)) {

            ClientCache<String, String> cache =
ignite.getOrCreateCache("test");

            Set<String> misses = new HashSet<>();
            new Random().ints(1000).map(i -> Math.abs(i %
2000)).distinct().limit(100).forEach(i -> {
                        String key = "data_" + i;
                        String value = cache.get(key);
                        System.out.println("Found " + key + " with value "
+ value);
                        if (value == null) {
                            misses.add(key);
                        }
                    }
            );
            System.out.println("Misses count: " + misses.size());
        }
    }
}

and finally prints (in my try):

Misses count: 97

On the server nodes misses were counted, but only for one server node:

CacheMetricsSnapshot [reads=51, puts=100, entryProcessorPuts=0,
entryProcessorReadOnlyInvocations=0,
entryProcessorAverageInvocationTime=0.0, entryProcessorInvocations=0,
entryProcessorRemovals=0, entryProcessorMisses=0, entryProcessorHits=0,
entryProcessorMissPercentage=0.0, entryProcessorHitPercentage=0.0,
entryProcessorMaxInvocationTime=0.0,
entryProcessorMinInvocationTime=0.0, *hits=3,
misses=48*, txCommits=0, txRollbacks=0, evicts=0, removes=0,
putAvgTimeNanos=276.13132, getAvgTimeNanos=850.90735, rmvAvgTimeNanos=0.0,
commitAvgTimeNanos=0.0, rollbackAvgTimeNanos=0.0, cacheName=test,
offHeapGets=0, offHeapPuts=0, offHeapRemoves=0, offHeapEvicts=0,
offHeapHits=0, offHeapMisses=0, offHeapEntriesCnt=100, heapEntriesCnt=0,
offHeapPrimaryEntriesCnt=100, offHeapBackupEntriesCnt=0,
offHeapAllocatedSize=0, size=53, cacheSize=53, keySize=53, isEmpty=false,
dhtEvictQueueCurrSize=-1, txThreadMapSize=0, txXidMapSize=0,
txCommitQueueSize=0, txPrepareQueueSize=0, txStartVerCountsSize=0,
txCommittedVersionsSize=0, txRolledbackVersionsSize=0,
txDhtThreadMapSize=0, txDhtXidMapSize=-1, txDhtCommitQueueSize=0,
txDhtPrepareQueueSize=0, txDhtStartVerCountsSize=0,
txDhtCommittedVersionsSize=-1, txDhtRolledbackVersionsSize=-1,
isWriteBehindEnabled=false, writeBehindFlushSize=-1,
writeBehindFlushThreadCnt=-1, writeBehindFlushFreq=-1,
writeBehindStoreBatchSize=-1, writeBehindTotalCriticalOverflowCnt=-1,
writeBehindCriticalOverflowCnt=-1, writeBehindErrorRetryCnt=-1,
writeBehindBufSize=-1, totalPartitionsCnt=1024, rebalancingPartitionsCnt=0,
rebalancedKeys=47, estimatedRebalancingKeys=47, keysToRebalanceLeft=0,
rebalancingKeysRate=0, rebalancingBytesRate=0, rebalanceStartTime=0,
rebalanceFinishTime=0, rebalanceClearingPartitionsLeft=0,
keyType=java.lang.Object, valType=java.lang.Object, isStoreByVal=true,
isStatisticsEnabled=true, isManagementEnabled=false, isReadThrough=false,
isWriteThrough=false, isValidForReading=true, isValidForWriting=true]

Visor confirms my observation:

Nodes for: test(@c0)
+==================================================================================================================+
|      Node ID8(@), IP       | CPUs | Heap Used | CPU Load |   Up Time    |
Size (Primary / Backup)  | Hi/Mi/Rd/Wr |
+==================================================================================================================+
| D09713CD(@n1), 10.10.10.14 | 8    | 2.81 %    | 0.53 %   | 00:15:00.291 |
Total: 47 (47 / 0)       | Hi: 0       |
|                            |      |           |          |              |
  Heap: 0 (0 / <n/a>)    | Mi: 0       |
|                            |      |           |          |              |
  Off-Heap: 47 (47 / 0)  | Rd: 0       |
|                            |      |           |          |              |
  Off-Heap Memory: <n/a> | Wr: 0       |
+----------------------------+------+-----------+----------+--------------+--------------------------+-------------+
| B8CCBCAB(@n0), 10.10.10.14 | 8    | 1.15 %    | 0.50 %   | 00:15:04.122 |
Total: 53 (53 / 0)       | Hi: 3       |
|                            |      |           |          |              |
  Heap: 0 (0 / <n/a>)    | Mi: 48      |
|                            |      |           |          |              |
  Off-Heap: 53 (53 / 0)  | Rd: 51      |
|                            |      |           |          |              |
  Off-Heap Memory: <n/a> | Wr: 100     |
+------------------------------------------------------------------------------------------------------------------+

I have seen the same behaviour with rest api as with the thin client, but I
don't have prepared test case for this.

Is there a good way to correctly configure collecting statistics on server
nodes?
Should I create an issue for this problem?

-- 
Pozdrawiam / Regards,
Dominik Przybysz

Reply via email to