package simulator.stats.implementation.out; import java.text.DecimalFormat; import java.util.Map; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import schedframe.resources.CoolEmAllResourceType; import schedframe.resources.ResourceHistoryItem; import schedframe.resources.StandardResourceType; import simulator.stats.implementation.MetricsStats; import simulator.stats.implementation.ResourceAirflowStats; import simulator.stats.implementation.ResourceAvailabilityStats; import simulator.stats.implementation.ResourceHistoryStats; import simulator.stats.implementation.ResourcePowerStats; import simulator.stats.implementation.ResourceTemperatureStats; import simulator.stats.implementation.ResourceUsageStats; import simulator.stats.implementation.ResourceUsefulWorkStats; public class CoolEmAllStringSerializer extends StringSerializer { private Log log = LogFactory.getLog(CoolEmAllStringSerializer.class); public Object visit(ResourceUsageStats resourceUsageStats) { Map resourceUsage = resourceUsageStats.getHistory(); //String metricName = "cpu_load"; String metricName = resourceUsageStats.getUsageType(); int mapSize = resourceUsage.size(); /* * FIXME: * Integer.MAX_VALUE = 2147483647. We assume, that each line contains * max 30 signs - this gives max 71582788 lines. If resourceUsage map * contains more elements then we have a problem, because content of * resourceUsage map will not fit in the buffer. * This will need further attention in the future. */ int maxSize = (Integer.MAX_VALUE / 30 ) - 1; if(mapSize >= maxSize){ log.error("Resource usage data is to long to fit in the buffer."); return null; } int size = 30 * resourceUsage.size(); StringBuffer buffer = null; if(printedHeaders.add(resourceUsageStats.getUsageType())) { buffer = new StringBuffer(size + 42); } else { buffer = new StringBuffer(size); } if(!resourceUsageStats.getResourceType().getName().equals(StandardResourceType.Core.getName()) && !resourceUsageStats.getResourceType().getName().equals(CoolEmAllResourceType.Core.getName())){ for (Long timestamp : resourceUsage.keySet()) { buffer.append(metricName); buffer.append(fieldSeparator); if(resourceUsageStats.getResourceName().startsWith("/")) buffer.append(resourceUsageStats.getResourceName().substring(1)); else buffer.append(resourceUsageStats.getResourceName()); buffer.append(fieldSeparator); Double value = resourceUsage.get(timestamp); buffer.append(timestamp); buffer.append(fieldSeparator); //buffer.append(DataCenterWorkloadSimulator.DFAULT_NUMBER_FORMAT // .format(value)); buffer.append(value); buffer.append(fieldSeparator); buffer.append(System.getProperty("line.separator")); } } int lastIdx = buffer.lastIndexOf(System.getProperty("line.separator")); if(lastIdx != -1){ //buffer.deleteCharAt(lastIdx); } return buffer.toString(); } public Object visit(ResourcePowerStats resourceEnergyStats) { Map resourceEnergy = resourceEnergyStats.getHistory(); //String nodeMetricName = "power"; String metricName = resourceEnergyStats.getUsageType(); int mapSize = resourceEnergy.size(); /* * FIXME: * Integer.MAX_VALUE = 2147483647. We assume, that each line contains * max 30 signs - this gives max 71582788 lines. If resourceUsage map * contains more elements then we have a problem, because content of * resourceUsage map will not fit in the buffer. * This will need further attention in the future. */ int maxSize = (Integer.MAX_VALUE / 30 ) - 1; if(mapSize >= maxSize){ log.error("Resource usage data is to long to fit in the buffer."); return null; } int size = 30 * resourceEnergy.size(); StringBuffer buffer = null; if(printedHeaders.add(resourceEnergyStats.getUsageType())) { buffer = new StringBuffer(size + 42); } else { buffer = new StringBuffer(size); } //if(resourceEnergyStats.getResourceType().getName().equals(StandardResourceType.ComputingNode.getName()) || resourceEnergyStats.getResourceType().getName().equals(CoolEmAllResourceType.Node.getName()) || //resourceEnergyStats.getResourceType().getName().equals(StandardResourceType.Inlet.getName()) || resourceEnergyStats.getResourceType().getName().equals(StandardResourceType.Outlet.getName()) || // resourceEnergyStats.getResourceType().getName().equals(StandardResourceType.Heatsink.getName())){ for (Long timestamp : resourceEnergy.keySet()) { buffer.append(metricName); buffer.append(fieldSeparator); if(resourceEnergyStats.getResourceName().startsWith("/")) buffer.append(resourceEnergyStats.getResourceName().substring(1)); else buffer.append(resourceEnergyStats.getResourceName()); buffer.append(fieldSeparator); Double value = resourceEnergy.get(timestamp); buffer.append(timestamp); buffer.append(fieldSeparator); //buffer.append(DataCenterWorkloadSimulator.DFAULT_NUMBER_FORMAT // .format(value)); buffer.append(value); buffer.append(fieldSeparator); buffer.append(System.getProperty("line.separator")); } // } int lastIdx = buffer.lastIndexOf(System.getProperty("line.separator")); if(lastIdx != -1){ //buffer.deleteCharAt(lastIdx); } return buffer.toString(); } public Object visit(ResourceAirflowStats resourceAirFlowStats) { Map resourceAirFlow = resourceAirFlowStats.getHistory(); //String nodeMetricName = "airflow_volume"; String metricName = resourceAirFlowStats.getUsageType(); int mapSize = resourceAirFlow.size(); /* * FIXME: * Integer.MAX_VALUE = 2147483647. We assume, that each line contains * max 30 signs - this gives max 71582788 lines. If resourceUsage map * contains more elements then we have a problem, because content of * resourceUsage map will not fit in the buffer. * This will need further attention in the future. */ int maxSize = (Integer.MAX_VALUE / 30 ) - 1; if(mapSize >= maxSize){ log.error("Resource usage data is to long to fit in the buffer."); return null; } int size = 30 * resourceAirFlow.size(); StringBuffer buffer = null; if(printedHeaders.add(resourceAirFlowStats.getUsageType())) { buffer = new StringBuffer(size + 42); } else { buffer = new StringBuffer(size); } if(resourceAirFlowStats.getResourceType().getName().equals(StandardResourceType.Inlet.getName()) || resourceAirFlowStats.getResourceType().getName().equals(StandardResourceType.Outlet.getName()) || resourceAirFlowStats.getResourceType().getName().equals(StandardResourceType.Fan.getName())){ for (Long timestamp : resourceAirFlow.keySet()) { buffer.append(metricName); buffer.append(fieldSeparator); if(resourceAirFlowStats.getResourceName().startsWith("/")) buffer.append(resourceAirFlowStats.getResourceName().substring(1)); else buffer.append(resourceAirFlowStats.getResourceName()); buffer.append(fieldSeparator); Double value = resourceAirFlow.get(timestamp); buffer.append(timestamp); buffer.append(fieldSeparator); //buffer.append(DataCenterWorkloadSimulator.DFAULT_NUMBER_FORMAT // .format(value)); buffer.append(value); buffer.append(fieldSeparator); buffer.append(System.getProperty("line.separator")); } } int lastIdx = buffer.lastIndexOf(System.getProperty("line.separator")); if(lastIdx != -1){ //buffer.deleteCharAt(lastIdx); } return buffer.toString(); } public Object visit(ResourceTemperatureStats resourceTemperatureStats) { Map resourceTemperature = resourceTemperatureStats.getHistory(); //String nodeMetricName = "temperature"; //String cpuMetricName = "temperature"; String metricName = resourceTemperatureStats.getUsageType(); int mapSize = resourceTemperature.size(); /* * FIXME: * Integer.MAX_VALUE = 2147483647. We assume, that each line contains * max 30 signs - this gives max 71582788 lines. If resourceUsage map * contains more elements then we have a problem, because content of * resourceUsage map will not fit in the buffer. * This will need further attention in the future. */ int maxSize = (Integer.MAX_VALUE / 30 ) - 1; if(mapSize >= maxSize){ log.error("Resource temperature data is to long to fit in the buffer."); return null; } int size = 30 * resourceTemperature.size(); StringBuffer buffer = null; if(printedHeaders.add(resourceTemperatureStats.getUsageType())) { buffer = new StringBuffer(size + 42); } else { buffer = new StringBuffer(size); } if(resourceTemperatureStats.getResourceType().getName().equals(StandardResourceType.Node.getName()) || resourceTemperatureStats.getResourceType().getName().equals(StandardResourceType.Processor.getName())){ /*String metricName = null; if(resourceTemperatureStats.getResourceType().equals(StandardResourceType.ComputingNode) || resourceTemperatureStats.getResourceType().equals(CoolEmAllResourceType.Node)){ metricName = nodeMetricName; } else if(resourceTemperatureStats.getResourceType().equals(StandardResourceType.Processor) || resourceTemperatureStats.getResourceType().equals(CoolEmAllResourceType.Processor)){ metricName = cpuMetricName; }*/ for (Long timestamp : resourceTemperature.keySet()) { buffer.append(metricName); buffer.append(fieldSeparator); if(resourceTemperatureStats.getResourceName().startsWith("/")) buffer.append(resourceTemperatureStats.getResourceName().substring(1)); else buffer.append(resourceTemperatureStats.getResourceName()); buffer.append(fieldSeparator); Double value = resourceTemperature.get(timestamp); buffer.append(timestamp); buffer.append(fieldSeparator); //buffer.append(DataCenterWorkloadSimulator.DFAULT_NUMBER_FORMAT // .format(value)); buffer.append(value); buffer.append(fieldSeparator); buffer.append(System.getProperty("line.separator")); } } int lastIdx = buffer.lastIndexOf(System.getProperty("line.separator")); if(lastIdx != -1){ //buffer.deleteCharAt(lastIdx); } return buffer.toString(); } public Object visit(MetricsStats metricsStats) { StringBuffer buffer = null; if(printedHeaders.add("metrics")) { buffer = new StringBuffer(600); /*String[] headers = metricsStats.getHeaders(); for(int i = 0; i < headers.length; i++) { buffer.append(headers[i]); buffer.append(fieldSeparator); } buffer.append(System.getProperty("line.separator"));*/ } else { buffer = new StringBuffer(300); } DecimalFormat df = new DecimalFormat(); df.setMaximumFractionDigits(3); df.setGroupingUsed(false); buffer.append(metricsStats.getMetricName()); buffer.append(fieldSeparator); buffer.append(metricsStats.getResourceName()); buffer.append(fieldSeparator); buffer.append(metricsStats.getTimestamp()); buffer.append(fieldSeparator); buffer.append(df.format(metricsStats.getValue())); buffer.append(fieldSeparator); return buffer.toString(); } public Object visit(ResourceHistoryStats arg) { StringBuffer buffer = null; if(printedHeaders.add("metrics")) { buffer = new StringBuffer(600); /*String[] headers = metricsStats.getHeaders(); for(int i = 0; i < headers.length; i++) { buffer.append(headers[i]); buffer.append(fieldSeparator); } buffer.append(System.getProperty("line.separator"));*/ } else { buffer = new StringBuffer(300); } DecimalFormat df = new DecimalFormat(); df.setMaximumFractionDigits(3); df.setGroupingUsed(false); for(ResourceHistoryItem rhc: arg.getResourceHistory()){ buffer.append(rhc.getTimestamp()); buffer.append(fieldSeparator); buffer.append(rhc.getResourceName()); buffer.append(fieldSeparator); buffer.append(rhc.getAction()); buffer.append(fieldSeparator); buffer.append(rhc.getParamter()); buffer.append(fieldSeparator); buffer.append(System.getProperty("line.separator")); } return buffer.toString(); } public Object visit(ResourceUsefulWorkStats resourceUsefulWorkStats) { String metricName = resourceUsefulWorkStats.getUsageType(); StringBuffer buffer = null; if(printedHeaders.add("metrics")) { buffer = new StringBuffer(600); /*String[] headers = metricsStats.getHeaders(); for(int i = 0; i < headers.length; i++) { buffer.append(headers[i]); buffer.append(fieldSeparator); } buffer.append(System.getProperty("line.separator"));*/ } else { buffer = new StringBuffer(300); } DecimalFormat df = new DecimalFormat(); df.setMaximumFractionDigits(3); df.setGroupingUsed(false); if(!resourceUsefulWorkStats.getResourceType().getName().equals(StandardResourceType.Core.getName()) && !resourceUsefulWorkStats.getResourceType().getName().equals(CoolEmAllResourceType.Core.getName())){ buffer.append(metricName); buffer.append(fieldSeparator); buffer.append(resourceUsefulWorkStats.getResourceName()); buffer.append(fieldSeparator); buffer.append(resourceUsefulWorkStats.getTimestamp()); buffer.append(fieldSeparator); buffer.append(df.format(resourceUsefulWorkStats.getValue())); buffer.append(fieldSeparator); buffer.append(System.getProperty("line.separator")); } return buffer.toString(); } public Object visit(ResourceAvailabilityStats resourceAvailabilityStats) { String metricName = resourceAvailabilityStats.getUsageType(); StringBuffer buffer = null; if(printedHeaders.add("metrics")) { buffer = new StringBuffer(600); /*String[] headers = metricsStats.getHeaders(); for(int i = 0; i < headers.length; i++) { buffer.append(headers[i]); buffer.append(fieldSeparator); } buffer.append(System.getProperty("line.separator"));*/ } else { buffer = new StringBuffer(300); } DecimalFormat df = new DecimalFormat(); df.setMaximumFractionDigits(3); df.setGroupingUsed(false); if(resourceAvailabilityStats.getResourceType().getName().equals(CoolEmAllResourceType.NodeGroup.getName())){ buffer.append(metricName); buffer.append(fieldSeparator); buffer.append(resourceAvailabilityStats.getResourceName()); buffer.append(fieldSeparator); buffer.append(resourceAvailabilityStats.getTimestamp()); buffer.append(fieldSeparator); buffer.append(df.format(resourceAvailabilityStats.getValue())); buffer.append(fieldSeparator); buffer.append(System.getProperty("line.separator")); } return buffer.toString(); } }