/* * 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.measurement.instrumentation; 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.EJB; 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.storage.StorageClientManager; import org.rhq.enterprise.server.util.JMXUtil; import org.rhq.enterprise.server.util.LookupUtil; /** * @author Greg Hinkle */ @Singleton @Startup @LocalBean @ConcurrencyManagement(ConcurrencyManagementType.BEAN) @TransactionAttribute(TransactionAttributeType.SUPPORTS) public class MeasurementMonitor implements MeasurementMonitorMBean { private static final ObjectName OBJECT_NAME = ObjectNameFactory.create("rhq:service=MeasurementMonitor"); @EJB private StorageClientManager storageClientManager; private AtomicLong measurementInsertTime = new AtomicLong(); private AtomicLong measurementsInserted = new AtomicLong(); private AtomicLong callTimeInsertTime = new AtomicLong(); private AtomicLong calltimeValuesInserted = new AtomicLong(); private AtomicLong availabilityInsertTime = new AtomicLong(); private AtomicLong availabilitiesInserted = new AtomicLong(); private AtomicLong changesOnlyAvailabilityReports = new AtomicLong(); private AtomicLong fullAvailabilityReports = new AtomicLong(); private AtomicLong purgeTime = new AtomicLong(); private AtomicLong baselineCalculationTime = new AtomicLong(); // all of the purgedXYZ attributes will contain the number of purged items during the LAST purge // they are not an aggregation over multiple purges - it only tracks the LAST purge that was run private AtomicLong purgedAlerts = new AtomicLong(); private AtomicLong purgedAlertConditions = new AtomicLong(); private AtomicLong purgedAlertNotifications = new AtomicLong(); private AtomicLong purgedAvailabilities = new AtomicLong(); private AtomicLong purgedCallTimeData = new AtomicLong(); private AtomicLong purgedEvents = new AtomicLong(); private AtomicLong purgedMeasurementTraits = new AtomicLong(); private static MBeanServer mbeanServer; private static ObjectName objectName; private static MeasurementMonitorMBean proxy; public static MeasurementMonitorMBean getMBean() { if (proxy == null) { if (objectName != null) { proxy = (MeasurementMonitorMBean) MBeanServerInvocationHandler.newProxyInstance(mbeanServer, objectName, MeasurementMonitorMBean.class, false); } else { // create a local object proxy = new MeasurementMonitor(); } } return proxy; } public long getMeasurementInsertTime() { return measurementInsertTime.get(); } public void incrementMeasurementInsertTime(long delta) { this.measurementInsertTime.addAndGet(delta); } public long getMeasurementsInserted() { return measurementsInserted.get(); } public void incrementMeasurementsInserted(long delta) { this.measurementsInserted.addAndGet(delta); } public long getCalltimeValuesInserted() { return calltimeValuesInserted.get(); } public void incrementCalltimeValuesInserted(long delta) { this.calltimeValuesInserted.addAndGet(delta); } public long getCallTimeInsertTime() { return callTimeInsertTime.get(); } public void incrementCallTimeInsertTime(long delta) { this.callTimeInsertTime.addAndGet(delta); } public long getAvailabilityInsertTime() { return availabilityInsertTime.get(); } public void incrementAvailabilityInsertTime(long delta) { this.availabilityInsertTime.addAndGet(delta); } public long getAvailabilitiesInserted() { return availabilitiesInserted.get(); } public void incrementAvailabilitiesInserted(long delta) { this.availabilitiesInserted.addAndGet(delta); } public long getChangesOnlyAvailabilityReports() { return changesOnlyAvailabilityReports.get(); } public long getFullAvailabilityReports() { return fullAvailabilityReports.get(); } public long getTotalAvailabilityReports() { return getChangesOnlyAvailabilityReports() + getFullAvailabilityReports(); } public void incrementAvailabilityReports(boolean changesOnlyReport) { if (changesOnlyReport) { this.changesOnlyAvailabilityReports.incrementAndGet(); } else { this.fullAvailabilityReports.incrementAndGet(); } } public int getScheduledMeasurementsPerMinute() { return LookupUtil.getMeasurementScheduleManager().getScheduledMeasurementsPerMinute(); } public long getMeasurementCompressionTime() { return storageClientManager.getMetricsServer().getAggregationManager().getTotalAggregationTime(); } public long getPurgeTime() { return purgeTime.get(); } public void incrementPurgeTime(long delta) { this.purgeTime.addAndGet(delta); } public long getBaselineCalculationTime() { return this.baselineCalculationTime.get(); } public void incrementBaselineCalculationTime(long delta) { this.baselineCalculationTime.addAndGet(delta); } public long getPurgedAlerts() { return this.purgedAlerts.get(); } public void setPurgedAlerts(long delta) { this.purgedAlerts.set(delta); } public long getPurgedAlertConditions() { return this.purgedAlertConditions.get(); } public void setPurgedAlertConditions(long delta) { this.purgedAlertConditions.set(delta); } public long getPurgedAlertNotifications() { return this.purgedAlertNotifications.get(); } public void setPurgedAlertNotifications(long delta) { this.purgedAlertNotifications.set(delta); } public long getPurgedAvailabilities() { return this.purgedAvailabilities.get(); } public void setPurgedAvailabilities(long delta) { this.purgedAvailabilities.set(delta); } public long getPurgedCallTimeData() { return this.purgedCallTimeData.get(); } public void setPurgedCallTimeData(long delta) { this.purgedCallTimeData.set(delta); } public long getPurgedEvents() { return this.purgedEvents.get(); } public void setPurgedEvents(long delta) { this.purgedEvents.set(delta); } public long getPurgedMeasurementTraits() { return this.purgedMeasurementTraits.get(); } public void setPurgedMeasurementTraits(long delta) { this.purgedMeasurementTraits.set(delta); } @Override public int getAggregationBatchSize() { return storageClientManager.getAggregationBatchSize(); } @Override public void setAggregationBatchSize(int size) { storageClientManager.setAggregationBatchSize(size); } @Override public int getAggregationParallelism() { return storageClientManager.getAggregationParallelism(); } @Override public void setAggregationParallelism(int parallelism) { storageClientManager.setAggregationParallelism(parallelism); } @Override public int getAggregationWorkers() { return storageClientManager.getAggregationWorkers(); } @Override public void setAggregationWorkers(int numWorkers) { storageClientManager.setAggregationWorkers(numWorkers); } @Override public int getRawDataAgeLimit() { return storageClientManager.getRawDataAgeLimit(); } @Override public void setRawDataAgeLimit(int ageLimit) { storageClientManager.setRawDataAgeLimit(ageLimit); } @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); } }