From 92fb5fb76f914a9e9f2bffc1d47924a8bdc93e57 Mon Sep 17 00:00:00 2001 From: Zhen Tang Date: Fri, 28 Jun 2013 16:33:15 +0800 Subject: [PATCH] Test status service added. --- .../org/bench4q/agent/api/TestController.java | 119 +++++++++++++++--- .../agent/api/model/TestBriefStatusModel.java | 81 ++++++++++++ .../agent/api/model/TestDetailModel.java | 80 ++++++++++++ .../api/model/TestDetailStatusModel.java | 94 ++++++++++++++ .../bench4q/agent/plugin/BehaviorResult.java | 36 ++++++ .../bench4q/agent/plugin/http/HttpPlugin.java | 26 ++-- .../plugin/timer/ConstantTimerPlugin.java | 14 +-- .../agent/scenario/ScenarioContext.java | 22 +++- .../agent/scenario/ScenarioEngine.java | 26 +++- 9 files changed, 442 insertions(+), 56 deletions(-) create mode 100644 src/main/java/org/bench4q/agent/api/model/TestBriefStatusModel.java create mode 100644 src/main/java/org/bench4q/agent/api/model/TestDetailModel.java create mode 100644 src/main/java/org/bench4q/agent/api/model/TestDetailStatusModel.java diff --git a/src/main/java/org/bench4q/agent/api/TestController.java b/src/main/java/org/bench4q/agent/api/TestController.java index 1cb78ca2..b81ac049 100644 --- a/src/main/java/org/bench4q/agent/api/TestController.java +++ b/src/main/java/org/bench4q/agent/api/TestController.java @@ -1,8 +1,13 @@ package org.bench4q.agent.api; -import java.util.Map; +import java.util.ArrayList; +import java.util.List; import java.util.UUID; +import org.bench4q.agent.api.model.TestBriefStatusModel; +import org.bench4q.agent.api.model.TestDetailModel; +import org.bench4q.agent.api.model.TestDetailStatusModel; +import org.bench4q.agent.plugin.BehaviorResult; import org.bench4q.agent.scenario.Parameter; import org.bench4q.agent.scenario.Scenario; import org.bench4q.agent.scenario.ScenarioContext; @@ -11,6 +16,7 @@ import org.bench4q.agent.scenario.UsePlugin; import org.bench4q.agent.scenario.UserBehavior; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; @@ -31,7 +37,7 @@ public class TestController { @RequestMapping(value = "/run", method = RequestMethod.GET) @ResponseBody - public String run() { + public UUID run() { Scenario scenario = new Scenario(); scenario.setUsePlugins(new UsePlugin[2]); @@ -53,7 +59,15 @@ public class TestController { scenario.getUserBehaviors()[0].getParameters()[0] = new Parameter(); scenario.getUserBehaviors()[0].getParameters()[0].setKey("url"); scenario.getUserBehaviors()[0].getParameters()[0] - .setValue("http://www.baidu.com"); + .setValue("http://localhost:6565"); + + scenario.getUserBehaviors()[2] = new UserBehavior(); + scenario.getUserBehaviors()[2].setUse("timer"); + scenario.getUserBehaviors()[2].setName("Sleep"); + scenario.getUserBehaviors()[2].setParameters(new Parameter[1]); + scenario.getUserBehaviors()[2].getParameters()[0] = new Parameter(); + scenario.getUserBehaviors()[2].getParameters()[0].setKey("time"); + scenario.getUserBehaviors()[2].getParameters()[0].setValue("1000"); scenario.getUserBehaviors()[1] = new UserBehavior(); scenario.getUserBehaviors()[1].setUse("http"); @@ -68,24 +82,91 @@ public class TestController { scenario.getUserBehaviors()[1].getParameters()[1] .setValue("Hello,world!"); - scenario.getUserBehaviors()[2] = new UserBehavior(); - scenario.getUserBehaviors()[2].setUse("timer"); - scenario.getUserBehaviors()[2].setName("Sleep"); - scenario.getUserBehaviors()[2].setParameters(new Parameter[1]); - scenario.getUserBehaviors()[2].getParameters()[0] = new Parameter(); - scenario.getUserBehaviors()[2].getParameters()[0].setKey("time"); - scenario.getUserBehaviors()[2].getParameters()[0].setValue("1000"); - - this.getScenarioEngine().runScenario(UUID.randomUUID(), scenario, 100); - return "It works!"; + UUID uuid = UUID.randomUUID(); + this.getScenarioEngine().runScenario(uuid, scenario, 200); + return uuid; } - @RequestMapping(value = "/status", method = RequestMethod.GET) + @RequestMapping(value = "/detail/{uuid}", method = RequestMethod.GET) @ResponseBody - public String status() { - Map map = this.getScenarioEngine() - .getRunningTests(); - System.out.println(map.toString()); - return "It works!"; + public TestDetailStatusModel detail(@PathVariable UUID uuid) { + ScenarioContext scenarioContext = this.getScenarioEngine() + .getRunningTests().get(uuid); + TestDetailStatusModel testStatusModel = new TestDetailStatusModel(); + testStatusModel.setStartDate(scenarioContext.getStartDate()); + testStatusModel.setTestDetailModels(new ArrayList()); + int failCount = 0; + int successCount = 0; + List behaviorResults = scenarioContext.getResults(); + long maxDate = 0; + long totalResponseTime = 0; + for (BehaviorResult behaviorResult : behaviorResults) { + TestDetailModel testDetailModel = new TestDetailModel(); + testDetailModel.setBehaviorName(behaviorResult.getBehaviorName()); + testDetailModel.setEndDate(behaviorResult.getEndDate()); + testDetailModel.setPluginId(behaviorResult.getPluginId()); + testDetailModel.setPluginName(behaviorResult.getPluginName()); + testDetailModel.setResponseTime(behaviorResult.getResponseTime()); + testDetailModel.setStartDate(behaviorResult.getStartDate()); + testDetailModel.setSuccess(behaviorResult.isSuccess()); + testStatusModel.getTestDetailModels().add(testDetailModel); + if (testDetailModel.getEndDate().getTime() > maxDate) { + maxDate = testDetailModel.getEndDate().getTime(); + } + if (testDetailModel.isSuccess()) { + successCount++; + } else { + failCount++; + } + if (!behaviorResult.getPluginName().contains("Timer")) { + totalResponseTime += behaviorResult.getResponseTime(); + } + } + testStatusModel.setAverageResponseTime((totalResponseTime + 0.0) + / behaviorResults.size()); + testStatusModel.setElapsedTime(maxDate + - testStatusModel.getStartDate().getTime()); + testStatusModel.setFailCount(failCount); + testStatusModel.setSuccessCount(successCount); + testStatusModel.setFinishedCount(testStatusModel.getTestDetailModels() + .size()); + testStatusModel.setTotalCount(scenarioContext.getTotalCount()); + return testStatusModel; + } + + @RequestMapping(value = "/brief/{uuid}", method = RequestMethod.GET) + @ResponseBody + public TestBriefStatusModel brief(@PathVariable UUID uuid) { + ScenarioContext scenarioContext = this.getScenarioEngine() + .getRunningTests().get(uuid); + TestBriefStatusModel testBriefStatusModel = new TestBriefStatusModel(); + testBriefStatusModel.setStartDate(scenarioContext.getStartDate()); + int failCount = 0; + int successCount = 0; + long totalResponseTime = 0; + List behaviorResults = scenarioContext.getResults(); + long maxDate = 0; + for (BehaviorResult behaviorResult : behaviorResults) { + if (behaviorResult.getEndDate().getTime() > maxDate) { + maxDate = behaviorResult.getEndDate().getTime(); + } + if (behaviorResult.isSuccess()) { + successCount++; + } else { + failCount++; + } + if (!behaviorResult.getPluginName().contains("Timer")) { + totalResponseTime += behaviorResult.getResponseTime(); + } + } + testBriefStatusModel.setAverageResponseTime((totalResponseTime + 0.0) + / behaviorResults.size()); + testBriefStatusModel.setElapsedTime(maxDate + - testBriefStatusModel.getStartDate().getTime()); + testBriefStatusModel.setFailCount(failCount); + testBriefStatusModel.setSuccessCount(successCount); + testBriefStatusModel.setFinishedCount(behaviorResults.size()); + testBriefStatusModel.setTotalCount(scenarioContext.getTotalCount()); + return testBriefStatusModel; } } diff --git a/src/main/java/org/bench4q/agent/api/model/TestBriefStatusModel.java b/src/main/java/org/bench4q/agent/api/model/TestBriefStatusModel.java new file mode 100644 index 00000000..e6dd9467 --- /dev/null +++ b/src/main/java/org/bench4q/agent/api/model/TestBriefStatusModel.java @@ -0,0 +1,81 @@ +package org.bench4q.agent.api.model; + +import java.util.Date; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +@XmlRootElement(name = "testBriefStatus") +public class TestBriefStatusModel { + private Date startDate; + private long elapsedTime; + private int successCount; + private int failCount; + private int finishedCount; + private int totalCount; + private double averageResponseTime; + + @XmlElement + public Date getStartDate() { + return startDate; + } + + public void setStartDate(Date startDate) { + this.startDate = startDate; + } + + @XmlElement + public long getElapsedTime() { + return elapsedTime; + } + + public void setElapsedTime(long elapsedTime) { + this.elapsedTime = elapsedTime; + } + + @XmlElement + public int getSuccessCount() { + return successCount; + } + + public void setSuccessCount(int successCount) { + this.successCount = successCount; + } + + @XmlElement + public int getFailCount() { + return failCount; + } + + public void setFailCount(int failCount) { + this.failCount = failCount; + } + + @XmlElement + public int getFinishedCount() { + return finishedCount; + } + + public void setFinishedCount(int finishedCount) { + this.finishedCount = finishedCount; + } + + @XmlElement + public int getTotalCount() { + return totalCount; + } + + public void setTotalCount(int totalCount) { + this.totalCount = totalCount; + } + + @XmlElement + public double getAverageResponseTime() { + return averageResponseTime; + } + + public void setAverageResponseTime(double averageResponseTime) { + this.averageResponseTime = averageResponseTime; + } + +} diff --git a/src/main/java/org/bench4q/agent/api/model/TestDetailModel.java b/src/main/java/org/bench4q/agent/api/model/TestDetailModel.java new file mode 100644 index 00000000..07efb0cc --- /dev/null +++ b/src/main/java/org/bench4q/agent/api/model/TestDetailModel.java @@ -0,0 +1,80 @@ +package org.bench4q.agent.api.model; + +import java.util.Date; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +@XmlRootElement(name = "testDetail") +public class TestDetailModel { + private String pluginId; + private String pluginName; + private String behaviorName; + private Date startDate; + private Date endDate; + private long responseTime; + private boolean success; + + @XmlElement + public String getPluginId() { + return pluginId; + } + + public void setPluginId(String pluginId) { + this.pluginId = pluginId; + } + + @XmlElement + public String getPluginName() { + return pluginName; + } + + public void setPluginName(String pluginName) { + this.pluginName = pluginName; + } + + @XmlElement + public String getBehaviorName() { + return behaviorName; + } + + public void setBehaviorName(String behaviorName) { + this.behaviorName = behaviorName; + } + + @XmlElement + public Date getStartDate() { + return startDate; + } + + public void setStartDate(Date startDate) { + this.startDate = startDate; + } + + @XmlElement + public Date getEndDate() { + return endDate; + } + + public void setEndDate(Date endDate) { + this.endDate = endDate; + } + + @XmlElement + public long getResponseTime() { + return responseTime; + } + + public void setResponseTime(long responseTime) { + this.responseTime = responseTime; + } + + @XmlElement + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } +} diff --git a/src/main/java/org/bench4q/agent/api/model/TestDetailStatusModel.java b/src/main/java/org/bench4q/agent/api/model/TestDetailStatusModel.java new file mode 100644 index 00000000..a94f2225 --- /dev/null +++ b/src/main/java/org/bench4q/agent/api/model/TestDetailStatusModel.java @@ -0,0 +1,94 @@ +package org.bench4q.agent.api.model; + +import java.util.Date; +import java.util.List; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlElementWrapper; +import javax.xml.bind.annotation.XmlRootElement; + +@XmlRootElement(name = "testDetailStatus") +public class TestDetailStatusModel { + private Date startDate; + private long elapsedTime; + private int successCount; + private int failCount; + private int finishedCount; + private int totalCount; + private double averageResponseTime; + private List testDetailModels; + + @XmlElement + public Date getStartDate() { + return startDate; + } + + public void setStartDate(Date startDate) { + this.startDate = startDate; + } + + @XmlElement + public long getElapsedTime() { + return elapsedTime; + } + + public void setElapsedTime(long elapsedTime) { + this.elapsedTime = elapsedTime; + } + + @XmlElement + public int getSuccessCount() { + return successCount; + } + + public void setSuccessCount(int successCount) { + this.successCount = successCount; + } + + @XmlElement + public int getFailCount() { + return failCount; + } + + public void setFailCount(int failCount) { + this.failCount = failCount; + } + + @XmlElement + public int getFinishedCount() { + return finishedCount; + } + + public void setFinishedCount(int finishedCount) { + this.finishedCount = finishedCount; + } + + @XmlElement + public int getTotalCount() { + return totalCount; + } + + public void setTotalCount(int totalCount) { + this.totalCount = totalCount; + } + + @XmlElement + public double getAverageResponseTime() { + return averageResponseTime; + } + + public void setAverageResponseTime(double averageResponseTime) { + this.averageResponseTime = averageResponseTime; + } + + @XmlElementWrapper(name = "testDetails") + @XmlElement(name = "testDetail") + public List getTestDetailModels() { + return testDetailModels; + } + + public void setTestDetailModels(List testDetailModels) { + this.testDetailModels = testDetailModels; + } + +} diff --git a/src/main/java/org/bench4q/agent/plugin/BehaviorResult.java b/src/main/java/org/bench4q/agent/plugin/BehaviorResult.java index 1376643e..9676d8c4 100644 --- a/src/main/java/org/bench4q/agent/plugin/BehaviorResult.java +++ b/src/main/java/org/bench4q/agent/plugin/BehaviorResult.java @@ -3,10 +3,38 @@ package org.bench4q.agent.plugin; import java.util.Date; public class BehaviorResult { + private String pluginId; + private String pluginName; + private String behaviorName; private Date startDate; private Date endDate; + private long responseTime; private boolean success; + public String getPluginId() { + return pluginId; + } + + public void setPluginId(String pluginId) { + this.pluginId = pluginId; + } + + public String getPluginName() { + return pluginName; + } + + public void setPluginName(String pluginName) { + this.pluginName = pluginName; + } + + public String getBehaviorName() { + return behaviorName; + } + + public void setBehaviorName(String behaviorName) { + this.behaviorName = behaviorName; + } + public Date getStartDate() { return startDate; } @@ -23,6 +51,14 @@ public class BehaviorResult { this.endDate = endDate; } + public long getResponseTime() { + return responseTime; + } + + public void setResponseTime(long responseTime) { + this.responseTime = responseTime; + } + public boolean isSuccess() { return success; } diff --git a/src/main/java/org/bench4q/agent/plugin/http/HttpPlugin.java b/src/main/java/org/bench4q/agent/plugin/http/HttpPlugin.java index 6e10b93f..f50c861d 100644 --- a/src/main/java/org/bench4q/agent/plugin/http/HttpPlugin.java +++ b/src/main/java/org/bench4q/agent/plugin/http/HttpPlugin.java @@ -5,22 +5,18 @@ import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.HttpURLConnection; import java.net.URL; -import java.util.Date; - import org.bench4q.agent.plugin.Behavior; -import org.bench4q.agent.plugin.BehaviorResult; import org.bench4q.agent.plugin.Plugin; @Plugin("Http") public class HttpPlugin { + public HttpPlugin() { } @Behavior("Get") - public BehaviorResult get(String url) { - BehaviorResult behaviorResult = new BehaviorResult(); - behaviorResult.setStartDate(new Date(System.currentTimeMillis())); + public boolean get(String url) { try { URL target = new URL(url); HttpURLConnection httpURLConnection = (HttpURLConnection) target @@ -37,20 +33,15 @@ public class HttpPlugin { stringBuffer.append((char) temp); } bufferedReader.close(); - behaviorResult.setSuccess(true); + return true; } catch (Exception e) { e.printStackTrace(); - behaviorResult.setSuccess(false); - } finally { - behaviorResult.setEndDate(new Date(System.currentTimeMillis())); + return false; } - return behaviorResult; } @Behavior("Post") - public BehaviorResult post(String url, String content) { - BehaviorResult behaviorResult = new BehaviorResult(); - behaviorResult.setStartDate(new Date(System.currentTimeMillis())); + public boolean post(String url, String content) { try { URL target = new URL(url); HttpURLConnection httpURLConnection = (HttpURLConnection) target @@ -72,13 +63,10 @@ public class HttpPlugin { stringBuffer.append((char) temp); } bufferedReader.close(); - behaviorResult.setSuccess(true); + return true; } catch (Exception e) { e.printStackTrace(); - behaviorResult.setSuccess(false); - } finally { - behaviorResult.setEndDate(new Date(System.currentTimeMillis())); + return false; } - return behaviorResult; } } diff --git a/src/main/java/org/bench4q/agent/plugin/timer/ConstantTimerPlugin.java b/src/main/java/org/bench4q/agent/plugin/timer/ConstantTimerPlugin.java index 989d39bb..f0cd8dfe 100644 --- a/src/main/java/org/bench4q/agent/plugin/timer/ConstantTimerPlugin.java +++ b/src/main/java/org/bench4q/agent/plugin/timer/ConstantTimerPlugin.java @@ -1,9 +1,6 @@ package org.bench4q.agent.plugin.timer; -import java.util.Date; - import org.bench4q.agent.plugin.Behavior; -import org.bench4q.agent.plugin.BehaviorResult; import org.bench4q.agent.plugin.Plugin; @Plugin("ConstantTimer") @@ -13,18 +10,13 @@ public class ConstantTimerPlugin { } @Behavior("Sleep") - public BehaviorResult sleep(int time) { - BehaviorResult behaviorResult = new BehaviorResult(); - behaviorResult.setStartDate(new Date(System.currentTimeMillis())); + public boolean sleep(int time) { try { Thread.sleep(time); - behaviorResult.setSuccess(true); + return true; } catch (Exception e) { e.printStackTrace(); - behaviorResult.setSuccess(false); - } finally { - behaviorResult.setEndDate(new Date(System.currentTimeMillis())); + return false; } - return behaviorResult; } } diff --git a/src/main/java/org/bench4q/agent/scenario/ScenarioContext.java b/src/main/java/org/bench4q/agent/scenario/ScenarioContext.java index bc3fb080..08ec51c9 100644 --- a/src/main/java/org/bench4q/agent/scenario/ScenarioContext.java +++ b/src/main/java/org/bench4q/agent/scenario/ScenarioContext.java @@ -1,15 +1,34 @@ package org.bench4q.agent.scenario; +import java.util.Date; import java.util.List; import java.util.concurrent.ExecutorService; import org.bench4q.agent.plugin.BehaviorResult; public class ScenarioContext { + private int totalCount; + private Date startDate; private ExecutorService executorService; private Scenario scenario; private List results; + public int getTotalCount() { + return totalCount; + } + + public void setTotalCount(int totalCount) { + this.totalCount = totalCount; + } + + public Date getStartDate() { + return startDate; + } + + public void setStartDate(Date startDate) { + this.startDate = startDate; + } + public ExecutorService getExecutorService() { return executorService; } @@ -33,6 +52,5 @@ public class ScenarioContext { public void setResults(List results) { this.results = results; } - - + } diff --git a/src/main/java/org/bench4q/agent/scenario/ScenarioEngine.java b/src/main/java/org/bench4q/agent/scenario/ScenarioEngine.java index e90b51d8..bac15e19 100644 --- a/src/main/java/org/bench4q/agent/scenario/ScenarioEngine.java +++ b/src/main/java/org/bench4q/agent/scenario/ScenarioEngine.java @@ -2,6 +2,7 @@ package org.bench4q.agent.scenario; import java.util.ArrayList; import java.util.Collections; +import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -10,6 +11,7 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import org.bench4q.agent.plugin.BehaviorResult; +import org.bench4q.agent.plugin.Plugin; import org.bench4q.agent.plugin.PluginManager; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -44,12 +46,15 @@ public class ScenarioEngine { return this.getRunningTests().get(uuid); } - public void runScenario(UUID uuid, final Scenario scenario, int threadCount) { + public void runScenario(UUID uuid, final Scenario scenario, int totalCount) { try { ScenarioContext scenarioContext = new ScenarioContext(); scenarioContext.setScenario(scenario); + scenarioContext.setTotalCount(totalCount + * scenario.getUserBehaviors().length); + scenarioContext.setStartDate(new Date(System.currentTimeMillis())); ExecutorService executorService = Executors - .newFixedThreadPool(threadCount); + .newFixedThreadPool(totalCount); scenarioContext.setExecutorService(executorService); int i; final List ret = Collections @@ -61,7 +66,7 @@ public class ScenarioEngine { ret.addAll(doRunScenario(scenario)); } }; - for (i = 0; i < threadCount; i++) { + for (i = 0; i < totalCount; i++) { executorService.execute(runnable); } executorService.shutdown(); @@ -94,8 +99,19 @@ public class ScenarioEngine { behaviorParameters .put(parameter.getKey(), parameter.getValue()); } - ret.add((BehaviorResult) this.getPluginManager().doBehavior(plugin, - behaviorName, behaviorParameters)); + BehaviorResult result = new BehaviorResult(); + result.setStartDate(new Date(System.currentTimeMillis())); + boolean success = (Boolean) this.getPluginManager().doBehavior( + plugin, behaviorName, behaviorParameters); + result.setEndDate(new Date(System.currentTimeMillis())); + result.setSuccess(success); + result.setResponseTime(result.getEndDate().getTime() + - result.getStartDate().getTime()); + result.setBehaviorName(behaviorName); + result.setPluginId(userBehavior.getUse()); + result.setPluginName(plugin.getClass().getAnnotation(Plugin.class) + .value()); + ret.add(result); } return ret; }