Merge branch 'dev' of github.com:fit2cloudrd/metersphere-server into dev
This commit is contained in:
commit
4cc73c172c
|
@ -9,6 +9,7 @@ import io.metersphere.commons.utils.Pager;
|
||||||
import io.metersphere.controller.request.ReportRequest;
|
import io.metersphere.controller.request.ReportRequest;
|
||||||
import io.metersphere.dto.ReportDTO;
|
import io.metersphere.dto.ReportDTO;
|
||||||
import io.metersphere.report.base.RequestStatistics;
|
import io.metersphere.report.base.RequestStatistics;
|
||||||
|
import io.metersphere.report.base.RequestStatisticsDTO;
|
||||||
import io.metersphere.service.ReportService;
|
import io.metersphere.service.ReportService;
|
||||||
import io.metersphere.user.SessionUtils;
|
import io.metersphere.user.SessionUtils;
|
||||||
import org.apache.shiro.authz.annotation.Logical;
|
import org.apache.shiro.authz.annotation.Logical;
|
||||||
|
@ -54,7 +55,7 @@ public class ReportController {
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/content/{reportId}")
|
@GetMapping("/content/{reportId}")
|
||||||
public List<RequestStatistics> getReportContent(@PathVariable String reportId) {
|
public RequestStatisticsDTO getReportContent(@PathVariable String reportId) {
|
||||||
return reportService.getReport(reportId);
|
return reportService.getReport(reportId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,8 @@ import com.opencsv.bean.CsvToBeanBuilder;
|
||||||
import com.opencsv.bean.HeaderColumnNameMappingStrategy;
|
import com.opencsv.bean.HeaderColumnNameMappingStrategy;
|
||||||
import io.metersphere.report.base.Metric;
|
import io.metersphere.report.base.Metric;
|
||||||
import io.metersphere.report.base.RequestStatistics;
|
import io.metersphere.report.base.RequestStatistics;
|
||||||
|
import io.metersphere.report.base.RequestStatisticsDTO;
|
||||||
|
|
||||||
import java.io.Reader;
|
import java.io.Reader;
|
||||||
import java.io.StringReader;
|
import java.io.StringReader;
|
||||||
import java.text.DecimalFormat;
|
import java.text.DecimalFormat;
|
||||||
|
@ -31,9 +33,12 @@ public class JtlResolver {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static List<RequestStatistics> getOneRpsResult(Map<String, List<Metric>> map){
|
private static RequestStatisticsDTO getOneRpsResult(Map<String, List<Metric>> map){
|
||||||
|
RequestStatisticsDTO statisticsDTO = new RequestStatisticsDTO();
|
||||||
List<RequestStatistics> requestStatisticsList = new ArrayList<>();
|
List<RequestStatistics> requestStatisticsList = new ArrayList<>();
|
||||||
Iterator<Map.Entry<String, List<Metric>>> iterator = map.entrySet().iterator();
|
Iterator<Map.Entry<String, List<Metric>>> iterator = map.entrySet().iterator();
|
||||||
|
List<Integer> allelapse = new ArrayList<>();
|
||||||
|
Integer totalAverage = 0;
|
||||||
while (iterator.hasNext()) {
|
while (iterator.hasNext()) {
|
||||||
Map.Entry<String, List<Metric>> entry = iterator.next();
|
Map.Entry<String, List<Metric>> entry = iterator.next();
|
||||||
String label = entry.getKey();
|
String label = entry.getKey();
|
||||||
|
@ -43,7 +48,7 @@ public class JtlResolver {
|
||||||
//总的响应时间
|
//总的响应时间
|
||||||
int sumElapsed=0;
|
int sumElapsed=0;
|
||||||
Integer failSize = 0;
|
Integer failSize = 0;
|
||||||
Integer totalBytes = 0;
|
Float totalBytes = 0f;
|
||||||
List<Integer> elapsedList = new ArrayList<>();
|
List<Integer> elapsedList = new ArrayList<>();
|
||||||
|
|
||||||
for (int i = 0; i < list.size(); i++) {
|
for (int i = 0; i < list.size(); i++) {
|
||||||
|
@ -52,7 +57,9 @@ public class JtlResolver {
|
||||||
//响应时间
|
//响应时间
|
||||||
String elapsed = row.getElapsed();
|
String elapsed = row.getElapsed();
|
||||||
sumElapsed += Integer.valueOf(elapsed);
|
sumElapsed += Integer.valueOf(elapsed);
|
||||||
|
totalAverage += Integer.valueOf(elapsed);
|
||||||
elapsedList.add(Integer.valueOf(elapsed));
|
elapsedList.add(Integer.valueOf(elapsed));
|
||||||
|
allelapse.add(Integer.valueOf(elapsed));
|
||||||
//成功与否
|
//成功与否
|
||||||
String success = row.getSuccess();
|
String success = row.getSuccess();
|
||||||
if (!"true".equals(success)){
|
if (!"true".equals(success)){
|
||||||
|
@ -60,19 +67,14 @@ public class JtlResolver {
|
||||||
}
|
}
|
||||||
//字节
|
//字节
|
||||||
String bytes = row.getBytes();
|
String bytes = row.getBytes();
|
||||||
totalBytes += Integer.valueOf(bytes);
|
totalBytes += Float.valueOf(bytes);
|
||||||
|
|
||||||
index++;
|
index++;
|
||||||
}catch (Exception e){
|
}catch (Exception e){
|
||||||
System.out.println("exception i:"+i);
|
System.out.println("exception i:"+i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Collections.sort(elapsedList, new Comparator<Integer>() {
|
Collections.sort(elapsedList);
|
||||||
public int compare(Integer o1, Integer o2) {
|
|
||||||
return o1-o2;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
Integer tp90 = elapsedList.size()*90/100;
|
Integer tp90 = elapsedList.size()*90/100;
|
||||||
Integer tp95 = elapsedList.size()*95/100;
|
Integer tp95 = elapsedList.size()*95/100;
|
||||||
|
@ -100,16 +102,45 @@ public class JtlResolver {
|
||||||
requestStatistics.setErrors(String.format("%.2f",failSize*100.0/index)+"%");
|
requestStatistics.setErrors(String.format("%.2f",failSize*100.0/index)+"%");
|
||||||
requestStatistics.setKo(failSize);
|
requestStatistics.setKo(failSize);
|
||||||
/**
|
/**
|
||||||
* #Samples/(取最大值(ts+t)-取最小值(ts))*1000
|
* 所有的相同请求的bytes总和 / 1024 / 请求持续运行的时间=sum(bytes)/1024/total time
|
||||||
*/
|
*/
|
||||||
// todo Avg Bandwidth(KBytes/s)
|
// todo Avg Bandwidth(KBytes/s)
|
||||||
requestStatistics.setKbPerSec(String.format("%.2f",totalBytes*1.0/1024/(l*1.0/1000)));
|
requestStatistics.setKbPerSec(String.format("%.2f",totalBytes*1.0/1024/(l*1.0/1000)));
|
||||||
requestStatisticsList.add(requestStatistics);
|
requestStatisticsList.add(requestStatistics);
|
||||||
}
|
}
|
||||||
return requestStatisticsList;
|
Collections.sort(allelapse);
|
||||||
|
|
||||||
|
Integer totalTP90 = allelapse.size()*90/100;
|
||||||
|
Integer totalTP95 = allelapse.size()*95/100;
|
||||||
|
Integer totalTP99 = allelapse.size()*99/100;
|
||||||
|
|
||||||
|
Integer min = allelapse.get(0);
|
||||||
|
Integer max = allelapse.get(allelapse.size() - 1);
|
||||||
|
|
||||||
|
Integer allSamples = requestStatisticsList.stream().mapToInt(RequestStatistics::getSamples).sum();
|
||||||
|
Integer failSize = requestStatisticsList.stream().mapToInt(RequestStatistics::getKo).sum();
|
||||||
|
DecimalFormat df = new DecimalFormat("0.00");
|
||||||
|
double errors = (double)failSize / allSamples * 100;
|
||||||
|
String totalerrors = df.format(errors);
|
||||||
|
double average = (double)totalAverage / allSamples;
|
||||||
|
String totalaverage = df.format(average);
|
||||||
|
|
||||||
|
statisticsDTO.setRequestStatisticsList(requestStatisticsList);
|
||||||
|
statisticsDTO.setTotalLabel("Total");
|
||||||
|
statisticsDTO.setTotalSamples(String.valueOf(allSamples));
|
||||||
|
statisticsDTO.setTotalErrors(totalerrors + "%");
|
||||||
|
statisticsDTO.setTotalAverage(totalaverage);
|
||||||
|
statisticsDTO.setTotalMin(String.valueOf(min));
|
||||||
|
statisticsDTO.setTotalMax(String.valueOf(max));
|
||||||
|
statisticsDTO.setTotalTP90(String.valueOf(allelapse.get(totalTP90)));
|
||||||
|
statisticsDTO.setTotalTP95(String.valueOf(allelapse.get(totalTP95)));
|
||||||
|
statisticsDTO.setTotalTP99(String.valueOf(allelapse.get(totalTP99)));
|
||||||
|
// todo
|
||||||
|
// statisticsDTO.setTotalAvgBandwidth();
|
||||||
|
return statisticsDTO;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static List<RequestStatistics> getRequestStatistics(String jtlString) {
|
public static RequestStatisticsDTO getRequestStatistics(String jtlString) {
|
||||||
List<Metric> totalLines = resolver(jtlString);
|
List<Metric> totalLines = resolver(jtlString);
|
||||||
Map<String, List<Metric>> map = totalLines.stream().collect(Collectors.groupingBy(Metric::getLabel));
|
Map<String, List<Metric>> map = totalLines.stream().collect(Collectors.groupingBy(Metric::getLabel));
|
||||||
return getOneRpsResult(map);
|
return getOneRpsResult(map);
|
||||||
|
|
|
@ -0,0 +1,116 @@
|
||||||
|
package io.metersphere.report.base;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class RequestStatisticsDTO extends RequestStatistics {
|
||||||
|
|
||||||
|
private List<RequestStatistics> requestStatisticsList;
|
||||||
|
|
||||||
|
private String totalLabel;
|
||||||
|
|
||||||
|
private String totalSamples;
|
||||||
|
|
||||||
|
private String totalErrors;
|
||||||
|
|
||||||
|
private String totalAverage;
|
||||||
|
|
||||||
|
private String totalMin;
|
||||||
|
|
||||||
|
private String totalMax;
|
||||||
|
|
||||||
|
private String totalTP90;
|
||||||
|
|
||||||
|
private String totalTP95;
|
||||||
|
|
||||||
|
private String totalTP99;
|
||||||
|
|
||||||
|
private String totalAvgBandwidth;
|
||||||
|
|
||||||
|
public List<RequestStatistics> getRequestStatisticsList() {
|
||||||
|
return requestStatisticsList;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setRequestStatisticsList(List<RequestStatistics> requestStatisticsList) {
|
||||||
|
this.requestStatisticsList = requestStatisticsList;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTotalLabel() {
|
||||||
|
return totalLabel;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTotalLabel(String totalLabel) {
|
||||||
|
this.totalLabel = totalLabel;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTotalSamples() {
|
||||||
|
return totalSamples;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTotalSamples(String totalSamples) {
|
||||||
|
this.totalSamples = totalSamples;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTotalErrors() {
|
||||||
|
return totalErrors;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTotalErrors(String totalErrors) {
|
||||||
|
this.totalErrors = totalErrors;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTotalAverage() {
|
||||||
|
return totalAverage;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTotalAverage(String totalAverage) {
|
||||||
|
this.totalAverage = totalAverage;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTotalMin() {
|
||||||
|
return totalMin;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTotalMin(String totalMin) {
|
||||||
|
this.totalMin = totalMin;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTotalMax() {
|
||||||
|
return totalMax;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTotalMax(String totalMax) {
|
||||||
|
this.totalMax = totalMax;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTotalTP90() {
|
||||||
|
return totalTP90;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTotalTP90(String totalTP90) {
|
||||||
|
this.totalTP90 = totalTP90;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTotalTP95() {
|
||||||
|
return totalTP95;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTotalTP95(String totalTP95) {
|
||||||
|
this.totalTP95 = totalTP95;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTotalTP99() {
|
||||||
|
return totalTP99;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTotalTP99(String totalTP99) {
|
||||||
|
this.totalTP99 = totalTP99;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTotalAvgBandwidth() {
|
||||||
|
return totalAvgBandwidth;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTotalAvgBandwidth(String totalAvgBandwidth) {
|
||||||
|
this.totalAvgBandwidth = totalAvgBandwidth;
|
||||||
|
}
|
||||||
|
}
|
|
@ -8,6 +8,7 @@ import io.metersphere.controller.request.ReportRequest;
|
||||||
import io.metersphere.dto.ReportDTO;
|
import io.metersphere.dto.ReportDTO;
|
||||||
import io.metersphere.report.JtlResolver;
|
import io.metersphere.report.JtlResolver;
|
||||||
import io.metersphere.report.base.RequestStatistics;
|
import io.metersphere.report.base.RequestStatistics;
|
||||||
|
import io.metersphere.report.base.RequestStatisticsDTO;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
@ -44,10 +45,10 @@ public class ReportService {
|
||||||
return extLoadTestReportMapper.getReportTestAndProInfo(reportId);
|
return extLoadTestReportMapper.getReportTestAndProInfo(reportId);
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<RequestStatistics> getReport(String id) {
|
public RequestStatisticsDTO getReport(String id) {
|
||||||
LoadTestReport loadTestReport = loadTestReportMapper.selectByPrimaryKey(id);
|
LoadTestReport loadTestReport = loadTestReportMapper.selectByPrimaryKey(id);
|
||||||
String content = loadTestReport.getContent();
|
String content = loadTestReport.getContent();
|
||||||
List<RequestStatistics> requestStatistics = JtlResolver.getRequestStatistics(content);
|
RequestStatisticsDTO requestStatistics = JtlResolver.getRequestStatistics(content);
|
||||||
return requestStatistics;
|
return requestStatistics;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -80,37 +80,33 @@
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
tableData: [{},{},{},{},{}],
|
tableData: [{},{},{},{},{}],
|
||||||
|
totalInfo: {}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
initTableData() {
|
initTableData() {
|
||||||
this.$get("/report/content/" + this.id, res => {
|
this.$get("/report/content/" + this.id, res => {
|
||||||
this.tableData = res.data;
|
this.tableData = res.data.requestStatisticsList;
|
||||||
|
this.totalInfo = res.data;
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
getSummaries (param) {
|
getSummaries () {
|
||||||
const { data } = param
|
|
||||||
const sums = []
|
const sums = []
|
||||||
let allSamples = data.reduce(function (total, currentValue) {
|
sums[0] = this.totalInfo.totalLabel;
|
||||||
return total + currentValue.samples;
|
sums[1] = this.totalInfo.totalSamples;
|
||||||
}, 0);
|
sums[2] = this.totalInfo.totalErrors;
|
||||||
let failSize = data.reduce(function (total, currentValue) {
|
sums[3] = this.totalInfo.totalAverage;
|
||||||
return total + currentValue.ko;
|
sums[4] = this.totalInfo.totalMin;
|
||||||
}, 0);
|
sums[5] = this.totalInfo.totalMax;
|
||||||
let allAverageTime = data.reduce(function (total, currentValue) {
|
sums[6] = this.totalInfo.totalTP90;
|
||||||
return total + parseFloat(currentValue.average) * currentValue.samples;
|
sums[7] = this.totalInfo.totalTP95;
|
||||||
}, 0);
|
sums[8] = this.totalInfo.totalTP99;
|
||||||
sums[0] = 'Total'
|
return sums;
|
||||||
sums[1] = allSamples;
|
|
||||||
sums[2] = (Math.round(failSize / allSamples * 10000) / 100) + '%';
|
|
||||||
sums[3] = (allAverageTime / allSamples).toFixed(2);
|
|
||||||
sums[4] = Math.min.apply(Math, data.map(function(o) {return parseFloat(o.min)}));
|
|
||||||
sums[5] = Math.max.apply(Math, data.map(function(o) {return parseFloat(o.max)}));
|
|
||||||
return sums
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
created() {
|
created() {
|
||||||
this.initTableData()
|
this.initTableData()
|
||||||
|
this.getSummaries()
|
||||||
},
|
},
|
||||||
props: ['id'],
|
props: ['id'],
|
||||||
watch: {
|
watch: {
|
||||||
|
@ -119,7 +115,8 @@
|
||||||
let reportId = to.path.split('/')[4];
|
let reportId = to.path.split('/')[4];
|
||||||
if(reportId){
|
if(reportId){
|
||||||
this.$get("/report/content/" + reportId, res => {
|
this.$get("/report/content/" + reportId, res => {
|
||||||
this.tableData = res.data;
|
this.tableData = res.data.requestStatisticsList;
|
||||||
|
this.totalInfo = res.data;
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue