package org.stagemonitor.ehcache;
import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Ehcache;
import org.stagemonitor.core.CorePlugin;
import org.stagemonitor.core.StagemonitorPlugin;
import org.stagemonitor.configuration.ConfigurationOption;
import org.stagemonitor.core.elasticsearch.ElasticsearchClient;
import org.stagemonitor.core.grafana.GrafanaClient;
import org.stagemonitor.core.metrics.metrics2.Metric2Registry;
public class EhCachePlugin extends StagemonitorPlugin {
private final ConfigurationOption<String> ehCacheNameOption = ConfigurationOption.stringOption()
.key("stagemonitor.ehcache.name")
.dynamic(false)
.label("EhCache cache name")
.description("The name of the ehcache to instrument (the value of the `name` attribute of the " +
"`ehcache` tag in ehcache.xml)")
.defaultValue(null)
.configurationCategory("EhCache Plugin")
.build();
private final ConfigurationOption<Boolean> timeGet = ConfigurationOption.booleanOption()
.key("stagemonitor.ehcache.get.timer")
.dynamic(true)
.label("Create timer for cache gets")
.description("If set to true, a timer for each cache will be created which measures the time to get a " +
"element from the cache. If you have a lot of caches, that could lead to a increased network and " +
"disk utilisation. If set to false, only a meter (which measures the rate) will be created")
.defaultValue(false)
.configurationCategory("EhCache Plugin")
.build();
private Metric2Registry metricRegistry;
@Override
public void initializePlugin(StagemonitorPlugin.InitArguments initArguments) {
this.metricRegistry = initArguments.getMetricRegistry();
final EhCachePlugin ehCacheConfig = initArguments.getPlugin(EhCachePlugin.class);
monitorCaches(CacheManager.getCacheManager(ehCacheConfig.ehCacheNameOption.getValue()));
final CorePlugin corePlugin = initArguments.getPlugin(CorePlugin.class);
ElasticsearchClient elasticsearchClient = corePlugin.getElasticsearchClient();
final GrafanaClient grafanaClient = corePlugin.getGrafanaClient();
if (corePlugin.isReportToGraphite()) {
elasticsearchClient.sendGrafana1DashboardAsync("grafana/Grafana1GraphiteEhCache.json");
}
if (corePlugin.isReportToElasticsearch()) {
grafanaClient.sendGrafanaDashboardAsync("grafana/ElasticsearchEhCache.json");
elasticsearchClient.sendClassPathRessourceBulkAsync("kibana/EhCache.bulk");
}
}
/**
* You can use this method to manually register a {@link CacheManager} that should be monitored by stagemonitor.
* <p>
* Example:
* <pre>
* Stagemonitor.getPlugin(EhCachePlugin.class).monitorCaches(yourCacheManager);
* </pre>
*
* @param cacheManager The CacheManager to monitor
*/
public void monitorCaches(CacheManager cacheManager) {
if (cacheManager == null) {
return;
}
for (String cacheName : cacheManager.getCacheNames()) {
monitorCache(cacheManager.getCache(cacheName));
}
}
/**
* You can use this method to manually register a {@link Cache} that should be monitored by stagemonitor.
* <p>
* Example:
* <pre>
* Stagemonitor.getPlugin(EhCachePlugin.class).monitorCache(yourCache);
* </pre>
*
* @param cache The Cache to monitor
*/
public void monitorCache(Ehcache cache) {
cache.setStatisticsEnabled(true);
final StagemonitorCacheUsageListener cacheUsageListener = new StagemonitorCacheUsageListener(cache.getName(),
metricRegistry, timeGet.getValue());
cache.registerCacheUsageListener(cacheUsageListener);
metricRegistry.registerAny(new EhCacheMetricSet(cache.getName(), cache, cacheUsageListener));
}
@Override
public void registerWidgetMetricTabPlugins(WidgetMetricTabPluginsRegistry widgetMetricTabPluginsRegistry) {
widgetMetricTabPluginsRegistry.addWidgetMetricTabPlugin("/stagemonitor/static/tabs/metrics/ehcache-metrics");
}
}