/* * RHQ Management Platform * Copyright (C) 2005-2013 Red Hat, Inc. * All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation version 2 of the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ package org.rhq.enterprise.server.alert.engine.mbean; import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import javax.ejb.ConcurrencyManagement; import javax.ejb.ConcurrencyManagementType; import javax.ejb.LocalBean; import javax.ejb.Singleton; import javax.ejb.Startup; import javax.ejb.TransactionAttribute; import javax.ejb.TransactionAttributeType; import javax.management.MBeanServer; import javax.management.MBeanServerInvocationHandler; import javax.management.ObjectName; import org.rhq.core.util.ObjectNameFactory; import org.rhq.enterprise.server.alert.engine.internal.AlertConditionCacheCoordinator; import org.rhq.enterprise.server.util.JMXUtil; import org.rhq.enterprise.server.util.LookupUtil; /** * An MBean that exposes various structures contained with the AlertConditionCache * * @author Joseph Marques */ @Singleton @Startup @LocalBean @ConcurrencyManagement(ConcurrencyManagementType.BEAN) @TransactionAttribute(TransactionAttributeType.SUPPORTS) public class AlertConditionCacheMonitor implements AlertConditionCacheMonitorMBean { private static final ObjectName OBJECT_NAME = ObjectNameFactory.create("rhq:service=AlertConditionCacheMonitor"); public AtomicInteger availabilityCacheElementMatches = new AtomicInteger(); public AtomicInteger availabilityDurationCacheElementMatches = new AtomicInteger(); public AtomicInteger eventCacheElementMatches = new AtomicInteger(); public AtomicInteger measurementCacheElementMatches = new AtomicInteger(); public AtomicInteger resourceConfigurationCacheElementMatches = new AtomicInteger(); public AtomicInteger operationCacheElementMatches = new AtomicInteger(); public AtomicInteger calltimeCacheElementMatches = new AtomicInteger(); public AtomicInteger driftCacheElementMatches = new AtomicInteger(); public AtomicInteger totalCacheElementMatches = new AtomicInteger(); public AtomicLong availabilityProcessingTime = new AtomicLong(); public AtomicLong availabilityDurationProcessingTime = new AtomicLong(); public AtomicLong eventProcessingTime = new AtomicLong(); public AtomicLong measurementProcessingTime = new AtomicLong(); public AtomicLong resourceConfigurationProcessingTime = new AtomicLong(); public AtomicLong operationProcessingTime = new AtomicLong(); public AtomicLong calltimeProcessingTime = new AtomicLong(); public AtomicLong driftProcessingTime = new AtomicLong(); public AtomicLong totalProcessingTime = new AtomicLong(); private static MBeanServer mbeanServer; private static ObjectName objectName; private static AlertConditionCacheMonitorMBean proxy; public static AlertConditionCacheMonitorMBean getMBean() { if (proxy == null) { if (objectName != null) { proxy = (AlertConditionCacheMonitorMBean) MBeanServerInvocationHandler.newProxyInstance(mbeanServer, objectName, AlertConditionCacheMonitorMBean.class, false); } else { // create a local object proxy = new AlertConditionCacheMonitor(); } } return proxy; } public int getAvailabilityCacheElementCount() { return AlertConditionCacheCoordinator.getInstance().getCacheSize( AlertConditionCacheCoordinator.Cache.AvailabilityCache); } public int getAvailabilityDurationCacheElementCount() { return AlertConditionCacheCoordinator.getInstance().getCacheSize( AlertConditionCacheCoordinator.Cache.AvailabilityDurationCache); } public int getEventCacheElementCount() { return AlertConditionCacheCoordinator.getInstance().getCacheSize( AlertConditionCacheCoordinator.Cache.EventsCache); } public int getMeasurementCacheElementCount() { return AlertConditionCacheCoordinator.getInstance().getCacheSize( AlertConditionCacheCoordinator.Cache.MeasurementDataCache) + AlertConditionCacheCoordinator.getInstance().getCacheSize( AlertConditionCacheCoordinator.Cache.MeasurementTraitCache); } public int getResourceConfigurationCacheElementCount() { return AlertConditionCacheCoordinator.getInstance().getCacheSize( AlertConditionCacheCoordinator.Cache.ResourceConfigurationCache); } public int getOperationCacheElementCount() { return AlertConditionCacheCoordinator.getInstance().getCacheSize( AlertConditionCacheCoordinator.Cache.ResourceOperationCache); } public int getCallTimeCacheElementCount() { return AlertConditionCacheCoordinator.getInstance().getCacheSize( AlertConditionCacheCoordinator.Cache.CallTimeDataCache); } public int getDriftCacheElementCount() { return AlertConditionCacheCoordinator.getInstance().getCacheSize( AlertConditionCacheCoordinator.Cache.DriftCache); } /** * Takes all the counts from {@link #getCacheCounts()} and returns the sum. */ public int getTotalCacheElementCount() { Map<String, Integer> map = getCacheCounts(); int total = 0; for (Integer count : map.values()) { total += count; } return total; } public Map<String, Integer> getCacheCounts() { return AlertConditionCacheCoordinator.getInstance().getCacheCounts(); } public int getAvailabilityCacheElementMatches() { return availabilityCacheElementMatches.get(); } public int getAvailabilityDurationCacheElementMatches() { return availabilityDurationCacheElementMatches.get(); } public int getEventCacheElementMatches() { return eventCacheElementMatches.get(); } public int getMeasurementCacheElementMatches() { return measurementCacheElementMatches.get(); } public int getResourceConfigurationCacheElementMatches() { return resourceConfigurationCacheElementMatches.get(); } public int getOperationCacheElementMatches() { return operationCacheElementMatches.get(); } public int getCallTimeCacheElementMatches() { return calltimeCacheElementMatches.get(); } public int getDriftCacheElementMatches() { return driftCacheElementMatches.get(); } public int getTotalCacheElementMatches() { return totalCacheElementMatches.get(); } public void incrementAvailabilityCacheElementMatches(int matches) { availabilityCacheElementMatches.addAndGet(matches); totalCacheElementMatches.addAndGet(matches); } public void incrementAvailabilityDurationCacheElementMatches(int matches) { availabilityDurationCacheElementMatches.addAndGet(matches); totalCacheElementMatches.addAndGet(matches); } public void incrementEventCacheElementMatches(int matches) { eventCacheElementMatches.addAndGet(matches); totalCacheElementMatches.addAndGet(matches); } public void incrementResourceConfigurationCacheElementMatches(int matches) { resourceConfigurationCacheElementMatches.addAndGet(matches); totalCacheElementMatches.addAndGet(matches); } public void incrementMeasurementCacheElementMatches(int matches) { measurementCacheElementMatches.addAndGet(matches); totalCacheElementMatches.addAndGet(matches); } public void incrementOperationCacheElementMatches(int matches) { operationCacheElementMatches.addAndGet(matches); totalCacheElementMatches.addAndGet(matches); } public void incrementCallTimeCacheElementMatches(int matches) { calltimeCacheElementMatches.addAndGet(matches); totalCacheElementMatches.addAndGet(matches); } public void incrementDriftCacheElementMatches(int matches) { driftCacheElementMatches.addAndGet(matches); totalCacheElementMatches.addAndGet(matches); } public long getAvailabilityProcessingTime() { return availabilityProcessingTime.get(); } public long getAvailabilityDurationProcessingTime() { return availabilityDurationProcessingTime.get(); } public long getEventProcessingTime() { return eventProcessingTime.get(); } public long getMeasurementProcessingTime() { return measurementProcessingTime.get(); } public long getOperationProcessingTime() { return operationProcessingTime.get(); } public long getCallTimeProcessingTime() { return calltimeProcessingTime.get(); } public long getDriftProcessingTime() { return driftProcessingTime.get(); } public long getTotalProcessingTime() { return totalProcessingTime.get(); } public void incrementAvailabilityProcessingTime(long moreMillis) { availabilityProcessingTime.addAndGet(moreMillis); totalProcessingTime.addAndGet(moreMillis); } public void incrementAvailabilityDurationProcessingTime(long moreMillis) { availabilityDurationProcessingTime.addAndGet(moreMillis); totalProcessingTime.addAndGet(moreMillis); } public void incrementEventProcessingTime(long moreMillis) { eventProcessingTime.addAndGet(moreMillis); totalProcessingTime.addAndGet(moreMillis); } public void incrementResourceConfigurationProcessingTime(long moreMillis) { resourceConfigurationProcessingTime.addAndGet(moreMillis); totalProcessingTime.addAndGet(moreMillis); } public void incrementMeasurementProcessingTime(long moreMillis) { measurementProcessingTime.addAndGet(moreMillis); totalProcessingTime.addAndGet(moreMillis); } public void incrementOperationProcessingTime(long moreMillis) { operationProcessingTime.addAndGet(moreMillis); totalProcessingTime.addAndGet(moreMillis); } public void incrementCallTimeProcessingTime(long moreMillis) { calltimeProcessingTime.addAndGet(moreMillis); totalProcessingTime.addAndGet(moreMillis); } public void incrementDriftProcessingTime(long moreMillis) { driftProcessingTime.addAndGet(moreMillis); totalProcessingTime.addAndGet(moreMillis); } public void reloadCaches() { LookupUtil.getAlertConditionCacheManager().reloadAllCaches(); } @PostConstruct private void init() { JMXUtil.registerMBean(this, OBJECT_NAME); mbeanServer = JMXUtil.getPlatformMBeanServer(); objectName = OBJECT_NAME; } @PreDestroy private void destroy() { mbeanServer = null; objectName = null; JMXUtil.unregisterMBeanQuietly(OBJECT_NAME); } }