/* * Licensed to Jasig under one or more contributor license * agreements. See the NOTICE file distributed with this work * for additional information regarding copyright ownership. * Jasig 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 the following location: * * 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.jasig.cas.monitor; import java.util.Formatter; import net.sf.ehcache.Cache; import net.sf.ehcache.config.CacheConfiguration; import net.sf.ehcache.statistics.StatisticsGateway; /** * Ehcache statistics wrapper. * * @author Marvin S. Addison * @since 3.5.1 */ public class EhCacheStatistics implements CacheStatistics { private final Cache cache; // Flag to determine whether size units are in bytes or simple object counts private boolean useBytes; private long diskSize; private long heapSize; // Off heap size is always in units of bytes private long offHeapSize; /** * Creates a new instance that delegates statistics inquiries to the given {@link Cache} instance. * * @param cache Cache instance for which to gather statistics. */ public EhCacheStatistics(final Cache cache) { this.cache = cache; if (cache.getCacheConfiguration().getMaxBytesLocalDisk() > 0) { useBytes = true; } } /** * Gets the size of heap consumed by items stored in the cache. * * @return Memory size. */ @Override public long getSize() { final StatisticsGateway statistics = cache.getStatistics(); // Store component sizes on each call to avoid recalculating // sizes in other methods that need them if (useBytes) { diskSize = statistics.getLocalDiskSizeInBytes(); heapSize = statistics.getLocalHeapSizeInBytes(); } else { diskSize = cache.getDiskStoreSize(); heapSize = cache.getMemoryStoreSize(); } offHeapSize = statistics.getLocalOffHeapSizeInBytes(); return heapSize; } /** * Gets the heap memory capacity of the cache. * * @return Heap memory capacity. */ @Override public long getCapacity() { final CacheConfiguration config = cache.getCacheConfiguration(); if (useBytes) { return config.getMaxBytesLocalDisk(); } return config.getMaxElementsOnDisk(); } @Override public long getEvictions() { return cache.getStatistics().cacheEvictedCount(); } @Override public int getPercentFree() { final long capacity = getCapacity(); if (capacity == 0) { return 0; } return (int) ((capacity - getSize()) * 100 / capacity); } @Override public String getName() { return cache.getName(); } @Override public void toString(final StringBuilder builder) { if (getName() != null) { builder.append(getName()).append(':'); } final int free = getPercentFree(); final Formatter formatter = new Formatter(builder); if (useBytes) { formatter.format("%.2f", heapSize / 1048510.0); builder.append("MB heap, "); formatter.format("%.2f", diskSize / 1048510.0); builder.append("MB disk, "); } else { builder.append(heapSize).append(" items in heap, "); builder.append(diskSize).append(" items on disk, "); } formatter.format("%.2f", offHeapSize / 1048510.0); builder.append("MB off-heap, "); builder.append(free).append("% free, "); builder.append(getEvictions()).append(" evictions"); formatter.close(); } }