/* * NOTE: This copyright does *not* cover user programs that use HQ * program services by normal system calls through the application * program interfaces provided as part of the Hyperic Plug-in Development * Kit or the Hyperic Client Development Kit - this is merely considered * normal use of the program, and does *not* fall under the heading of * "derived work". * * Copyright (C) [2004, 2005, 2006], Hyperic, Inc. * This file is part of HQ. * * HQ is free software; you can redistribute it and/or modify * it under the terms version 2 of the GNU General Public License as * published by the Free Software Foundation. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA. */ package org.hyperic.hq.bizapp.server.session; import java.util.ArrayList; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.hyperic.hq.appdef.server.session.AgentConnections; import org.hyperic.hq.appdef.shared.AgentManager; import org.hyperic.hq.appdef.shared.PlatformManager; import org.hyperic.hq.measurement.server.session.CollectionSummary; import org.hyperic.hq.measurement.server.session.ReportStatsCollector; import org.hyperic.hq.measurement.shared.MeasurementManager; import org.hyperic.hq.zevents.ZeventEnqueuer; import org.hyperic.util.timer.StopWatch; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jmx.export.annotation.ManagedResource; import org.springframework.stereotype.Service; @Service @ManagedResource("hyperic.jmx:name=HQInternal") public class HQInternalService implements HQInternalServiceMBean { private Log log = LogFactory.getLog(HQInternalService.class); private AgentManager agentManager; private MeasurementManager measurementManager; private PlatformManager platformManager; private ZeventEnqueuer zEventManager; private ReportStatsCollector reportStatsCollector; @Autowired public HQInternalService(AgentManager agentManager, MeasurementManager measurementManager, PlatformManager platformManager, ZeventEnqueuer zEventManager, ReportStatsCollector reportStatsCollector) { this.agentManager = agentManager; this.measurementManager = measurementManager; this.platformManager = platformManager; this.zEventManager = zEventManager; this.reportStatsCollector = reportStatsCollector; } public double getMetricInsertsPerMinute() { double val = reportStatsCollector.getCollector().valPerTimestamp(); return val * 1000.0 * 60.0; } public int getAgentCount() { final ClassLoader cl = agentManager.getClass().getClassLoader(); final AtomicInteger atInt = new AtomicInteger(-1); final AgentManager aMan = agentManager; final Runnable runner = new Runnable() { public void run() { atInt.set(aMan.getAgentCountUsed()); } }; runInContext(runner, cl); return atInt.get(); } public double getMetricsCollectedPerMinute() { final ClassLoader cl = agentManager.getClass().getClassLoader(); final List<CollectionSummary> vals = new ArrayList<CollectionSummary>(); final Runnable runner = new Runnable() { public void run() { vals.addAll(measurementManager.findMetricCountSummaries()); } }; double total = -1.0; runInContext(runner, cl); total = 0.0; for (CollectionSummary s : vals) { int interval = s.getInterval(); if (interval == 0) { continue; } total += (float) s.getTotal() / (float) interval; } return total; } public int getPlatformCount() { final ClassLoader cl = agentManager.getClass().getClassLoader(); final AtomicInteger atInt = new AtomicInteger(-1); final PlatformManager pMan = platformManager; final Runnable runner = new Runnable() { public void run() { atInt.set(pMan.getPlatformCount().intValue()); } }; runInContext(runner, cl); return atInt.get(); } // HE-394, need to run in the context that our web container is bound to // based on http://opensource.atlassian.com/projects/hibernate/browse/HHH-3529 // when we upgrade to hibernate 3.5 this may not be necessary private void runInContext(Runnable runner, ClassLoader cl) { Thread thread = new Thread(runner); thread.setContextClassLoader(cl); thread.start(); try { // 5 min timeout - should not take more than 5 mins to grab a value final StopWatch watch = new StopWatch(); final long timeout = 5*60*1000; thread.join(timeout); if (watch.getElapsed() >= timeout) { log.warn("timeout when running job in a class loader context. This could mean that the db is hung " + watch); } } catch (InterruptedException e) { log.error(e,e); } } public long getAgentRequests() { return AgentConnections.getInstance().getTotalConnections(); } public int getAgentConnections() { return AgentConnections.getInstance().getNumConnected(); } public long getZeventMaxWait() { return zEventManager.getMaxTimeInQueue(); } public long getZeventsProcessed() { return zEventManager.getZeventsProcessed(); } public long getZeventQueueSize() { return zEventManager.getQueueSize(); } }