/** * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.activemq.tool.reports.plugins; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import java.util.StringTokenizer; import org.apache.activemq.tool.reports.PerformanceStatisticsUtil; public class ThroughputReportPlugin implements ReportPlugin { public static final String KEY_SYS_TOTAL_TP = "SystemTotalTP"; public static final String KEY_SYS_TOTAL_CLIENTS = "SystemTotalClients"; public static final String KEY_SYS_AVE_TP = "SystemAveTP"; public static final String KEY_SYS_AVE_EMM_TP = "SystemAveEMMTP"; public static final String KEY_SYS_AVE_CLIENT_TP = "SystemAveClientTP"; public static final String KEY_SYS_AVE_CLIENT_EMM_TP = "SystemAveClientEMMTP"; public static final String KEY_MIN_CLIENT_TP = "MinClientTP"; public static final String KEY_MAX_CLIENT_TP = "MaxClientTP"; public static final String KEY_MIN_CLIENT_TOTAL_TP = "MinClientTotalTP"; public static final String KEY_MAX_CLIENT_TOTAL_TP = "MaxClientTotalTP"; public static final String KEY_MIN_CLIENT_AVE_TP = "MinClientAveTP"; public static final String KEY_MAX_CLIENT_AVE_TP = "MaxClientAveTP"; public static final String KEY_MIN_CLIENT_AVE_EMM_TP = "MinClientAveEMMTP"; public static final String KEY_MAX_CLIENT_AVE_EMM_TP = "MaxClientAveEMMTP"; protected Map<String, List> clientThroughputs = new HashMap<String, List>(); public void handleCsvData(String csvData) { StringTokenizer tokenizer = new StringTokenizer(csvData, ","); String data; String key; String val; String clientName = null; Long throughput = null; while (tokenizer.hasMoreTokens()) { data = tokenizer.nextToken(); key = data.substring(0, data.indexOf("=")); val = data.substring(data.indexOf("=") + 1); if (key.equalsIgnoreCase("clientName")) { clientName = val; } else if (key.equalsIgnoreCase("throughput")) { throughput = Long.valueOf(val); } else { // Ignore unknown token } } addToClientTPList(clientName, throughput); } public Map<String, String> getSummary() { // Check if tp sampler wasn't used. if (clientThroughputs.size() == 0) { return new HashMap<String, String>(); } long minClientTP = Long.MAX_VALUE; // TP = throughput long maxClientTP = Long.MIN_VALUE; long minClientTotalTP = Long.MAX_VALUE; long maxClientTotalTP = Long.MIN_VALUE; long systemTotalTP = 0; double minClientAveTP = Double.MAX_VALUE; double maxClientAveTP = Double.MIN_VALUE; double minClientAveEMMTP = Double.MAX_VALUE; // EMM = Excluding Min/Max double maxClientAveEMMTP = Double.MIN_VALUE; double systemAveTP = 0.0; double systemAveEMMTP = 0.0; String nameMinClientTP = ""; String nameMaxClientTP = ""; String nameMinClientTotalTP = ""; String nameMaxClientTotalTP = ""; String nameMinClientAveTP = ""; String nameMaxClientAveTP = ""; String nameMinClientAveEMMTP = ""; String nameMaxClientAveEMMTP = ""; Set<String> clientNames = clientThroughputs.keySet(); String clientName; List clientTPList; long tempLong; double tempDouble; int clientCount = 0; for (Iterator<String> i = clientNames.iterator(); i.hasNext();) { clientName = i.next(); clientTPList = clientThroughputs.get(clientName); clientCount++; tempLong = PerformanceStatisticsUtil.getMin(clientTPList); if (tempLong < minClientTP) { minClientTP = tempLong; nameMinClientTP = clientName; } tempLong = PerformanceStatisticsUtil.getMax(clientTPList); if (tempLong > maxClientTP) { maxClientTP = tempLong; nameMaxClientTP = clientName; } tempLong = PerformanceStatisticsUtil.getSum(clientTPList); systemTotalTP += tempLong; // Accumulate total TP if (tempLong < minClientTotalTP) { minClientTotalTP = tempLong; nameMinClientTotalTP = clientName; } if (tempLong > maxClientTotalTP) { maxClientTotalTP = tempLong; nameMaxClientTotalTP = clientName; } tempDouble = PerformanceStatisticsUtil.getAve(clientTPList); systemAveTP += tempDouble; // Accumulate ave throughput if (tempDouble < minClientAveTP) { minClientAveTP = tempDouble; nameMinClientAveTP = clientName; } if (tempDouble > maxClientAveTP) { maxClientAveTP = tempDouble; nameMaxClientAveTP = clientName; } tempDouble = PerformanceStatisticsUtil.getAveEx(clientTPList); systemAveEMMTP += tempDouble; // Accumulate ave throughput // excluding min/max if (tempDouble < minClientAveEMMTP) { minClientAveEMMTP = tempDouble; nameMinClientAveEMMTP = clientName; } if (tempDouble > maxClientAveEMMTP) { maxClientAveEMMTP = tempDouble; nameMaxClientAveEMMTP = clientName; } } Map<String, String> summary = new HashMap<String, String>(); summary.put(KEY_SYS_TOTAL_TP, String.valueOf(systemTotalTP)); summary.put(KEY_SYS_TOTAL_CLIENTS, String.valueOf(clientCount)); summary.put(KEY_SYS_AVE_TP, String.valueOf(systemAveTP)); summary.put(KEY_SYS_AVE_EMM_TP, String.valueOf(systemAveEMMTP)); summary.put(KEY_SYS_AVE_CLIENT_TP, String.valueOf(systemAveTP / clientCount)); summary.put(KEY_SYS_AVE_CLIENT_EMM_TP, String.valueOf(systemAveEMMTP / clientCount)); summary.put(KEY_MIN_CLIENT_TP, nameMinClientTP + "=" + minClientTP); summary.put(KEY_MAX_CLIENT_TP, nameMaxClientTP + "=" + maxClientTP); summary.put(KEY_MIN_CLIENT_TOTAL_TP, nameMinClientTotalTP + "=" + minClientTotalTP); summary.put(KEY_MAX_CLIENT_TOTAL_TP, nameMaxClientTotalTP + "=" + maxClientTotalTP); summary.put(KEY_MIN_CLIENT_AVE_TP, nameMinClientAveTP + "=" + minClientAveTP); summary.put(KEY_MAX_CLIENT_AVE_TP, nameMaxClientAveTP + "=" + maxClientAveTP); summary.put(KEY_MIN_CLIENT_AVE_EMM_TP, nameMinClientAveEMMTP + "=" + minClientAveEMMTP); summary.put(KEY_MAX_CLIENT_AVE_EMM_TP, nameMaxClientAveEMMTP + "=" + maxClientAveEMMTP); return summary; } protected void addToClientTPList(String clientName, Long throughput) { // Write to client's throughput list if (clientName == null || throughput == null) { throw new IllegalArgumentException("Invalid Throughput CSV Data: clientName=" + clientName + ", throughput=" + throughput); } List<Long> clientTPList = clientThroughputs.get(clientName); if (clientTPList == null) { clientTPList = new ArrayList<Long>(); clientThroughputs.put(clientName, clientTPList); } clientTPList.add(throughput); } }