/*
* Copyright Terracotta, Inc.
*
* Licensed 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.ehcache.management.registry;
import java.io.File;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.NoSuchElementException;
import java.util.concurrent.ExecutionException;
import org.ehcache.Cache;
import org.ehcache.CacheManager;
import org.ehcache.PersistentCacheManager;
import org.ehcache.config.CacheConfiguration;
import org.ehcache.config.builders.CacheConfigurationBuilder;
import org.ehcache.config.builders.CacheManagerBuilder;
import org.ehcache.config.builders.ResourcePoolsBuilder;
import org.ehcache.config.units.EntryUnit;
import org.ehcache.config.units.MemoryUnit;
import org.ehcache.management.ManagementRegistryService;
import org.junit.BeforeClass;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.junit.rules.TemporaryFolder;
import org.junit.rules.Timeout;
import org.terracotta.management.model.call.ContextualReturn;
import org.terracotta.management.model.capabilities.Capability;
import org.terracotta.management.model.capabilities.descriptors.Descriptor;
import org.terracotta.management.model.capabilities.descriptors.StatisticDescriptor;
import org.terracotta.management.model.context.Context;
import org.terracotta.management.model.context.ContextContainer;
import org.terracotta.management.model.stats.ContextualStatistics;
import org.terracotta.management.registry.ResultSet;
import org.terracotta.management.registry.StatisticQuery.Builder;
import static org.assertj.core.api.Assertions.assertThat;
import static org.ehcache.config.builders.ResourcePoolsBuilder.heap;
import static org.ehcache.config.builders.ResourcePoolsBuilder.newResourcePoolsBuilder;
import static org.ehcache.config.units.MemoryUnit.MB;
public class DefaultManagementRegistryServiceTest {
private static final Collection<Descriptor> ONHEAP_DESCRIPTORS = new ArrayList<Descriptor>();
private static final Collection<Descriptor> OFFHEAP_DESCRIPTORS = new ArrayList<Descriptor>();
private static final Collection<Descriptor> DISK_DESCRIPTORS = new ArrayList<Descriptor>();
private static final Collection<Descriptor> CACHE_DESCRIPTORS = new ArrayList<Descriptor>();
@Rule
public final ExpectedException expectedException = ExpectedException.none();
@Rule
public final TemporaryFolder diskPath = new TemporaryFolder();
@Rule
public final Timeout globalTimeout = Timeout.seconds(10);
@Test
public void testCanGetContext() {
CacheManager cacheManager1 = null;
try {
CacheConfiguration<Long, String> cacheConfiguration = CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class, heap(10))
.build();
ManagementRegistryService managementRegistry = new DefaultManagementRegistryService(new DefaultManagementRegistryConfiguration().setCacheManagerAlias("myCM"));
cacheManager1 = CacheManagerBuilder.newCacheManagerBuilder()
.withCache("aCache", cacheConfiguration)
.using(managementRegistry)
.build(true);
ContextContainer contextContainer = managementRegistry.getContextContainer();
assertThat(contextContainer.getName()).isEqualTo("cacheManagerName");
assertThat(contextContainer.getValue()).isEqualTo("myCM");
assertThat(contextContainer.getSubContexts()).hasSize(1);
ContextContainer subcontext = contextContainer.getSubContexts().iterator().next();
assertThat(subcontext.getName()).isEqualTo("cacheName");
assertThat(subcontext.getValue()).isEqualTo("aCache");
}
finally {
if(cacheManager1 != null) cacheManager1.close();
}
}
@Test
public void descriptorOnHeapTest() {
CacheManager cacheManager1 = null;
try {
CacheConfiguration<Long, String> cacheConfiguration = CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class, heap(10))
.build();
ManagementRegistryService managementRegistry = new DefaultManagementRegistryService(new DefaultManagementRegistryConfiguration().setCacheManagerAlias("myCM"));
cacheManager1 = CacheManagerBuilder.newCacheManagerBuilder()
.withCache("aCache", cacheConfiguration)
.using(managementRegistry)
.build(true);
assertThat(managementRegistry.getCapabilities()).hasSize(4);
assertThat(new ArrayList<Capability>(managementRegistry.getCapabilities()).get(0).getName()).isEqualTo("ActionsCapability");
assertThat(new ArrayList<Capability>(managementRegistry.getCapabilities()).get(1).getName()).isEqualTo("SettingsCapability");
assertThat(new ArrayList<Capability>(managementRegistry.getCapabilities()).get(2).getName()).isEqualTo("StatisticCollectorCapability");
assertThat(new ArrayList<Capability>(managementRegistry.getCapabilities()).get(3).getName()).isEqualTo("StatisticsCapability");
assertThat(new ArrayList<Capability>(managementRegistry.getCapabilities()).get(0).getDescriptors()).hasSize(4);
Collection<? extends Descriptor> descriptors = new ArrayList<Capability>(managementRegistry.getCapabilities()).get(3).getDescriptors();
Collection<Descriptor> allDescriptors = new ArrayList<Descriptor>();
allDescriptors.addAll(ONHEAP_DESCRIPTORS);
allDescriptors.addAll(CACHE_DESCRIPTORS);
assertThat(descriptors).containsOnlyElementsOf(allDescriptors);
}
finally {
if(cacheManager1 != null) cacheManager1.close();
}
}
@Test
public void descriptorOffHeapTest() {
CacheManager cacheManager1 = null;
try {
CacheConfiguration<Long, String> cacheConfiguration = CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class, newResourcePoolsBuilder().heap(5, MB).offheap(10, MB))
.build();
ManagementRegistryService managementRegistry = new DefaultManagementRegistryService(new DefaultManagementRegistryConfiguration().setCacheManagerAlias("myCM"));
cacheManager1 = CacheManagerBuilder.newCacheManagerBuilder()
.withCache("aCache", cacheConfiguration)
.using(managementRegistry)
.build(true);
assertThat(managementRegistry.getCapabilities()).hasSize(4);
assertThat(new ArrayList<Capability>(managementRegistry.getCapabilities()).get(0).getName()).isEqualTo("ActionsCapability");
assertThat(new ArrayList<Capability>(managementRegistry.getCapabilities()).get(1).getName()).isEqualTo("SettingsCapability");
assertThat(new ArrayList<Capability>(managementRegistry.getCapabilities()).get(2).getName()).isEqualTo("StatisticCollectorCapability");
assertThat(new ArrayList<Capability>(managementRegistry.getCapabilities()).get(3).getName()).isEqualTo("StatisticsCapability");
assertThat(new ArrayList<Capability>(managementRegistry.getCapabilities()).get(0).getDescriptors()).hasSize(4);
Collection<? extends Descriptor> descriptors = new ArrayList<Capability>(managementRegistry.getCapabilities()).get(3).getDescriptors();
Collection<Descriptor> allDescriptors = new ArrayList<Descriptor>();
allDescriptors.addAll(ONHEAP_DESCRIPTORS);
allDescriptors.addAll(OFFHEAP_DESCRIPTORS);
allDescriptors.addAll(CACHE_DESCRIPTORS);
assertThat(descriptors).containsOnlyElementsOf(allDescriptors);
}
finally {
if(cacheManager1 != null) cacheManager1.close();
}
}
@Test
public void descriptorDiskStoreTest() throws URISyntaxException {
PersistentCacheManager persistentCacheManager = null;
try {
ManagementRegistryService managementRegistry = new DefaultManagementRegistryService(new DefaultManagementRegistryConfiguration().setCacheManagerAlias("myCM"));
persistentCacheManager = CacheManagerBuilder.newCacheManagerBuilder()
.with(CacheManagerBuilder.persistence(getStoragePath() + File.separator + "myData"))
.withCache("persistent-cache", CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class,
ResourcePoolsBuilder.newResourcePoolsBuilder()
.heap(10, EntryUnit.ENTRIES)
.disk(10, MemoryUnit.MB, true))
)
.using(managementRegistry)
.build(true);
assertThat(managementRegistry.getCapabilities()).hasSize(4);
assertThat(new ArrayList<Capability>(managementRegistry.getCapabilities()).get(0).getName()).isEqualTo("ActionsCapability");
assertThat(new ArrayList<Capability>(managementRegistry.getCapabilities()).get(1).getName()).isEqualTo("SettingsCapability");
assertThat(new ArrayList<Capability>(managementRegistry.getCapabilities()).get(2).getName()).isEqualTo("StatisticCollectorCapability");
assertThat(new ArrayList<Capability>(managementRegistry.getCapabilities()).get(3).getName()).isEqualTo("StatisticsCapability");
assertThat(new ArrayList<Capability>(managementRegistry.getCapabilities()).get(0).getDescriptors()).hasSize(4);
Collection<? extends Descriptor> descriptors = new ArrayList<Capability>(managementRegistry.getCapabilities()).get(3).getDescriptors();
Collection<Descriptor> allDescriptors = new ArrayList<Descriptor>();
allDescriptors.addAll(ONHEAP_DESCRIPTORS);
allDescriptors.addAll(DISK_DESCRIPTORS);
allDescriptors.addAll(CACHE_DESCRIPTORS);
assertThat(descriptors).containsOnlyElementsOf(allDescriptors);
}
finally {
if(persistentCacheManager != null) persistentCacheManager.close();
}
}
private String getStoragePath() throws URISyntaxException {
return getClass().getClassLoader().getResource(".").toURI().getPath();
}
@Test
public void testCanGetCapabilities() {
CacheConfiguration<Long, String> cacheConfiguration = CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class, heap(10))
.build();
ManagementRegistryService managementRegistry = new DefaultManagementRegistryService(new DefaultManagementRegistryConfiguration().setCacheManagerAlias("myCM"));
CacheManager cacheManager1 = CacheManagerBuilder.newCacheManagerBuilder()
.withCache("aCache", cacheConfiguration)
.using(managementRegistry)
.build(true);
assertThat(managementRegistry.getCapabilities()).hasSize(4);
assertThat(new ArrayList<Capability>(managementRegistry.getCapabilities()).get(0).getName()).isEqualTo("ActionsCapability");
assertThat(new ArrayList<Capability>(managementRegistry.getCapabilities()).get(1).getName()).isEqualTo("SettingsCapability");
assertThat(new ArrayList<Capability>(managementRegistry.getCapabilities()).get(2).getName()).isEqualTo("StatisticCollectorCapability");
assertThat(new ArrayList<Capability>(managementRegistry.getCapabilities()).get(3).getName()).isEqualTo("StatisticsCapability");
assertThat(new ArrayList<Capability>(managementRegistry.getCapabilities()).get(0).getDescriptors()).hasSize(4);
assertThat(new ArrayList<Capability>(managementRegistry.getCapabilities()).get(3).getDescriptors()).hasSize(ONHEAP_DESCRIPTORS.size() + CACHE_DESCRIPTORS.size());
assertThat(new ArrayList<Capability>(managementRegistry.getCapabilities()).get(0).getCapabilityContext().getAttributes()).hasSize(2);
assertThat(new ArrayList<Capability>(managementRegistry.getCapabilities()).get(3).getCapabilityContext().getAttributes()).hasSize(2);
cacheManager1.close();
}
@Test
public void testCanGetStats() {
String queryStatisticName = "Cache:HitCount";
CacheConfiguration<Long, String> cacheConfiguration = CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class, heap(10))
.build();
ManagementRegistryService managementRegistry = new DefaultManagementRegistryService(new DefaultManagementRegistryConfiguration().setCacheManagerAlias("myCM"));
CacheManager cacheManager1 = CacheManagerBuilder.newCacheManagerBuilder()
.withCache("aCache1", cacheConfiguration)
.withCache("aCache2", cacheConfiguration)
.using(managementRegistry)
.build(true);
Context context1 = Context.empty()
.with("cacheManagerName", "myCM")
.with("cacheName", "aCache1");
Context context2 = Context.empty()
.with("cacheManagerName", "myCM")
.with("cacheName", "aCache2");
Cache<Long, String> cache1 = cacheManager1.getCache("aCache1", Long.class, String.class);
Cache<Long, String> cache2 = cacheManager1.getCache("aCache2", Long.class, String.class);
cache1.put(1L, "one");
cache2.put(3L, "three");
cache1.get(1L);
cache1.get(2L);
cache2.get(3L);
cache2.get(4L);
Builder builder1 = managementRegistry.withCapability("StatisticsCapability")
.queryStatistic(queryStatisticName)
.on(context1);
ContextualStatistics counters = getResultSet(builder1, context1, null, queryStatisticName).getResult(context1);
Number counterHistory1 = counters.getStatistic(queryStatisticName);
assertThat(counters.size()).isEqualTo(1);
assertThat(counterHistory1.longValue()).isEqualTo(1L);
Builder builder2 = managementRegistry.withCapability("StatisticsCapability")
.queryStatistic(queryStatisticName)
.on(context1)
.on(context2);
ResultSet<ContextualStatistics> allCounters = getResultSet(builder2, context1, context2, queryStatisticName);
assertThat(allCounters.size()).isEqualTo(2);
assertThat(allCounters.getResult(context1).size()).isEqualTo(1);
assertThat(allCounters.getResult(context2).size()).isEqualTo(1);
assertThat(allCounters.getResult(context1).getStatistic(queryStatisticName).longValue()).isEqualTo(1L);
assertThat(allCounters.getResult(context2).getStatistic(queryStatisticName).longValue()).isEqualTo(1L);
cacheManager1.close();
}
private static ResultSet<ContextualStatistics> getResultSet(Builder builder, Context context1, Context context2, String statisticsName) {
ResultSet<ContextualStatistics> counters = null;
while(!Thread.currentThread().isInterrupted()) //wait till Counter history(s) is initialized and contains values.
{
counters = builder.build().execute();
ContextualStatistics statisticsContext1 = counters.getResult(context1);
Number counterContext1 = statisticsContext1.getStatistic(statisticsName);
if(context2 != null)
{
ContextualStatistics statisticsContext2 = counters.getResult(context2);
Number counterHistoryContext2 = statisticsContext2.getStatistic(statisticsName);
if(counterHistoryContext2.longValue() > 0 &&
counterContext1.longValue() > 0)
{
break;
}
}
else
{
if(counterContext1.longValue() > 0)
{
break;
}
}
}
return counters;
}
@Test
public void testCall() throws ExecutionException {
CacheManager cacheManager1 = null;
try {
CacheConfiguration<Long, String> cacheConfiguration = CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class, heap(10))
.build();
ManagementRegistryService managementRegistry = new DefaultManagementRegistryService(new DefaultManagementRegistryConfiguration().setCacheManagerAlias("myCM"));
cacheManager1 = CacheManagerBuilder.newCacheManagerBuilder()
.withCache("aCache1", cacheConfiguration)
.withCache("aCache2", cacheConfiguration)
.using(managementRegistry)
.build(true);
Context context = Context.empty()
.with("cacheManagerName", "myCM")
.with("cacheName", "aCache1");
cacheManager1.getCache("aCache1", Long.class, String.class).put(1L, "1");
assertThat(cacheManager1.getCache("aCache1", Long.class, String.class).get(1L)).isEqualTo("1");
ContextualReturn<?> result = managementRegistry.withCapability("ActionsCapability")
.call("clear")
.on(context)
.build()
.execute()
.getSingleResult();
assertThat(result.hasExecuted()).isTrue();
assertThat(result.getValue()).isNull();
assertThat(cacheManager1.getCache("aCache1", Long.class, String.class).get(1L)).isNull();
}
finally {
if(cacheManager1 != null) cacheManager1.close();
}
}
@Test
public void testCallOnInexistignContext() throws ExecutionException {
CacheManager cacheManager1 = null;
try {
CacheConfiguration<Long, String> cacheConfiguration = CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class, heap(10))
.build();
ManagementRegistryService managementRegistry = new DefaultManagementRegistryService(new DefaultManagementRegistryConfiguration().setCacheManagerAlias("myCM"));
cacheManager1 = CacheManagerBuilder.newCacheManagerBuilder()
.withCache("aCache1", cacheConfiguration)
.withCache("aCache2", cacheConfiguration)
.using(managementRegistry)
.build(true);
Context inexisting = Context.empty()
.with("cacheManagerName", "myCM2")
.with("cacheName", "aCache2");
ResultSet<? extends ContextualReturn<?>> results = managementRegistry.withCapability("ActionsCapability")
.call("clear")
.on(inexisting)
.build()
.execute();
assertThat(results.size()).isEqualTo(1);
assertThat(results.getSingleResult().hasExecuted()).isFalse();
expectedException.expect(NoSuchElementException.class);
results.getSingleResult().getValue();
}
finally {
if(cacheManager1 != null) cacheManager1.close();
}
}
@BeforeClass
public static void loadStatsUtil() throws ClassNotFoundException {
ONHEAP_DESCRIPTORS.add(new StatisticDescriptor("OnHeap:EvictionCount" , "COUNTER"));
ONHEAP_DESCRIPTORS.add(new StatisticDescriptor("OnHeap:ExpirationCount" , "COUNTER"));
ONHEAP_DESCRIPTORS.add(new StatisticDescriptor("OnHeap:MissCount" , "COUNTER"));
ONHEAP_DESCRIPTORS.add(new StatisticDescriptor("OnHeap:MappingCount" , "COUNTER"));
ONHEAP_DESCRIPTORS.add(new StatisticDescriptor("OnHeap:OccupiedByteSize" , "SIZE"));
ONHEAP_DESCRIPTORS.add(new StatisticDescriptor("OnHeap:HitCount" , "COUNTER"));
ONHEAP_DESCRIPTORS.add(new StatisticDescriptor("OnHeap:PutCount" , "COUNTER"));
ONHEAP_DESCRIPTORS.add(new StatisticDescriptor("OnHeap:UpdateCount" , "COUNTER"));
ONHEAP_DESCRIPTORS.add(new StatisticDescriptor("OnHeap:RemovalCount" , "COUNTER"));
OFFHEAP_DESCRIPTORS.add(new StatisticDescriptor("OffHeap:MissCount", "COUNTER"));
OFFHEAP_DESCRIPTORS.add(new StatisticDescriptor("OffHeap:OccupiedByteSize", "SIZE"));
OFFHEAP_DESCRIPTORS.add(new StatisticDescriptor("OffHeap:AllocatedByteSize", "SIZE"));
OFFHEAP_DESCRIPTORS.add(new StatisticDescriptor("OffHeap:MappingCount", "COUNTER"));
OFFHEAP_DESCRIPTORS.add(new StatisticDescriptor("OffHeap:EvictionCount", "COUNTER"));
OFFHEAP_DESCRIPTORS.add(new StatisticDescriptor("OffHeap:ExpirationCount", "COUNTER"));
OFFHEAP_DESCRIPTORS.add(new StatisticDescriptor("OffHeap:MaxMappingCount", "COUNTER"));
OFFHEAP_DESCRIPTORS.add(new StatisticDescriptor("OffHeap:HitCount", "COUNTER"));
OFFHEAP_DESCRIPTORS.add(new StatisticDescriptor("OffHeap:PutCount", "COUNTER"));
OFFHEAP_DESCRIPTORS.add(new StatisticDescriptor("OffHeap:UpdateCount", "COUNTER"));
OFFHEAP_DESCRIPTORS.add(new StatisticDescriptor("OffHeap:RemovalCount", "COUNTER"));
DISK_DESCRIPTORS.add(new StatisticDescriptor("Disk:MaxMappingCount", "COUNTER"));
DISK_DESCRIPTORS.add(new StatisticDescriptor("Disk:OccupiedByteSize", "SIZE"));
DISK_DESCRIPTORS.add(new StatisticDescriptor("Disk:AllocatedByteSize", "SIZE"));
DISK_DESCRIPTORS.add(new StatisticDescriptor("Disk:HitCount", "COUNTER"));
DISK_DESCRIPTORS.add(new StatisticDescriptor("Disk:EvictionCount", "COUNTER"));
DISK_DESCRIPTORS.add(new StatisticDescriptor("Disk:ExpirationCount", "COUNTER"));
DISK_DESCRIPTORS.add(new StatisticDescriptor("Disk:MissCount", "COUNTER"));
DISK_DESCRIPTORS.add(new StatisticDescriptor("Disk:MappingCount", "COUNTER"));
DISK_DESCRIPTORS.add(new StatisticDescriptor("Disk:PutCount", "COUNTER"));
DISK_DESCRIPTORS.add(new StatisticDescriptor("Disk:UpdateCount", "COUNTER"));
DISK_DESCRIPTORS.add(new StatisticDescriptor("Disk:RemovalCount", "COUNTER"));
CACHE_DESCRIPTORS.add(new StatisticDescriptor("Cache:HitCount", "COUNTER"));
CACHE_DESCRIPTORS.add(new StatisticDescriptor("Cache:MissCount", "COUNTER"));
CACHE_DESCRIPTORS.add(new StatisticDescriptor("Cache:PutCount", "COUNTER"));
CACHE_DESCRIPTORS.add(new StatisticDescriptor("Cache:UpdateCount", "COUNTER"));
CACHE_DESCRIPTORS.add(new StatisticDescriptor("Cache:RemovalCount", "COUNTER"));
CACHE_DESCRIPTORS.add(new StatisticDescriptor("Cache:EvictionCount", "COUNTER"));
CACHE_DESCRIPTORS.add(new StatisticDescriptor("Cache:ExpirationCount", "COUNTER"));
}
}