/* * * * RHQ Management Platform * * Copyright (C) 2005-2012 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., 675 Mass Ave, Cambridge, MA 02139, USA. * */ package org.rhq.enterprise.server.rest.reporting; import java.io.IOException; import java.io.OutputStream; import java.text.NumberFormat; import javax.ejb.EJB; import javax.ejb.Stateless; import javax.interceptor.Interceptors; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.StreamingOutput; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.rhq.core.domain.auth.Subject; import org.rhq.core.domain.resource.composite.PlatformMetricsSummary; import org.rhq.core.domain.util.PageList; import org.rhq.enterprise.server.resource.PlatformUtilizationManagerLocal; import org.rhq.enterprise.server.rest.AbstractRestBean; import org.rhq.enterprise.server.rest.ReportsInterceptor; /** * @author jsanda */ @Interceptors(ReportsInterceptor.class) @Stateless public class PlatformUtilizationHandler extends AbstractRestBean implements PlatformUtilizationLocal { private final Log log = LogFactory.getLog(PlatformUtilizationHandler.class); @EJB private PlatformUtilizationManagerLocal platformUtilizationMgr; public StreamingOutput generateReportInternal(HttpServletRequest request, Subject user) { this.caller = user; return generateReport(request); } @Override public StreamingOutput generateReport(HttpServletRequest request) { if (log.isDebugEnabled()) { log.debug("Received request to generate report for " + caller); } return new StreamingOutput() { private NumberFormat numberFormat; { numberFormat = NumberFormat.getPercentInstance(); numberFormat.setMaximumFractionDigits(2); } @Override public void write(OutputStream output) throws IOException, WebApplicationException { CsvWriter<PlatformMetricsSummary> csvWriter = new CsvWriter<PlatformMetricsSummary>(); csvWriter.setColumns("resource.name", "resource.version", "CPUUsage", "memoryUsage", "swapUsage"); csvWriter.setPropertyConverter("CPUUsage", new PropertyConverter<PlatformMetricsSummary>() { @Override public Object convert(PlatformMetricsSummary summary, String propertyName) { return calculateCPUUsage(summary); } }); csvWriter.setPropertyConverter("memoryUsage", new PropertyConverter<PlatformMetricsSummary>() { @Override public Object convert(PlatformMetricsSummary summary, String propertyName) { return calculateMemoryUsage(summary); } }); csvWriter.setPropertyConverter("swapUsage", new PropertyConverter<PlatformMetricsSummary>() { @Override public Object convert(PlatformMetricsSummary summary, String propertyName) { return calculateSwapUsage(summary); } }); output.write((getHeader() + "\n").getBytes()); PageList<PlatformMetricsSummary> summaries = platformUtilizationMgr.loadPlatformMetrics(caller); for (PlatformMetricsSummary summary : summaries) { csvWriter.write(summary, output); } } private String getHeader() { return "Name,Version,CPU,Memory,Swap"; } private String calculateCPUUsage(PlatformMetricsSummary summary) { if (!summary.isMetricsAvailable()) { return "NA"; } Double systemCPU = (Double) summary.getSystemCPU().getValue(); Double userCPU = (Double) summary.getUserCPU().getValue(); return numberFormat.format((systemCPU + userCPU)); } private String calculateMemoryUsage(PlatformMetricsSummary summary) { if (!summary.isMetricsAvailable()) { return "NA"; } Double totalMemory = (Double) summary.getTotalMemory().getValue(); Double usedMemory = (Double) summary.getActualUsedMemory().getValue(); return numberFormat.format((usedMemory / totalMemory)); } private String calculateSwapUsage(PlatformMetricsSummary summary) { if (!summary.isMetricsAvailable()) { return "NA"; } Double totalSwap = (Double) summary.getTotalSwap().getValue(); Double usedSwap = (Double) summary.getUsedSwap().getValue(); return numberFormat.format((usedSwap / totalSwap)); } }; } }