/* * NOTE: This copyright does *not* cover user programs that use Hyperic * 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-2011], VMware, Inc. * This file is part of Hyperic. * * Hyperic 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.plugin.cloudfoundry.collector; import java.net.MalformedURLException; import java.util.List; import java.util.Properties; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.hyperic.hq.plugin.cloudfoundry.util.CloudFoundryProxy; import org.hyperic.hq.product.Collector; import org.hyperic.hq.product.Metric; import org.hyperic.hq.product.PluginException; import org.cloudfoundry.client.lib.ApplicationStats; import org.cloudfoundry.client.lib.CloudApplication; import org.cloudfoundry.client.lib.CloudInfo; import org.cloudfoundry.client.lib.InstanceStats; public class CloudApplicationCollector extends Collector { private static final Log _log = LogFactory.getLog(CloudApplicationCollector.class); @Override protected void init() throws PluginException { Properties props = getProperties(); if (_log.isDebugEnabled()) { _log.debug("[init] props=" + props); } // validate configuration CloudFoundryProxy cf = new CloudFoundryProxy(props); super.init(); } @Override public void collect() { try { Properties props = getProperties(); String appName = props.getProperty("app"); CloudFoundryProxy cf = new CloudFoundryProxy(props); CloudApplication app = cf.getApplication(appName); if (app == null) { setAvailability(false); } else { setAvailability(app); double totalMemory = 0; double percentMemory = 0; double totalDisk = 0; double percentDisk = 0; double totalCpu = 0; double maxUptime = 0; ApplicationStats stats = cf.getApplicationStats(appName); List<InstanceStats> records = stats.getRecords(); for (InstanceStats stat : records) { InstanceStats.Usage usage = stat.getUsage(); if (usage != null) { double memory = usage.getMem(); long memoryQuota = stat.getMemQuota(); double disk = usage.getDisk(); double diskQuota = (double) stat.getDiskQuota(); double cpu = usage.getCpu() / 100d; // FIXME: the cloud foundry api is returning the value // in KB, so need to convert to the proper units memory = memory * 1024; totalMemory += memory; percentMemory += memory/memoryQuota; totalDisk += disk; percentDisk += disk/diskQuota; totalCpu += cpu; } if (stat.getUptime() > maxUptime) { maxUptime = stat.getUptime(); } } if (!records.isEmpty()) { int recordSize = records.size(); totalMemory = totalMemory/recordSize; percentMemory = percentMemory/recordSize; totalDisk = totalDisk/recordSize; percentDisk = percentDisk/recordSize; totalCpu = totalCpu/recordSize; } setValue("AverageMemoryUsed", totalMemory); setValue("PercentAverageMemoryUsed", percentMemory); setValue("AverageDiskUsage", totalDisk); setValue("PercentAverageDiskUsage", percentDisk); setValue("AverageCPUUsage", totalCpu); setValue("MaxUptime", maxUptime); setValue("TotalInstances", app.getInstances()); setValue("RunningInstances", app.getRunningInstances()); } } catch (Exception ex) { setAvailability(false); _log.debug("[collect] "+ex.getMessage(), ex); } } private void setAvailability(CloudApplication app) { double avail; String appState = app.getState().toString(); if (appState.equals("STARTED") || appState.equals("UPDATING")) { avail = Metric.AVAIL_UP; } else if (appState.equals("STOPPED")) { avail = Metric.AVAIL_PAUSED; } else { avail = Metric.AVAIL_DOWN; } if (_log.isDebugEnabled()) { _log.debug("appName=" + app.getName() + ", appState=" + app.getState() + ", avail=" + avail); } setValue(Metric.ATTR_AVAIL, avail); } }