/*
* Licensed to the Apache Software Foundation (ASF) under one or more contributor license
* agreements. See the NOTICE file distributed with this work for additional information regarding
* copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License. You may obtain a
* copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
package org.apache.geode.management.bean.stats;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.junit.Rule;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.junit.rules.TestName;
import org.apache.geode.distributed.internal.DistributionStats;
import org.apache.geode.distributed.internal.locks.DLockStats;
import org.apache.geode.internal.NanoTimer;
import org.apache.geode.internal.OSProcess;
import org.apache.geode.internal.statistics.VMStatsContract;
import org.apache.geode.internal.cache.CachePerfStats;
import org.apache.geode.internal.cache.DiskStoreStats;
import org.apache.geode.internal.cache.GemFireCacheImpl;
import org.apache.geode.internal.cache.PartitionedRegionStats;
import org.apache.geode.internal.cache.execute.FunctionServiceStats;
import org.apache.geode.internal.stats50.VMStats50;
import org.apache.geode.management.ManagementService;
import org.apache.geode.management.internal.beans.MemberMBeanBridge;
import org.apache.geode.test.junit.categories.IntegrationTest;
/**
*/
@Category(IntegrationTest.class)
public class MemberLevelStatsJUnitTest extends MBeanStatsTestCase {
@Rule
public TestName name = new TestName();
private MemberMBeanBridge bridge;
private CachePerfStats cachePerfStats;
private FunctionServiceStats funcServiceStats;
private DistributionStats distributionStats;
private DLockStats dlockStats;
private List<DiskStoreStats> diskStatsList = new ArrayList<DiskStoreStats>();
private List<PartitionedRegionStats> parRegionStatsList = new ArrayList<PartitionedRegionStats>();
private static TimeUnit nanoSeconds = TimeUnit.NANOSECONDS;
private static long testStartTime = NanoTimer.getTime();
public void init() {
cachePerfStats = new CachePerfStats(system);
funcServiceStats = new FunctionServiceStats(system, "FunctionExecution");
long statId = OSProcess.getId();
distributionStats = new DistributionStats(system, statId);
DistributionStats.enableClockStats = true;
dlockStats = new DLockStats(system, statId);
bridge = new MemberMBeanBridge();
bridge.addCacheStats(cachePerfStats);
bridge.addFunctionStats(funcServiceStats);
bridge.addDistributionStats(distributionStats);
bridge.addLockServiceStats(dlockStats);
VMStatsContract vmstats = system.getStatSampler().getVMStats();
assertTrue(vmstats instanceof VMStats50);
bridge.addSystemStats();
bridge.addVMStats();
for (int i = 0; i < 4; i++) {
DiskStoreStats stats = new DiskStoreStats(system, name.getMethodName() + i);
diskStatsList.add(stats);
bridge.addDiskStoreStats(stats);
}
for (int i = 0; i < 4; i++) {
PartitionedRegionStats stats = new PartitionedRegionStats(system, name.getMethodName() + i);
parRegionStatsList.add(stats);
bridge.addPartionRegionStats(stats);
}
}
@Test
public void testPlainCounters() throws InterruptedException {
cachePerfStats.incRegions(3);
cachePerfStats.incEntryCount(400);
cachePerfStats.incGetInitialImageKeysReceived();
cachePerfStats.incDiskTasksWaiting();
funcServiceStats.incFunctionExecutionsRunning();
funcServiceStats.incFunctionExecutionHasResultRunning();
sample();
assertEquals(3, getTotalRegionCount());
assertEquals(400, getTotalRegionEntryCount());
assertEquals(1, getInitialImageKeysReceived());
assertEquals(1, getNumRunningFunctions());
assertEquals(1, getNumRunningFunctionsHavingResults());
assertEquals(1, getTotalDiskTasksWaiting());
}
@Test
public void testLockServiceCounters() throws InterruptedException {
dlockStats.incServices(5);
dlockStats.incGrantors(2);
dlockStats.incRequestQueues(10);
long lockWaitStarts = dlockStats.startLockWait();
sample();
int lockWaitinProgress = getLockWaitsInProgress();
int lockRequestQueue = getLockRequestQueues();
int numLockService = getTotalNumberOfLockService();
int lockGrantors = getTotalNumberOfGrantors();
assertEquals(1, lockWaitinProgress);
assertEquals(2, lockGrantors);
assertEquals(5, numLockService);
assertEquals(10, lockRequestQueue);
dlockStats.endLockWait(lockWaitStarts, true);
sample();
long lockWaitTime = getTotalLockWaitTime();
assertTrue(lockWaitTime > 0);
}
@Test
public void testTimeBasedCounters() throws InterruptedException {
long startGIITime = cachePerfStats.startGetInitialImage();
long startCacheListenerTime = cachePerfStats.startCacheListenerCall();
long startCacheWriterTime = cachePerfStats.startCacheWriterCall();
long startLoadTime = cachePerfStats.startLoad();
cachePerfStats.endPutAll(testStartTime);
long startGetsTime1 = cachePerfStats.startGet();
long startGetsTime2 = cachePerfStats.startGet();
long startNetLoadTime = cachePerfStats.startNetload();
long startNetSearchTime = cachePerfStats.startNetsearch();
sample();
assertEquals(1, getInitialImagesInProgres());
cachePerfStats.endGetInitialImage(startGIITime);
cachePerfStats.endCacheListenerCall(startCacheListenerTime);
cachePerfStats.endCacheWriterCall(startCacheWriterTime);
cachePerfStats.endGet(startGetsTime1, true);
cachePerfStats.endGet(startGetsTime2, false);
cachePerfStats.endLoad(startLoadTime);
cachePerfStats.endNetload(startNetLoadTime);
cachePerfStats.endNetsearch(startNetSearchTime);
long startPutsTime = cachePerfStats.endPut(testStartTime, false);
cachePerfStats.txSuccess(CachePerfStats.getStatTime() - testStartTime, testStartTime, 1);
cachePerfStats.txRollback(CachePerfStats.getStatTime() - testStartTime, testStartTime, 1);
sample();
assertEquals(1, getTotalNetLoadsCompleted());
assertEquals(1, getTotalNetSearchCompleted());
long netLoadAverageLatency = getNetLoadsAverageLatency();
print("netLoadAverageLatency is " + new Long(netLoadAverageLatency).toString());
long netSearchAverageLatency = getNetSearchAverageLatency();
print("netSearchAverageLatency is " + new Long(netSearchAverageLatency).toString());
assertTrue(netLoadAverageLatency > 0);
assertTrue(netSearchAverageLatency > 0);
assertEquals(1, getTotalHitCount()); // Gets minus Misses
assertTrue(getInitialImageTime() > 0);
long cacheListenerLatency = getCacheListenerCallsAvgLatency();
assertTrue(cacheListenerLatency > 0);
long cacheWriterLatency = getCacheWriterCallsAvgLatency();
assertTrue(cacheWriterLatency > 0);
float putAllRate = getPutAllRate();
long putAllAverageLatency = getPutAllAvgLatency();
assertTrue(putAllAverageLatency > 0);
print("putAllRate is " + new Float(putAllRate).toString());
assertTrue(putAllRate > 0);
float getsRate = getGetsRate();
long getsAverageLatency = getGetsAvgLatency();
assertTrue(getsAverageLatency > 0);
print("getsRate is " + new Float(getsRate).toString());
assertTrue(getsRate > 0);
assertEquals(1, getTotalMissCount());
float putsRate = getPutsRate();
long putsAverageLatency = getPutsAvgLatency();
assertTrue(putsAverageLatency > 0);
print("putsRate is " + new Float(putsRate).toString());
assertTrue(putsRate > 0);
assertEquals(1, getTotalLoadsCompleted());
long loadAverageLatency = getLoadsAverageLatency();
assertTrue(loadAverageLatency > 0);
assertEquals(1, getTransactionCommittedTotalCount());
assertEquals(1, getTransactionRolledBackTotalCount());
assertEquals(2, getTotalTransactionsCount());
float txnCommitRates = getTransactionCommitsRate();
print("txnCommitRates is " + new Float(txnCommitRates).toString());
assertTrue(txnCommitRates > 0);
long txnCommitAverageLatency = getTransactionCommitsAvgLatency();
assertTrue(txnCommitAverageLatency > 0);
}
@Test
public void testRates() throws InterruptedException {
for (int i = 0; i < 20; i++) {
cachePerfStats.incCreates();
cachePerfStats.incDestroys();
funcServiceStats.incFunctionExecutionsCompleted();
distributionStats.incSentBytes(20);
distributionStats.incReceivedBytes(20);
}
sample();
float createsRate = getCreatesRate();
float destroyRate = getDestroysRate();
float functionExecutionRate = getFunctionExecutionRate();
float byteSentRate = getBytesSentRate();
float byteReceivedRate = getBytesReceivedRate();
print("createsRate is " + new Float(createsRate).toString());
print("destroyRate is " + new Float(destroyRate).toString());
print("functionExecutionRate is " + new Float(functionExecutionRate).toString());
print("byteSentRate is " + new Float(byteSentRate).toString());
print("byteReceivedRate is " + new Float(byteReceivedRate).toString());
assertTrue(createsRate > 0);
assertTrue(destroyRate > 0);
assertTrue(functionExecutionRate > 0);
assertTrue(byteSentRate > 0);
assertTrue(byteReceivedRate > 0);
}
@Test
public void testDistributionStats() throws InterruptedException {
long initTime = System.currentTimeMillis();
long startTime = distributionStats.startReplyWait();
distributionStats.incNodes(20);
sample();
assertEquals(1, bridge.getReplyWaitsInProgress());
assertEquals(20, bridge.getVisibleNodes());
distributionStats.endReplyWait(startTime, initTime);
sample();
assertEquals(0, bridge.getReplyWaitsInProgress());
assertEquals(1, bridge.getReplyWaitsCompleted());
}
@Test
public void testDiskCounters() throws InterruptedException {
for (DiskStoreStats stats : diskStatsList) {
stats.startRead();
stats.startWrite();
stats.startBackup();
stats.incWrittenBytes(200, false);
stats.startFlush();
}
sample();
assertEquals(4, getTotalBackupInProgress());
assertTrue(getDiskWritesRate() > 0);
for (DiskStoreStats stats : diskStatsList) {
stats.endRead(testStartTime, 20);
stats.endWrite(testStartTime);
stats.endBackup();
stats.endFlush(testStartTime);
}
sample();
assertEquals(4, getTotalBackupCompleted());
assertTrue(getDiskFlushAvgLatency() > 0);
assertTrue(getDiskReadsRate() > 0);
for (DiskStoreStats stats : diskStatsList) {
bridge.removeDiskStoreStats(stats);
stats.close();
}
assertEquals(4, getTotalBackupCompleted());
}
@Test
public void testRegionCounters() throws InterruptedException {
for (PartitionedRegionStats stats : parRegionStatsList) {
stats.incBucketCount(1);
stats.incPrimaryBucketCount(1);
stats.incDataStoreEntryCount(1);
}
sample();
assertEquals(4, getTotalBucketCount());
assertEquals(4, getTotalBucketSize());
assertEquals(4, getTotalPrimaryBucketCount());
for (PartitionedRegionStats stats : parRegionStatsList) {
bridge.removePartionRegionStats(stats);
stats.close();
}
sample();
assertEquals(0, getTotalBucketCount());
assertEquals(0, getTotalBucketSize());
assertEquals(0, getTotalPrimaryBucketCount());
}
@Test
public void testCacheBasedStats() throws Exception {
GemFireCacheImpl cache = GemFireCacheImpl.getInstance();
ManagementService service = ManagementService.getExistingManagementService(cache);
long start = cache.getResourceManager().getStats().startRebalance();
assertEquals(1, service.getMemberMXBean().getRebalancesInProgress());
cache.getResourceManager().getStats().endRebalance(start);
assertEquals(0, service.getMemberMXBean().getRebalancesInProgress());
}
public void print(String message) {
system.getLogWriter().fine(message);
}
public int getTotalBucketSize() {
return bridge.getTotalBucketSize();
}
private int getInitialImageKeysReceived() {
return bridge.getInitialImageKeysReceived();
}
private long getInitialImageTime() {
return bridge.getInitialImageTime();
}
private int getInitialImagesInProgres() {
return bridge.getInitialImagesInProgres();
}
private float getBytesReceivedRate() {
return bridge.getBytesReceivedRate();
}
private float getBytesSentRate() {
return bridge.getBytesSentRate();
}
private long getCacheListenerCallsAvgLatency() {
return bridge.getCacheListenerCallsAvgLatency();
}
private long getCacheWriterCallsAvgLatency() {
return bridge.getCacheWriterCallsAvgLatency();
}
private float getCreatesRate() {
return bridge.getCreatesRate();
}
private float getDestroysRate() {
return bridge.getDestroysRate();
}
private float getDiskReadsRate() {
return bridge.getDiskReadsRate();
}
private float getDiskWritesRate() {
return bridge.getDiskWritesRate();
}
private int getTotalBackupInProgress() {
return bridge.getTotalBackupInProgress();
}
private int getTotalBackupCompleted() {
return bridge.getTotalBackupCompleted();
}
private long getDiskFlushAvgLatency() {
return bridge.getDiskFlushAvgLatency();
}
private float getFunctionExecutionRate() {
return bridge.getFunctionExecutionRate();
}
private long getGetsAvgLatency() {
return bridge.getGetsAvgLatency();
}
private float getGetsRate() {
return bridge.getGetsRate();
}
private int getLockWaitsInProgress() {
return bridge.getLockWaitsInProgress();
}
private int getNumRunningFunctions() {
return bridge.getNumRunningFunctions();
}
private int getNumRunningFunctionsHavingResults() {
return bridge.getNumRunningFunctionsHavingResults();
}
private long getPutAllAvgLatency() {
return bridge.getPutAllAvgLatency();
}
private float getPutAllRate() {
return bridge.getPutAllRate();
}
private long getPutsAvgLatency() {
return bridge.getPutAllAvgLatency();
}
private float getPutsRate() {
return bridge.getPutsRate();
}
private int getTotalPrimaryBucketCount() {
return bridge.getTotalPrimaryBucketCount();
}
private int getTotalBucketCount() {
return bridge.getTotalBucketCount();
}
private int getTotalHitCount() {
return bridge.getTotalHitCount();
}
private float getLruDestroyRate() {
return bridge.getLruDestroyRate();
}
private float getLruEvictionRate() {
return bridge.getLruEvictionRate();
}
private int getTotalLoadsCompleted() {
return bridge.getTotalLoadsCompleted();
}
private long getLoadsAverageLatency() {
return bridge.getLoadsAverageLatency();
}
private int getTotalNetLoadsCompleted() {
return bridge.getTotalNetLoadsCompleted();
}
private long getNetLoadsAverageLatency() {
return bridge.getNetLoadsAverageLatency();
}
private int getTotalNetSearchCompleted() {
return bridge.getTotalNetSearchCompleted();
}
private long getNetSearchAverageLatency() {
return bridge.getNetSearchAverageLatency();
}
private int getTotalMissCount() {
return bridge.getTotalMissCount();
}
private int getLockRequestQueues() {
return bridge.getLockRequestQueues();
}
private long getTotalLockWaitTime() {
return bridge.getTotalLockWaitTime();
}
private int getTotalNumberOfLockService() {
return bridge.getTotalNumberOfLockService();
}
private int getTotalNumberOfGrantors() {
return bridge.getTotalNumberOfGrantors();
}
private int getTotalDiskTasksWaiting() {
return bridge.getTotalDiskTasksWaiting();
}
private int getTotalRegionCount() {
return bridge.getTotalRegionCount();
}
private int getTotalRegionEntryCount() {
return bridge.getTotalRegionEntryCount();
}
private int getTotalTransactionsCount() {
return bridge.getTotalTransactionsCount();
}
private long getTransactionCommitsAvgLatency() {
return bridge.getTransactionCommitsAvgLatency();
}
private float getTransactionCommitsRate() {
return bridge.getTransactionCommitsRate();
}
private int getTransactionCommittedTotalCount() {
return bridge.getTransactionCommittedTotalCount();
}
private int getTransactionRolledBackTotalCount() {
return bridge.getTransactionRolledBackTotalCount();
}
}