org.hyperic.hq.bizapp.server.session.HQInternalService.java Source code

Java tutorial

Introduction

Here is the source code for org.hyperic.hq.bizapp.server.session.HQInternalService.java

Source

/*
 * 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();
    }
}