Author: aco
Date: Mon Jun 12 06:33:04 2006
New Revision: 413651
URL: http://svn.apache.org/viewvc?rev=413651&view=rev
Log:
- Added a configurable report generator that could generate output either
verbose or to an xml file.
- Using sysTest.reportType=[verbose|xml], default is xml.
- Xml output also displays a summary verbosely.
- TODO: Update the mojo to accomodate the additional option.
Added:
incubator/activemq/trunk/tooling/maven-activemq-perf-plugin/src/main/java/org/apache/activemq/tool/reports/
incubator/activemq/trunk/tooling/maven-activemq-perf-plugin/src/main/java/org/apache/activemq/tool/reports/AbstractPerfReportWriter.java
incubator/activemq/trunk/tooling/maven-activemq-perf-plugin/src/main/java/org/apache/activemq/tool/reports/PerformanceReportWriter.java
incubator/activemq/trunk/tooling/maven-activemq-perf-plugin/src/main/java/org/apache/activemq/tool/reports/PerformanceStatisticsUtil.java
incubator/activemq/trunk/tooling/maven-activemq-perf-plugin/src/main/java/org/apache/activemq/tool/reports/VerbosePerfReportWriter.java
incubator/activemq/trunk/tooling/maven-activemq-perf-plugin/src/main/java/org/apache/activemq/tool/reports/XmlFilePerfReportWriter.java
Removed:
incubator/activemq/trunk/tooling/maven-activemq-perf-plugin/src/main/java/org/apache/activemq/tool/PerfReportGenerator.java
Modified:
incubator/activemq/trunk/tooling/maven-activemq-perf-plugin/src/main/java/org/apache/activemq/tool/JmsClientSystemSupport.java
incubator/activemq/trunk/tooling/maven-activemq-perf-plugin/src/main/java/org/apache/activemq/tool/JmsConsumerSystem.java
incubator/activemq/trunk/tooling/maven-activemq-perf-plugin/src/main/java/org/apache/activemq/tool/JmsPerformanceSupport.java
incubator/activemq/trunk/tooling/maven-activemq-perf-plugin/src/main/java/org/apache/activemq/tool/JmsProducerSystem.java
incubator/activemq/trunk/tooling/maven-activemq-perf-plugin/src/main/java/org/apache/activemq/tool/PerfMeasurable.java
incubator/activemq/trunk/tooling/maven-activemq-perf-plugin/src/main/java/org/apache/activemq/tool/PerfMeasurementTool.java
Modified:
incubator/activemq/trunk/tooling/maven-activemq-perf-plugin/src/main/java/org/apache/activemq/tool/JmsClientSystemSupport.java
URL:
http://svn.apache.org/viewvc/incubator/activemq/trunk/tooling/maven-activemq-perf-plugin/src/main/java/org/apache/activemq/tool/JmsClientSystemSupport.java?rev=413651&r1=413650&r2=413651&view=diff
==============================================================================
---
incubator/activemq/trunk/tooling/maven-activemq-perf-plugin/src/main/java/org/apache/activemq/tool/JmsClientSystemSupport.java
(original)
+++
incubator/activemq/trunk/tooling/maven-activemq-perf-plugin/src/main/java/org/apache/activemq/tool/JmsClientSystemSupport.java
Mon Jun 12 06:33:04 2006
@@ -18,6 +18,9 @@
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.apache.activemq.tool.reports.VerbosePerfReportWriter;
+import org.apache.activemq.tool.reports.PerformanceReportWriter;
+import org.apache.activemq.tool.reports.XmlFilePerfReportWriter;
import java.util.Properties;
import java.util.Iterator;
@@ -29,17 +32,20 @@
public static final String DEST_DISTRO_ALL = "all"; // Each client
will send/receive to all destination;
public static final String DEST_DISTRO_EQUAL = "equal"; // Equally
divide the number of destinations to the number of clients
public static final String DEST_DISTRO_DIVIDE = "divide"; // Divide the
destination among the clients, even if some have more destination than others
-
- protected static final String KEY_CLIENT_DEST_COUNT = "client.destCount";
- protected static final String KEY_CLIENT_DEST_INDEX = "client.destIndex";
+ public static final String REPORT_VERBOSE = "verbose";
+ public static final String REPORT_XML_FILE = "xml";
protected Properties sysTestSettings = new Properties();
protected Properties samplerSettings = new Properties();
protected Properties jmsClientSettings = new Properties();
protected ThreadGroup clientThreadGroup;
protected PerfMeasurementTool performanceSampler;
- protected String reportDirectory = "";
+ protected String reportType = REPORT_XML_FILE;
+ protected String reportDirectory = "./";
+ protected String reportName = null;
+
+ protected String clientName = null;
protected int numClients = 1;
protected int totalDests = 1;
protected String destDistro = DEST_DISTRO_ALL;
@@ -49,12 +55,11 @@
performanceSampler = new PerfMeasurementTool();
performanceSampler.setSamplerSettings(samplerSettings);
- PerfReportGenerator report = new PerfReportGenerator();
- report.setReportName(this.getClass().getName());
- report.setTestSettings(getSettings());
- report.startGenerateReport();
+ PerformanceReportWriter writer = createPerfWriter();
+ performanceSampler.setPerfWriter(writer);
- performanceSampler.setWriter(report.getWriter());
+ writer.openReportWriter();
+ writer.writeProperties("testProperties", getSettings());
clientThreadGroup = new ThreadGroup(getThreadGroupName());
for (int i=0; i<getNumClients(); i++) {
@@ -75,66 +80,7 @@
performanceSampler.startSampler();
performanceSampler.waitForSamplerToFinish(0);
- report.stopGenerateReport();
- }
-
- protected void distributeDestinations(String distroType, int clientIndex,
int numClients, int numDests, Properties clientSettings) {
- if (distroType.equalsIgnoreCase(DEST_DISTRO_ALL)) {
- clientSettings.setProperty(KEY_CLIENT_DEST_COUNT,
String.valueOf(numDests));
- clientSettings.setProperty(KEY_CLIENT_DEST_INDEX, "0");
- } else if (distroType.equalsIgnoreCase(DEST_DISTRO_EQUAL)) {
- int destPerClient = (numDests / numClients);
- // There are equal or more destinations per client
- if (destPerClient > 0) {
- clientSettings.setProperty(KEY_CLIENT_DEST_COUNT,
String.valueOf(destPerClient));
- clientSettings.setProperty(KEY_CLIENT_DEST_INDEX,
String.valueOf(destPerClient * clientIndex));
-
- // If there are more clients than destinations, share destinations
per client
- } else {
- clientSettings.setProperty(KEY_CLIENT_DEST_COUNT, "1"); // At
most one destination per client
- clientSettings.setProperty(KEY_CLIENT_DEST_INDEX,
String.valueOf(clientIndex % numDests));
- }
- } else if (distroType.equalsIgnoreCase(DEST_DISTRO_DIVIDE)) {
- int destPerClient = (numDests / numClients);
- // There are equal or more destinations per client
- if (destPerClient > 0) {
- int remain = numDests % numClients;
- int nextIndex;
- if (clientIndex < remain) {
- destPerClient++;
- nextIndex = clientIndex * destPerClient;
- } else {
- nextIndex = (clientIndex * destPerClient) + remain;
- }
-
- clientSettings.setProperty(KEY_CLIENT_DEST_COUNT,
String.valueOf(destPerClient));
- clientSettings.setProperty(KEY_CLIENT_DEST_INDEX,
String.valueOf(nextIndex));
-
- // If there are more clients than destinations, share destinations
per client
- } else {
- clientSettings.setProperty(KEY_CLIENT_DEST_COUNT, "1"); // At
most one destination per client
- clientSettings.setProperty(KEY_CLIENT_DEST_INDEX,
String.valueOf(clientIndex % numDests));
- }
-
- // Send to all for unknown behavior
- } else {
- clientSettings.setProperty(KEY_CLIENT_DEST_COUNT,
String.valueOf(numDests));
- clientSettings.setProperty(KEY_CLIENT_DEST_INDEX, "0");
- }
- }
-
- public abstract void runJmsClient(String clientName, Properties
clientSettings);
-
- public String getClientName() {
- return "JMS Client: ";
- }
-
- public String getThreadName() {
- return "JMS Client Thread: ";
- }
-
- public String getThreadGroupName() {
- return "JMS Clients Thread Group";
+ writer.closeReportWriter();
}
public PerfMeasurementTool getPerformanceSampler() {
@@ -227,5 +173,103 @@
public void setTotalDests(int totalDests) {
this.totalDests = totalDests;
+ }
+
+ public String getReportName() {
+ if (reportName == null) {
+ return "clientPerformanceReport.xml";
+ } else {
+ return reportName;
+ }
+ }
+
+ public void setReportName(String reportName) {
+ this.reportName = reportName;
+ }
+
+ public String getClientName() {
+ if (clientName == null) {
+ return "JMS Client: ";
+ } else {
+ return clientName;
+ }
+ }
+
+ public void setClientName(String clientName) {
+ this.clientName = clientName;
+ }
+
+ protected PerformanceReportWriter createPerfWriter() {
+ if (reportType.equalsIgnoreCase(REPORT_XML_FILE)) {
+ return new XmlFilePerfReportWriter(getReportDirectory(),
getReportName());
+ } else if (reportType.equalsIgnoreCase(REPORT_VERBOSE)) {
+ return new VerbosePerfReportWriter();
+ } else {
+ // Use verbose if unknown report type
+ return new VerbosePerfReportWriter();
+ }
+ }
+
+ protected void distributeDestinations(String distroType, int clientIndex,
int numClients, int numDests, Properties clientSettings) {
+ if (distroType.equalsIgnoreCase(DEST_DISTRO_ALL)) {
+ clientSettings.setProperty(getDestCountKey(),
String.valueOf(numDests));
+ clientSettings.setProperty(getDestIndexKey(), "0");
+ } else if (distroType.equalsIgnoreCase(DEST_DISTRO_EQUAL)) {
+ int destPerClient = (numDests / numClients);
+ // There are equal or more destinations per client
+ if (destPerClient > 0) {
+ clientSettings.setProperty(getDestCountKey(),
String.valueOf(destPerClient));
+ clientSettings.setProperty(getDestIndexKey(),
String.valueOf(destPerClient * clientIndex));
+
+ // If there are more clients than destinations, share destinations
per client
+ } else {
+ clientSettings.setProperty(getDestCountKey(), "1"); // At most
one destination per client
+ clientSettings.setProperty(getDestIndexKey(),
String.valueOf(clientIndex % numDests));
+ }
+ } else if (distroType.equalsIgnoreCase(DEST_DISTRO_DIVIDE)) {
+ int destPerClient = (numDests / numClients);
+ // There are equal or more destinations per client
+ if (destPerClient > 0) {
+ int remain = numDests % numClients;
+ int nextIndex;
+ if (clientIndex < remain) {
+ destPerClient++;
+ nextIndex = clientIndex * destPerClient;
+ } else {
+ nextIndex = (clientIndex * destPerClient) + remain;
+ }
+
+ clientSettings.setProperty(getDestCountKey(),
String.valueOf(destPerClient));
+ clientSettings.setProperty(getDestIndexKey(),
String.valueOf(nextIndex));
+
+ // If there are more clients than destinations, share destinations
per client
+ } else {
+ clientSettings.setProperty(getDestCountKey(), "1"); // At most
one destination per client
+ clientSettings.setProperty(getDestIndexKey(),
String.valueOf(clientIndex % numDests));
+ }
+
+ // Send to all for unknown behavior
+ } else {
+ clientSettings.setProperty(getDestCountKey(),
String.valueOf(numDests));
+ clientSettings.setProperty(getDestIndexKey(), "0");
+ }
+ }
+
+ protected abstract void runJmsClient(String clientName, Properties
clientSettings);
+
+ protected String getThreadName() {
+ return "JMS Client Thread: ";
+ }
+
+ protected String getThreadGroupName() {
+ return "JMS Clients Thread Group";
+ }
+
+ protected String getDestCountKey() {
+ return "client.destCount";
+ }
+
+ protected String getDestIndexKey() {
+ return "client.destIndex";
}
}
Modified:
incubator/activemq/trunk/tooling/maven-activemq-perf-plugin/src/main/java/org/apache/activemq/tool/JmsConsumerSystem.java
URL:
http://svn.apache.org/viewvc/incubator/activemq/trunk/tooling/maven-activemq-perf-plugin/src/main/java/org/apache/activemq/tool/JmsConsumerSystem.java?rev=413651&r1=413650&r2=413651&view=diff
==============================================================================
---
incubator/activemq/trunk/tooling/maven-activemq-perf-plugin/src/main/java/org/apache/activemq/tool/JmsConsumerSystem.java
(original)
+++
incubator/activemq/trunk/tooling/maven-activemq-perf-plugin/src/main/java/org/apache/activemq/tool/JmsConsumerSystem.java
Mon Jun 12 06:33:04 2006
@@ -20,12 +20,30 @@
import java.util.Properties;
public class JmsConsumerSystem extends JmsClientSystemSupport {
- public void runJmsClient(String clientName, Properties clientSettings) {
+
+ public String getReportName() {
+ if (reportName == null) {
+ return "JmsConsumer_ClientCount" + getNumClients() + "_DestCount"
+ getTotalDests() + "_" + getDestDistro() + ".xml";
+ } else {
+ return reportName;
+ }
+ }
+
+ public String getClientName() {
+ if (clientName == null) {
+ return "JmsConsumer";
+ } else {
+ return clientName;
+ }
+ }
+
+ protected void runJmsClient(String clientName, Properties clientSettings) {
PerfMeasurementTool sampler = getPerformanceSampler();
JmsConsumerClient consumer = new JmsConsumerClient();
consumer.setSettings(clientSettings);
consumer.setConsumerName(clientName); // For durable subscribers
+ consumer.setClientName(clientName);
if (sampler != null) {
sampler.registerClient(consumer);
@@ -39,16 +57,20 @@
}
}
- public String getClientName() {
- return "JMS Consumer: ";
- }
-
- public String getThreadName() {
+ protected String getThreadName() {
return "JMS Consumer Thread: ";
}
- public String getThreadGroupName() {
+ protected String getThreadGroupName() {
return "JMS Consumer Thread Group";
+ }
+
+ protected String getDestCountKey() {
+ return "consumer.destCount";
+ }
+
+ protected String getDestIndexKey() {
+ return "consumer.destIndex";
}
public static void main(String[] args) throws JMSException {
Modified:
incubator/activemq/trunk/tooling/maven-activemq-perf-plugin/src/main/java/org/apache/activemq/tool/JmsPerformanceSupport.java
URL:
http://svn.apache.org/viewvc/incubator/activemq/trunk/tooling/maven-activemq-perf-plugin/src/main/java/org/apache/activemq/tool/JmsPerformanceSupport.java?rev=413651&r1=413650&r2=413651&view=diff
==============================================================================
---
incubator/activemq/trunk/tooling/maven-activemq-perf-plugin/src/main/java/org/apache/activemq/tool/JmsPerformanceSupport.java
(original)
+++
incubator/activemq/trunk/tooling/maven-activemq-perf-plugin/src/main/java/org/apache/activemq/tool/JmsPerformanceSupport.java
Mon Jun 12 06:33:04 2006
@@ -18,33 +18,22 @@
import edu.emory.mathcs.backport.java.util.concurrent.atomic.AtomicLong;
-import javax.jms.JMSException;
-
public class JmsPerformanceSupport extends JmsClientSupport implements
PerfMeasurable {
- private static int clientCounter;
-
protected AtomicLong throughput = new AtomicLong(0);
protected PerfEventListener listener = null;
- private int clientNumber;
+ protected String clientName = null;
public void reset() {
setThroughput(0);
}
-
- public synchronized int getClientNumber() {
- if (clientNumber == 0) {
- clientNumber = incrementClientCounter();
- }
- return clientNumber;
- }
public String getClientName() {
- try {
- return getConnection().getClientID();
- } catch (JMSException e) {
- return "";
- }
+ return clientName;
+ }
+
+ public void setClientName(String clientName) {
+ this.clientName = clientName;
}
public long getThroughput() {
@@ -69,9 +58,5 @@
public PerfEventListener getPerfEventListener() {
return listener;
- }
-
- protected static synchronized int incrementClientCounter() {
- return ++clientCounter;
}
}
Modified:
incubator/activemq/trunk/tooling/maven-activemq-perf-plugin/src/main/java/org/apache/activemq/tool/JmsProducerSystem.java
URL:
http://svn.apache.org/viewvc/incubator/activemq/trunk/tooling/maven-activemq-perf-plugin/src/main/java/org/apache/activemq/tool/JmsProducerSystem.java?rev=413651&r1=413650&r2=413651&view=diff
==============================================================================
---
incubator/activemq/trunk/tooling/maven-activemq-perf-plugin/src/main/java/org/apache/activemq/tool/JmsProducerSystem.java
(original)
+++
incubator/activemq/trunk/tooling/maven-activemq-perf-plugin/src/main/java/org/apache/activemq/tool/JmsProducerSystem.java
Mon Jun 12 06:33:04 2006
@@ -20,11 +20,29 @@
import java.util.Properties;
public class JmsProducerSystem extends JmsClientSystemSupport {
- public void runJmsClient(String clientName, Properties clientSettings) {
+
+ public String getReportName() {
+ if (reportName == null) {
+ return "JmsProducer_ClientCount" + getNumClients() + "_DestCount"
+ getTotalDests() + "_" + getDestDistro() + ".xml";
+ } else {
+ return reportName;
+ }
+ }
+
+ public String getClientName() {
+ if (clientName == null) {
+ return "JmsProducer";
+ } else {
+ return clientName;
+ }
+ }
+
+ protected void runJmsClient(String clientName, Properties clientSettings) {
PerfMeasurementTool sampler = getPerformanceSampler();
JmsProducerClient producer = new JmsProducerClient();
producer.setSettings(clientSettings);
+ producer.setClientName(clientName);
if (sampler != null) {
sampler.registerClient(producer);
@@ -39,16 +57,20 @@
}
}
- public String getClientName() {
- return "JMS Producer: ";
- }
-
- public String getThreadName() {
+ protected String getThreadName() {
return "JMS Producer Thread: ";
}
- public String getThreadGroupName() {
+ protected String getThreadGroupName() {
return "JMS Producer Thread Group";
+ }
+
+ protected String getDestCountKey() {
+ return "producer.destCount";
+ }
+
+ protected String getDestIndexKey() {
+ return "producer.destIndex";
}
public static void main(String[] args) {
Modified:
incubator/activemq/trunk/tooling/maven-activemq-perf-plugin/src/main/java/org/apache/activemq/tool/PerfMeasurable.java
URL:
http://svn.apache.org/viewvc/incubator/activemq/trunk/tooling/maven-activemq-perf-plugin/src/main/java/org/apache/activemq/tool/PerfMeasurable.java?rev=413651&r1=413650&r2=413651&view=diff
==============================================================================
---
incubator/activemq/trunk/tooling/maven-activemq-perf-plugin/src/main/java/org/apache/activemq/tool/PerfMeasurable.java
(original)
+++
incubator/activemq/trunk/tooling/maven-activemq-perf-plugin/src/main/java/org/apache/activemq/tool/PerfMeasurable.java
Mon Jun 12 06:33:04 2006
@@ -20,7 +20,6 @@
public interface PerfMeasurable {
public void reset();
- public int getClientNumber();
public String getClientName();
public long getThroughput();
public Properties getSettings();
Modified:
incubator/activemq/trunk/tooling/maven-activemq-perf-plugin/src/main/java/org/apache/activemq/tool/PerfMeasurementTool.java
URL:
http://svn.apache.org/viewvc/incubator/activemq/trunk/tooling/maven-activemq-perf-plugin/src/main/java/org/apache/activemq/tool/PerfMeasurementTool.java?rev=413651&r1=413650&r2=413651&view=diff
==============================================================================
---
incubator/activemq/trunk/tooling/maven-activemq-perf-plugin/src/main/java/org/apache/activemq/tool/PerfMeasurementTool.java
(original)
+++
incubator/activemq/trunk/tooling/maven-activemq-perf-plugin/src/main/java/org/apache/activemq/tool/PerfMeasurementTool.java
Mon Jun 12 06:33:04 2006
@@ -19,12 +19,13 @@
import edu.emory.mathcs.backport.java.util.concurrent.atomic.AtomicBoolean;
import javax.jms.JMSException;
-import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
+import org.apache.activemq.tool.reports.PerformanceReportWriter;
+
public class PerfMeasurementTool implements PerfEventListener, Runnable {
public static final String PREFIX_CONFIG_SYSTEM_TEST = "sampler.";
@@ -37,7 +38,7 @@
private AtomicBoolean start = new AtomicBoolean(false);
private AtomicBoolean stop = new AtomicBoolean(false);
private AtomicBoolean isRunning = new AtomicBoolean(false);
- private PrintWriter writer = null;
+ private PerformanceReportWriter perfWriter = null;
private Properties samplerSettings = new Properties();
private List perfClients = new ArrayList();
@@ -62,12 +63,12 @@
ReflectionUtil.configureClass(this, samplerSettings);
}
- public PrintWriter getWriter() {
- return writer;
+ public PerformanceReportWriter getPerfWriter() {
+ return perfWriter;
}
- public void setWriter(PrintWriter writer) {
- this.writer = writer;
+ public void setPerfWriter(PerformanceReportWriter writer) {
+ this.perfWriter = writer;
}
public long getDuration() {
@@ -169,8 +170,9 @@
public void sampleClients() {
for (Iterator i = perfClients.iterator(); i.hasNext();) {
PerfMeasurable client = (PerfMeasurable) i.next();
- getWriter().println("<sample index='" + sampleIndex + "'
clientNumber='" + client.getClientNumber()
- + "' name='" + client.getClientName() + "' throughput='" +
client.getThroughput() + "'/>");
+ if (perfWriter != null) {
+ perfWriter.writePerfData("index=" + sampleIndex +
",clientName=" + client.getClientName() + ",throughput=" +
client.getThroughput());
+ }
client.reset();
}
}
Added:
incubator/activemq/trunk/tooling/maven-activemq-perf-plugin/src/main/java/org/apache/activemq/tool/reports/AbstractPerfReportWriter.java
URL:
http://svn.apache.org/viewvc/incubator/activemq/trunk/tooling/maven-activemq-perf-plugin/src/main/java/org/apache/activemq/tool/reports/AbstractPerfReportWriter.java?rev=413651&view=auto
==============================================================================
---
incubator/activemq/trunk/tooling/maven-activemq-perf-plugin/src/main/java/org/apache/activemq/tool/reports/AbstractPerfReportWriter.java
(added)
+++
incubator/activemq/trunk/tooling/maven-activemq-perf-plugin/src/main/java/org/apache/activemq/tool/reports/AbstractPerfReportWriter.java
Mon Jun 12 06:33:04 2006
@@ -0,0 +1,189 @@
+/**
+ *
+ * Copyright 2005-2006 The Apache Software Foundation
+ *
+ * Licensed 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;
+
+import org.apache.activemq.tool.ReflectionUtil;
+
+import java.util.Properties;
+import java.util.Map;
+import java.util.HashMap;
+import java.util.StringTokenizer;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Set;
+import java.util.Iterator;
+
+public abstract class AbstractPerfReportWriter implements
PerformanceReportWriter {
+ 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_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 Properties settings;
+ protected Map clientThroughputs = new HashMap();
+
+ public void setSettings(Properties settings) {
+ this.settings = settings;
+ ReflectionUtil.configureClass(this, settings);
+ }
+
+ public Properties getSettings() {
+ return settings;
+ }
+
+ protected void parsePerfCsvData(String csvData) {
+ StringTokenizer tokenizer = new StringTokenizer(csvData, ",");
+ String data, key, val, 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);
+ }
+
+ 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 clientTPList = (List)clientThroughputs.get(clientName);
+ if (clientTPList == null) {
+ clientTPList = new ArrayList();
+ clientThroughputs.put(clientName, clientTPList);
+ }
+ clientTPList.add(throughput);
+ }
+
+ protected Map createPerfSummary(Map clientTPMap) {
+ long minClientTP = Long.MAX_VALUE, // TP = throughput
+ maxClientTP = Long.MIN_VALUE,
+ minClientTotalTP = Long.MAX_VALUE,
+ maxClientTotalTP = Long.MIN_VALUE,
+ systemTotalTP = 0;
+
+ double minClientAveTP = Double.MAX_VALUE,
+ maxClientAveTP = Double.MIN_VALUE,
+ minClientAveEMMTP = Double.MAX_VALUE, // EMM = Excluding Min/Max
+ maxClientAveEMMTP = Double.MIN_VALUE,
+ systemAveTP = 0.0,
+ systemAveEMMTP = 0.0;
+
+ String nameMinClientTP = "",
+ nameMaxClientTP = "",
+ nameMinClientTotalTP = "",
+ nameMaxClientTotalTP = "",
+ nameMinClientAveTP = "",
+ nameMaxClientAveTP = "",
+ nameMinClientAveEMMTP = "",
+ nameMaxClientAveEMMTP = "";
+
+ Set clientNames = clientTPMap.keySet();
+ String clientName;
+ List clientTPList;
+ long tempLong;
+ double tempDouble;
+ int clientCount = 0;
+ for (Iterator i=clientNames.iterator(); i.hasNext();) {
+ clientName = (String)i.next();
+ clientTPList = (List)clientTPMap.get(clientName);
+ clientCount++;
+
+ tempLong =
PerformanceStatisticsUtil.getMinThroughput(clientTPList);
+ if (tempLong < minClientTP) {
+ minClientTP = tempLong;
+ nameMinClientTP = clientName;
+ }
+
+ tempLong =
PerformanceStatisticsUtil.getMaxThroughput(clientTPList);
+ if (tempLong > maxClientTP) {
+ maxClientTP = tempLong;
+ nameMaxClientTP = clientName;
+ }
+
+ tempLong =
PerformanceStatisticsUtil.getTotalThroughput(clientTPList);
+ systemTotalTP += tempLong; // Accumulate total TP
+ if (tempLong < minClientTotalTP) {
+ minClientTotalTP = tempLong;
+ nameMinClientTotalTP = clientName;
+ }
+
+ if (tempLong > maxClientTotalTP) {
+ maxClientTotalTP = tempLong;
+ nameMaxClientTotalTP = clientName;
+ }
+
+ tempDouble =
PerformanceStatisticsUtil.getAveThroughput(clientTPList);
+ systemAveTP += tempDouble; // Accumulate ave throughput
+ if (tempDouble < minClientAveTP) {
+ minClientAveTP = tempDouble;
+ nameMinClientAveTP = clientName;
+ }
+
+ if (tempDouble > maxClientAveTP) {
+ maxClientAveTP = tempDouble;
+ nameMaxClientAveTP = clientName;
+ }
+
+ tempDouble =
PerformanceStatisticsUtil.getAveThroughputExcludingMinMax(clientTPList);
+ systemAveEMMTP += tempDouble; // Accumulate ave throughput
excluding min/max
+ if (tempDouble < minClientAveEMMTP) {
+ minClientAveEMMTP = tempDouble;
+ nameMinClientAveEMMTP = clientName;
+ }
+
+ if (tempDouble > maxClientAveEMMTP) {
+ maxClientAveEMMTP = tempDouble;
+ nameMaxClientAveEMMTP = clientName;
+ }
+ }
+
+ Map summary = new HashMap();
+ 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_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;
+ }
+}
Added:
incubator/activemq/trunk/tooling/maven-activemq-perf-plugin/src/main/java/org/apache/activemq/tool/reports/PerformanceReportWriter.java
URL:
http://svn.apache.org/viewvc/incubator/activemq/trunk/tooling/maven-activemq-perf-plugin/src/main/java/org/apache/activemq/tool/reports/PerformanceReportWriter.java?rev=413651&view=auto
==============================================================================
---
incubator/activemq/trunk/tooling/maven-activemq-perf-plugin/src/main/java/org/apache/activemq/tool/reports/PerformanceReportWriter.java
(added)
+++
incubator/activemq/trunk/tooling/maven-activemq-perf-plugin/src/main/java/org/apache/activemq/tool/reports/PerformanceReportWriter.java
Mon Jun 12 06:33:04 2006
@@ -0,0 +1,30 @@
+/**
+ *
+ * Copyright 2005-2006 The Apache Software Foundation
+ *
+ * Licensed 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;
+
+import java.util.Properties;
+
+public interface PerformanceReportWriter {
+ public void setSettings(Properties settings);
+ public Properties getSettings();
+ public void openReportWriter();
+ public void closeReportWriter();
+ public void writeInfo(String info);
+ public void writePerfData(String data);
+ public void writeProperties(String header, Properties props);
+ public void writeProperties(Properties props);
+}
Added:
incubator/activemq/trunk/tooling/maven-activemq-perf-plugin/src/main/java/org/apache/activemq/tool/reports/PerformanceStatisticsUtil.java
URL:
http://svn.apache.org/viewvc/incubator/activemq/trunk/tooling/maven-activemq-perf-plugin/src/main/java/org/apache/activemq/tool/reports/PerformanceStatisticsUtil.java?rev=413651&view=auto
==============================================================================
---
incubator/activemq/trunk/tooling/maven-activemq-perf-plugin/src/main/java/org/apache/activemq/tool/reports/PerformanceStatisticsUtil.java
(added)
+++
incubator/activemq/trunk/tooling/maven-activemq-perf-plugin/src/main/java/org/apache/activemq/tool/reports/PerformanceStatisticsUtil.java
Mon Jun 12 06:33:04 2006
@@ -0,0 +1,100 @@
+/**
+ *
+ * Copyright 2005-2006 The Apache Software Foundation
+ *
+ * Licensed 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;
+
+import java.util.List;
+import java.util.Iterator;
+
+public final class PerformanceStatisticsUtil {
+ private PerformanceStatisticsUtil() {
+ }
+
+ public static long getTotalThroughput(List totalTPList) {
+ long totalTP = 0;
+ if (totalTPList != null) {
+ for (Iterator i=totalTPList.iterator(); i.hasNext();) {
+ totalTP += ((Long)i.next()).longValue();
+ }
+ } else {
+ totalTP = -1;
+ }
+ return totalTP;
+ }
+
+ public static long getMinThroughput(List totalTPList) {
+ long minTP = Long.MAX_VALUE;
+ if (totalTPList != null) {
+ for (Iterator i=totalTPList.iterator(); i.hasNext();) {
+ minTP = Math.min(((Long)i.next()).longValue(), minTP);
+ }
+ } else {
+ minTP = -1;
+ }
+ return minTP;
+ }
+
+ public static long getMaxThroughput(List totalTPList) {
+ long maxTP = Long.MIN_VALUE;
+ if (totalTPList != null) {
+ for (Iterator i=totalTPList.iterator(); i.hasNext();) {
+ maxTP = Math.max(((Long)i.next()).longValue(), maxTP);
+ }
+ } else {
+ maxTP = -1;
+ }
+ return maxTP;
+ }
+
+ public static double getAveThroughput(List totalTPList) {
+ double aveTP;
+ if (totalTPList != null) {
+ int sampleCount = 0;
+ long totalTP = 0;
+ for (Iterator i=totalTPList.iterator(); i.hasNext();) {
+ sampleCount++;
+ totalTP += ((Long)i.next()).longValue();
+ }
+ return (double)totalTP / (double)sampleCount;
+ } else {
+ aveTP = -1;
+ }
+ return aveTP;
+ }
+
+ public static double getAveThroughputExcludingMinMax(List totalTPList) {
+ double aveTP;
+ long minTP = getMinThroughput(totalTPList);
+ long maxTP = getMaxThroughput(totalTPList);
+ if (totalTPList != null) {
+ int sampleCount = 0;
+ long totalTP = 0;
+ long sampleTP;
+ for (Iterator i=totalTPList.iterator(); i.hasNext();) {
+ sampleCount++;
+ sampleTP = ((Long)i.next()).longValue();
+ if (sampleTP != minTP && sampleTP != maxTP) {
+ totalTP += sampleTP;
+ }
+ }
+ return (double)totalTP / (double)sampleCount;
+ } else {
+ aveTP = -1;
+ }
+ return aveTP;
+ }
+
+}
Added:
incubator/activemq/trunk/tooling/maven-activemq-perf-plugin/src/main/java/org/apache/activemq/tool/reports/VerbosePerfReportWriter.java
URL:
http://svn.apache.org/viewvc/incubator/activemq/trunk/tooling/maven-activemq-perf-plugin/src/main/java/org/apache/activemq/tool/reports/VerbosePerfReportWriter.java?rev=413651&view=auto
==============================================================================
---
incubator/activemq/trunk/tooling/maven-activemq-perf-plugin/src/main/java/org/apache/activemq/tool/reports/VerbosePerfReportWriter.java
(added)
+++
incubator/activemq/trunk/tooling/maven-activemq-perf-plugin/src/main/java/org/apache/activemq/tool/reports/VerbosePerfReportWriter.java
Mon Jun 12 06:33:04 2006
@@ -0,0 +1,85 @@
+/**
+ *
+ * Copyright 2005-2006 The Apache Software Foundation
+ *
+ * Licensed 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;
+
+import java.util.Properties;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Arrays;
+
+public class VerbosePerfReportWriter extends AbstractPerfReportWriter {
+
+ public void openReportWriter() {
+ writeProperties("System Properties", System.getProperties());
+ }
+
+ public void closeReportWriter() {
+ writeHeader("Performance Summary");
+ writePerfSummary();
+ }
+
+ public void writeInfo(String info) {
+ System.out.println("[PERF-INFO]: " + info);
+ }
+
+ public void writeHeader(String header) {
+ char[] border = new char[header.length() + 8]; // +8 for spacing
+ Arrays.fill(border, '#');
+ String borderStr = new String(border);
+
+ System.out.println(borderStr);
+ System.out.println("# " + header + " #");
+ System.out.println(borderStr);
+ }
+
+ public void writePerfData(String data) {
+ System.out.println("[PERF-DATA]: " + data);
+ // Assume data is a CSV of key-value pair
+ parsePerfCsvData(data);
+ }
+
+ public void writeProperties(String header, Properties props) {
+ writeHeader(header);
+ writeProperties(props);
+ }
+
+ public void writeProperties(Properties props) {
+ for (Iterator i=props.keySet().iterator(); i.hasNext();) {
+ String key = (String)i.next();
+ String val = props.getProperty(key, "");
+ System.out.println("[PERF-PROP]: " + key + "=" + val);
+ }
+ }
+
+ public void writePerfSummary() {
+ Map summary = createPerfSummary(clientThroughputs);
+
+ System.out.println("[PERF-SUMMARY] System Total Throughput: " +
summary.get(KEY_SYS_TOTAL_TP));
+ System.out.println("[PERF-SUMMARY] System Total Clients: " +
summary.get(KEY_SYS_TOTAL_CLIENTS));
+ System.out.println("[PERF-SUMMARY] System Average Throughput: " +
summary.get(KEY_SYS_AVE_TP));
+ System.out.println("[PERF-SUMMARY] System Average Throughput Excluding
Min/Max: " + summary.get(KEY_SYS_AVE_EMM_TP));
+ System.out.println("[PERF-SUMMARY] Min Client Throughput Per Sample: "
+ summary.get(KEY_MIN_CLIENT_TP));
+ System.out.println("[PERF-SUMMARY] Max Client Throughput Per Sample: "
+ summary.get(KEY_MAX_CLIENT_TP));
+ System.out.println("[PERF-SUMMARY] Min Client Total Throughput: " +
summary.get(KEY_MIN_CLIENT_TOTAL_TP));
+ System.out.println("[PERF-SUMMARY] Max Client Total Throughput: " +
summary.get(KEY_MAX_CLIENT_TOTAL_TP));
+ System.out.println("[PERF-SUMMARY] Min Client Average Throughput: " +
summary.get(KEY_MIN_CLIENT_AVE_TP));
+ System.out.println("[PERF-SUMMARY] Max Client Average Throughput: " +
summary.get(KEY_MAX_CLIENT_AVE_TP));
+ System.out.println("[PERF-SUMMARY] Min Client Average Throughput
Excluding Min/Max: " + summary.get(KEY_MIN_CLIENT_AVE_EMM_TP));
+ System.out.println("[PERF-SUMMARY] Max Client Average Throughput
Excluding Min/Max: " + summary.get(KEY_MAX_CLIENT_AVE_EMM_TP));
+ }
+
+}
Added:
incubator/activemq/trunk/tooling/maven-activemq-perf-plugin/src/main/java/org/apache/activemq/tool/reports/XmlFilePerfReportWriter.java
URL:
http://svn.apache.org/viewvc/incubator/activemq/trunk/tooling/maven-activemq-perf-plugin/src/main/java/org/apache/activemq/tool/reports/XmlFilePerfReportWriter.java?rev=413651&view=auto
==============================================================================
---
incubator/activemq/trunk/tooling/maven-activemq-perf-plugin/src/main/java/org/apache/activemq/tool/reports/XmlFilePerfReportWriter.java
(added)
+++
incubator/activemq/trunk/tooling/maven-activemq-perf-plugin/src/main/java/org/apache/activemq/tool/reports/XmlFilePerfReportWriter.java
Mon Jun 12 06:33:04 2006
@@ -0,0 +1,312 @@
+/**
+ *
+ * Copyright 2005-2006 The Apache Software Foundation
+ *
+ * Licensed 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;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import java.util.Properties;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Iterator;
+import java.util.StringTokenizer;
+import java.io.File;
+import java.io.PrintWriter;
+import java.io.BufferedOutputStream;
+import java.io.FileOutputStream;
+import java.io.FileNotFoundException;
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.io.FileInputStream;
+import java.io.IOException;
+
+public class XmlFilePerfReportWriter extends AbstractPerfReportWriter {
+ private static final Log log =
LogFactory.getLog(XmlFilePerfReportWriter.class);
+
+ private File tempLogFile;
+ private PrintWriter tempLogFileWriter;
+
+ private File xmlFile;
+ private PrintWriter xmlFileWriter;
+
+ private String reportDir;
+ private String reportName;
+
+ private Map testPropsMap;
+ private List testPropsList;
+
+ public XmlFilePerfReportWriter() {
+ this("", "PerformanceReport.xml");
+ }
+
+ public XmlFilePerfReportWriter(String reportDir, String reportName) {
+ this.testPropsMap = new HashMap();
+ this.testPropsList = new ArrayList();
+ this.reportDir = reportDir;
+ this.reportName = reportName;
+ }
+
+ public void openReportWriter() {
+ if (tempLogFile == null) {
+ tempLogFile = createTempLogFile();
+ }
+
+ try {
+ // Disable auto-flush and allocate 100kb of buffer
+ tempLogFileWriter = new PrintWriter(new BufferedOutputStream(new
FileOutputStream(tempLogFile), 102400), false);
+ } catch (FileNotFoundException e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void closeReportWriter() {
+ // Flush and close log file writer
+ tempLogFileWriter.flush();
+ tempLogFileWriter.close();
+
+ writeToXml();
+ }
+
+ public String getReportDir() {
+ return reportDir;
+ }
+
+ public void setReportDir(String reportDir) {
+ this.reportDir = reportDir;
+ }
+
+ public String getReportName() {
+ return reportName;
+ }
+
+ public void setReportName(String reportName) {
+ this.reportName = reportName;
+ }
+
+ public void writeInfo(String info) {
+ tempLogFileWriter.println("[INFO]" + info);
+ }
+
+ public void writePerfData(String data) {
+ tempLogFileWriter.println("[DATA]" + data);
+ }
+
+ public void writeProperties(String header, Properties props) {
+ testPropsMap.put(header, props);
+ }
+
+ public void writeProperties(Properties props) {
+ testPropsList.add(props);
+ }
+
+ protected File createTempLogFile() {
+ File f = null;
+ try {
+ f = File.createTempFile("tmpPL", null);
+ } catch (IOException e) {
+ f = new File("tmpPL" + System.currentTimeMillis() + ".tmp");
+ }
+ f.deleteOnExit();
+ return f;
+ }
+
+ protected File createXmlFile() {
+ String filename = (getReportName().endsWith(".xml") ? getReportName()
: (getReportName() + ".xml"));
+ String path = (getReportDir() == null) ? "" : getReportDir();
+
+ File f = new File(path + filename);
+ return f;
+ }
+
+ protected void writeToXml() {
+ try {
+ xmlFile = createXmlFile();
+ xmlFileWriter = new PrintWriter(new FileOutputStream(xmlFile));
+ writeXmlHeader();
+ writeXmlTestSettings();
+ writeXmlLogFile();
+ writeXmlPerfSummary();
+ writeXmlFooter();
+ xmlFileWriter.close();
+
+ System.out.println("Created performance report: " +
xmlFile.getAbsolutePath());
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ protected void writeXmlHeader() {
+ xmlFileWriter.println("<testResult>");
+ }
+
+ protected void writeXmlFooter() {
+ xmlFileWriter.println("</testResult>");
+ }
+
+ protected void writeXmlTestSettings() {
+ Properties props;
+ // Write system settings
+ writeMap("systemSettings", System.getProperties());
+
+ // Write test settings
+ for (Iterator i=testPropsMap.keySet().iterator(); i.hasNext();) {
+ String key = (String)i.next();
+ props = (Properties)testPropsMap.get(key);
+ writeMap(key, props);
+ }
+
+ int count = 1;
+ for (Iterator i=testPropsList.iterator(); i.hasNext();) {
+ props = (Properties)i.next();
+ writeMap("settings" + count++, props);
+ }
+ }
+
+ protected void writeXmlLogFile() throws IOException {
+ // Write throughput data
+ xmlFileWriter.println("<property name='performanceData'>");
+ xmlFileWriter.println("<list>");
+
+ BufferedReader reader = new BufferedReader(new InputStreamReader(new
FileInputStream(tempLogFile)));
+ String line;
+ while ((line = reader.readLine()) != null) {
+ if (line.startsWith("[DATA]")) {
+ parsePerfCsvData(line.substring("[DATA]".length()));
+ } else if (line.startsWith("[INFO]")) {
+ xmlFileWriter.println("<value>" + line + "</value>");
+ } else {
+ xmlFileWriter.println("<value>[ERROR]" + line + "</value>");
+ }
+ }
+
+ xmlFileWriter.println("</list>");
+ xmlFileWriter.println("</property>");
+ }
+
+ protected void writeXmlPerfSummary() {
+ Map summary = createPerfSummary(clientThroughputs);
+
+ xmlFileWriter.println("<property name='perfSummary'>");
+ xmlFileWriter.println("<props>");
+
+ String val, clientName, clientVal;
+
+ val = (String)summary.get(KEY_SYS_TOTAL_TP);
+ System.out.println("System Total Throughput: " + val);
+ xmlFileWriter.println("<prop key='" + KEY_SYS_TOTAL_TP + "'>" + val +
"</prop>");
+
+ val = (String)summary.get(KEY_SYS_TOTAL_CLIENTS);
+ System.out.println("System Total Clients: " + val);
+ xmlFileWriter.println("<prop key='" + KEY_SYS_TOTAL_CLIENTS + "'>" +
val + "</prop>");
+
+ val = (String)summary.get(KEY_SYS_AVE_TP);
+ System.out.println("System Average Throughput: " + val);
+ xmlFileWriter.println("<prop key='" + KEY_SYS_AVE_TP + "'>" + val +
"</prop>");
+
+ val = (String)summary.get(KEY_SYS_AVE_EMM_TP);
+ System.out.println("System Average Throughput Excluding Min/Max: " +
val);
+ xmlFileWriter.println("<prop key='" + KEY_SYS_AVE_EMM_TP + "'>" + val
+ "</prop>");
+
+ val = (String)summary.get(KEY_MIN_CLIENT_TP);
+ clientName = val.substring(0, val.indexOf("="));
+ clientVal = val.substring(val.indexOf("=") + 1);
+ System.out.println("Min Client Throughput Per Sample: clientName=" +
clientName + ", value=" + clientVal);
+ xmlFileWriter.println("<prop key='" + KEY_MIN_CLIENT_TP +
"'>clientName=" + clientName + ",value=" + clientVal + "</prop>");
+
+ val = (String)summary.get(KEY_MAX_CLIENT_TP);
+ clientName = val.substring(0, val.indexOf("="));
+ clientVal = val.substring(val.indexOf("=") + 1);
+ System.out.println("Max Client Throughput Per Sample: clientName=" +
clientName + ", value=" + clientVal);
+ xmlFileWriter.println("<prop key='" + KEY_MAX_CLIENT_TP +
"'>clientName=" + clientName + ",value=" + clientVal + "</prop>");
+
+ val = (String)summary.get(KEY_MIN_CLIENT_TOTAL_TP);
+ clientName = val.substring(0, val.indexOf("="));
+ clientVal = val.substring(val.indexOf("=") + 1);
+ System.out.println("Min Client Total Throughput: clientName=" +
clientName + ", value=" + clientVal);
+ xmlFileWriter.println("<prop key='" + KEY_MIN_CLIENT_TOTAL_TP +
"'>clientName=" + clientName + ",value=" + clientVal + "</prop>");
+
+ val = (String)summary.get(KEY_MAX_CLIENT_TOTAL_TP);
+ clientName = val.substring(0, val.indexOf("="));
+ clientVal = val.substring(val.indexOf("=") + 1);
+ System.out.println("Max Client Total Throughput: clientName=" +
clientName + ", value=" + clientVal);
+ xmlFileWriter.println("<prop key='" + KEY_MAX_CLIENT_TOTAL_TP +
"'>clientName=" + clientName + ",value=" + clientVal + "</prop>");
+
+ val = (String)summary.get(KEY_MIN_CLIENT_AVE_TP);
+ clientName = val.substring(0, val.indexOf("="));
+ clientVal = val.substring(val.indexOf("=") + 1);
+ System.out.println("Min Average Client Throughput: clientName=" +
clientName + ", value=" + clientVal);
+ xmlFileWriter.println("<prop key='" + KEY_MIN_CLIENT_AVE_TP +
"'>clientName=" + clientName + ",value=" + clientVal + "</prop>");
+
+ val = (String)summary.get(KEY_MAX_CLIENT_AVE_TP);
+ clientName = val.substring(0, val.indexOf("="));
+ clientVal = val.substring(val.indexOf("=") + 1);
+ System.out.println("Max Average Client Throughput: clientName=" +
clientName + ", value=" + clientVal);
+ xmlFileWriter.println("<prop key='" + KEY_MAX_CLIENT_AVE_TP +
"'>clientName=" + clientName + ",value=" + clientVal + "</prop>");
+
+ val = (String)summary.get(KEY_MIN_CLIENT_AVE_EMM_TP);
+ clientName = val.substring(0, val.indexOf("="));
+ clientVal = val.substring(val.indexOf("=") + 1);
+ System.out.println("Min Average Client Throughput Excluding Min/Max:
clientName=" + clientName + ", value=" + clientVal);
+ xmlFileWriter.println("<prop key='" + KEY_MIN_CLIENT_AVE_EMM_TP +
"'>clientName=" + clientName + ",value=" + clientVal + "</prop>");
+
+ val = (String)summary.get(KEY_MAX_CLIENT_AVE_EMM_TP);
+ clientName = val.substring(0, val.indexOf("="));
+ clientVal = val.substring(val.indexOf("=") + 1);
+ System.out.println("Max Average Client Throughput Excluding Min/Max:
clientName=" + clientName + ", value=" + clientVal);
+ xmlFileWriter.println("<prop key='" + KEY_MAX_CLIENT_AVE_EMM_TP +
"'>clientName=" + clientName + ",value=" + clientVal + "</prop>");
+
+ xmlFileWriter.println("</props>");
+ xmlFileWriter.println("</property>");
+ }
+
+ protected void writeMap(String name, Map map) {
+ xmlFileWriter.println("<property name='" + name + "'>");
+ xmlFileWriter.println("<props>");
+ for (Iterator i=map.keySet().iterator(); i.hasNext();) {
+ String propKey = (String)i.next();
+ Object propVal = map.get(propKey);
+ xmlFileWriter.println("<prop key='" + propKey + "'>" +
propVal.toString() + "</prop>");
+ }
+ xmlFileWriter.println("</props>");
+ xmlFileWriter.println("</property>");
+ }
+
+ protected void parsePerfCsvData(String csvData) {
+ StringTokenizer tokenizer = new StringTokenizer(csvData, ",");
+ String data, key, val, clientName = null;
+ Long throughput = null;
+ int index = -1;
+ 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 if (key.equalsIgnoreCase("index")) {
+ index = Integer.parseInt(val);
+ }
+ }
+ addToClientTPList(clientName, throughput);
+ xmlFileWriter.println("<value index='" + index + "' clientName='" +
clientName +
+ "'>" + throughput.longValue() + "</value>");
+ }
+}