package voldemort.store.bdb.stats; import java.util.ArrayList; import java.util.Collections; import java.util.List; import voldemort.annotations.jmx.JmxGetter; import voldemort.utils.ReflectUtils; import voldemort.utils.Utils; /** * Aggregated statistics about all the bdb environments on this server. * */ public class AggregatedBdbEnvironmentStats { List<BdbEnvironmentStats> environmentStatsTracked; public AggregatedBdbEnvironmentStats() { environmentStatsTracked = Collections.synchronizedList(new ArrayList<BdbEnvironmentStats>()); } public void trackEnvironment(BdbEnvironmentStats stats) { environmentStatsTracked.add(stats); } public void unTrackEnvironment(BdbEnvironmentStats stats) { environmentStatsTracked.remove(stats); } /** * Calls the provided metric getter on all the tracked environments and * obtains their values * * @param metricGetterName * @return */ private List<Long> collectLongMetric(String metricGetterName) { List<Long> vals = new ArrayList<Long>(); for(BdbEnvironmentStats envStats: environmentStatsTracked) { vals.add((Long) ReflectUtils.callMethod(envStats, BdbEnvironmentStats.class, metricGetterName, new Class<?>[0], new Object[0])); } return vals; } // 1. Caching @JmxGetter(name = "NumCacheMiss") public long getNumCacheMiss() { return Utils.sumLongList(collectLongMetric("getNumCacheMiss")); } @JmxGetter(name = "AllotedCacheSize") public long getAllotedCacheSize() { return Utils.sumLongList(collectLongMetric("getAllotedCacheSize")); } @JmxGetter(name = "EvictionPasses") public long getEvictedLNs() { return Utils.sumLongList(collectLongMetric("getEvictedLNs")); } @JmxGetter(name = "BINFetches") public long getBINFetches() { return Utils.sumLongList(collectLongMetric("getBINFetches")); } @JmxGetter(name = "BINFetchMisses") public long getBINFetchMisses() { return Utils.sumLongList(collectLongMetric("getBINFetchMisses")); } @JmxGetter(name = "INFetches") public long getINFetches() { return Utils.sumLongList(collectLongMetric("getINFetches")); } @JmxGetter(name = "INFetchMisses") public long getINFetchMisses() { return Utils.sumLongList(collectLongMetric("getINFetchMisses")); } @JmxGetter(name = "LNFetches") public long getLNFetches() { return Utils.sumLongList(collectLongMetric("getLNFetches")); } @JmxGetter(name = "LNFetchMisses") public long getLNFetchMisses() { return Utils.sumLongList(collectLongMetric("getLNFetchMisses")); } @JmxGetter(name = "CachedBINs") public long getCachedBINs() { return Utils.sumLongList(collectLongMetric("getCachedBINs")); } @JmxGetter(name = "CachedINs") public long getCachedUpperINs() { return Utils.sumLongList(collectLongMetric("getCachedUpperINs")); } @JmxGetter(name = "EvictedBINs") public long getEvictedBINs() { return Utils.sumLongList(collectLongMetric("getEvictedBINs")); } @JmxGetter(name = "EvictedINs") public long getEvictedINs() { return Utils.sumLongList(collectLongMetric("getEvictedINs")); } // 2. IO @JmxGetter(name = "NumRandomWrites") public long getNumRandomWrites() { return Utils.sumLongList(collectLongMetric("getNumRandomWrites")); } @JmxGetter(name = "NumRandomWriteBytes") public long getNumRandomWriteBytes() { return Utils.sumLongList(collectLongMetric("getNumRandomWriteBytes")); } @JmxGetter(name = "NumRandomReads") public long getNumRandomReads() { return Utils.sumLongList(collectLongMetric("getNumRandomReads")); } @JmxGetter(name = "NumRandomReadBytes") public long getNumRandomReadBytes() { return Utils.sumLongList(collectLongMetric("getNumRandomReadBytes")); } @JmxGetter(name = "NumSequentialWrites") public long getNumSequentialWrites() { return Utils.sumLongList(collectLongMetric("getNumSequentialWrites")); } @JmxGetter(name = "NumSequentialWriteBytes") public long getNumSequentialWriteBytes() { return Utils.sumLongList(collectLongMetric("getNumSequentialWriteBytes")); } @JmxGetter(name = "NumSequentialReads") public long getNumSequentialReads() { return Utils.sumLongList(collectLongMetric("getNumSequentialReads")); } @JmxGetter(name = "NumSequentialReadBytes") public long getNumSequentialReadBytes() { return Utils.sumLongList(collectLongMetric("getNumSequentialReadBytes")); } @JmxGetter(name = "NumFSyncs") public long getNumFSyncs() { return Utils.sumLongList(collectLongMetric("getNumFSyncs")); } // 3. Cleaning & Checkpointing @JmxGetter(name = "NumCleanerEntriesRead") public long getNumCleanerEntriesRead() { return Utils.sumLongList(collectLongMetric("getNumCleanerEntriesRead")); } @JmxGetter(name = "FileDeletionBacklog") public long getFileDeletionBacklog() { return Utils.sumLongList(collectLongMetric("getFileDeletionBacklog")); } @JmxGetter(name = "FileDeletionBacklogBytes") public long getFileDeletionBacklogBytes() { return Utils.sumLongList(collectLongMetric("getFileDeletionBacklogBytes")); } @JmxGetter(name = "CleanerBacklog") public long getCleanerBacklog() { return Utils.sumLongList(collectLongMetric("getCleanerBacklog")); } @JmxGetter(name = "NumCleanerRuns") public long getNumCleanerRuns() { return Utils.sumLongList(collectLongMetric("getNumCleanerRuns")); } @JmxGetter(name = "NumCleanerDeletions") public long getNumCleanerDeletions() { return Utils.sumLongList(collectLongMetric("getNumCleanerDeletions")); } @JmxGetter(name = "NumCheckpoints") public long getNumCheckpoints() { return Utils.sumLongList(collectLongMetric("getNumCheckpoints")); } @JmxGetter(name = "TotalSpace") public long getTotalSpace() { return Utils.sumLongList(collectLongMetric("getTotalSpace")); } @JmxGetter(name = "TotalSpaceUtilized") public long getTotalSpaceUtilized() { return Utils.sumLongList(collectLongMetric("getTotalSpaceUtilized")); } // 4. Latching/Locking @JmxGetter(name = "BtreeLatches") public long getBtreeLatches() { return Utils.sumLongList(collectLongMetric("getBtreeLatches")); } @JmxGetter(name = "NumAcquiresWithContention") public long getNumAcquiresWithContention() { return Utils.sumLongList(collectLongMetric("getNumAcquiresWithContention")); } @JmxGetter(name = "NumAcquiresNoWaiters") public long getNumAcquiresNoWaiters() { return Utils.sumLongList(collectLongMetric("getNumAcquiresNoWaiters")); } // 5. Exceptions & general statistics @JmxGetter(name = "numExceptions") public long getNumExceptions() { return Utils.sumLongList(collectLongMetric("getNumExceptions")); } @JmxGetter(name = "numLockTimeoutExceptions") public long getNumLockTimeoutExceptions() { return Utils.sumLongList(collectLongMetric("getNumLockTimeoutExceptions")); } @JmxGetter(name = "numEnvironmentFailureExceptions") public long getNumEnvironmentFailureExceptions() { return Utils.sumLongList(collectLongMetric("getNumEnvironmentFailureExceptions")); } // Compound statistics derived from raw statistics @JmxGetter(name = "NumWritesTotal") public long getNumWritesTotal() { return Utils.sumLongList(collectLongMetric("getNumWritesTotal")); } @JmxGetter(name = "NumWriteBytesTotal") public long getNumWriteBytesTotal() { return Utils.sumLongList(collectLongMetric("getNumWriteBytesTotal")); } @JmxGetter(name = "NumReadsTotal") public long getNumReadsTotal() { return Utils.sumLongList(collectLongMetric("getNumReadsTotal")); } @JmxGetter(name = "NumReadBytesTotal") public long getNumReadBytesTotal() { return Utils.sumLongList(collectLongMetric("getNumReadBytesTotal")); } @JmxGetter(name = "PercentRandomWrites") public double getPercentRandomWrites() { return Utils.safeGetPercentage(getNumRandomWrites(), getNumWritesTotal()); } @JmxGetter(name = "PercentageRandomWriteBytes") public double getPercentageRandomWriteBytes() { return Utils.safeGetPercentage(getNumRandomWriteBytes(), getNumRandomWriteBytes() + getNumSequentialWriteBytes()); } @JmxGetter(name = "PercentageRandomReads") public double getPercentageRandomReads() { return Utils.safeGetPercentage(getNumRandomReads(), getNumReadsTotal()); } @JmxGetter(name = "PercentageRandomReadBytes") public double getPercentageRandomReadBytes() { return Utils.safeGetPercentage(getNumRandomWriteBytes(), getNumRandomReadBytes() + getNumSequentialReadBytes()); } @JmxGetter(name = "PercentageReads") public double getPercentageReads() { return Utils.safeGetPercentage(getNumReadsTotal(), getNumReadsTotal() + getNumWritesTotal()); } @JmxGetter(name = "PercentageReadBytes") public double getPercentageReadBytes() { return Utils.safeGetPercentage(getNumReadBytesTotal(), getNumWriteBytesTotal() + getNumReadBytesTotal()); } @JmxGetter(name = "PercentageCacheHits") public double getPercentageCacheHits() { return 1.0d - getPercentageCacheMisses(); } @JmxGetter(name = "PercentageCacheMisses") public double getPercentageCacheMisses() { return Utils.safeGetPercentage(getNumCacheMiss(), getNumReadsTotal() + getNumWritesTotal()); } @JmxGetter(name = "PercentageContended") public double getPercentageContended() { return Utils.safeGetPercentage(getNumAcquiresWithContention(), getNumAcquiresWithContention() + getNumAcquiresNoWaiters()); } @JmxGetter(name = "PercentageUtilization") public double getPercentageUtilization() { return Utils.safeGetPercentage(getTotalSpaceUtilized(), getTotalSpace()); } @JmxGetter(name = "PercentageBINMiss") public double getPercentageBINMiss() { return Utils.safeGetPercentage(getBINFetchMisses(), getBINFetches()); } @JmxGetter(name = "PercentageINMiss") public double getPercentageINMiss() { return Utils.safeGetPercentage(getINFetchMisses(), getINFetches()); } @JmxGetter(name = "PercentageLNMiss") public double getPercentageLNMiss() { return Utils.safeGetPercentage(getLNFetchMisses(), getLNFetches()); } }