Skip to content

Commit 219f80a

Browse files
authored
Merge branch 'develop' into feature/tps-rtp-avg
2 parents 398c83f + 4be50ce commit 219f80a

File tree

18 files changed

+259
-445
lines changed

18 files changed

+259
-445
lines changed

bm-common/src/main/java/org/benchmarker/bmcommon/dto/CommonTestResult.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,34 +22,49 @@ public class CommonTestResult {
2222

2323
@JsonProperty("test_id")
2424
private int testId;
25+
2526
@JsonProperty("group_id")
2627
private String groupId;
28+
2729
@JsonProperty("started_at")
2830
private String startedAt;
31+
2932
@JsonProperty("finished_at")
3033
private String finishedAt;
34+
3135
private String url;
36+
3237
private String method;
38+
3339
@JsonProperty("total_requests")
3440
private int totalRequests;
41+
3542
@JsonProperty("total_errors")
3643
private int totalErrors;
44+
3745
@JsonProperty("total_success")
3846
private int totalSuccess;
47+
3948
@JsonProperty("status_code_count")
4049
private Map<String, Integer> statusCodeCount;
50+
4151
@JsonProperty("total_users")
4252
private int totalUsers;
53+
4354
@JsonProperty("total_duration")
4455
private String totalDuration;
56+
4557
@JsonProperty("mttfb_average")
4658
private String mttfbAverage;
59+
4760
@JsonProperty("mttfb_percentiles")
4861
private Map<Double, Long> MTTFBPercentiles;
4962
@JsonProperty("tps_average")
5063
private double tpsAverage;
64+
5165
@JsonProperty("tps_percentiles")
5266
private Map<Double, Double> TPSPercentiles;
67+
5368
@JsonProperty(value = "test_status")
5469
private AgentStatus testStatus;
5570
}

bm-common/src/main/java/org/benchmarker/bmcommon/util/RandomUtils.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ public static CommonTestResult generateRandomTestResult() {
1212
return CommonTestResult.builder()
1313
.testId(1)
1414
.testStatus(AgentStatus.TESTING)
15-
.startedAt("2021-01-01 00:00:00")
16-
.finishedAt("2021-01-01 00:00:00")
15+
.startedAt("2024-03-30T15:14:52.961180220")
16+
.finishedAt("2024-03-30T15:14:53.961180220")
1717
.url("http://localhost:8080")
1818
.method("GET")
1919
.totalRequests(randInt(100,200))

bm-controller/src/main/java/org/benchmarker/bmcontroller/common/util/JsonMapper.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
@Slf4j
1212
@RequiredArgsConstructor
1313
public class JsonMapper {
14+
1415
private final ObjectMapper objectMapper;
1516

1617
/**

bm-controller/src/main/java/org/benchmarker/bmcontroller/preftest/controller/PerftestController.java

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import org.benchmarker.bmcontroller.common.error.ErrorCode;
1010
import org.benchmarker.bmcontroller.common.error.GlobalException;
1111
import org.benchmarker.bmcontroller.preftest.service.PerftestService;
12+
import org.benchmarker.bmcontroller.template.service.ITestResultService;
1213
import org.benchmarker.bmcontroller.template.service.ITestTemplateService;
1314
import org.benchmarker.bmcontroller.user.service.UserContext;
1415
import org.springframework.http.ResponseEntity;
@@ -31,11 +32,16 @@
3132
public class PerftestController {
3233

3334
private final SimpMessagingTemplate messagingTemplate;
35+
3436
private final ITestTemplateService testTemplateService;
37+
3538
private final PerftestService perftestService;
39+
3640
private final UserContext userContext;
41+
3742
private final AgentServerManager agentServerManager;
38-
private final String agentUrl = "http://localhost:8081";
43+
44+
private final ITestResultService testResultService;
3945

4046
@GetMapping("/groups/{group_id}/templates/{template_id}")
4147
@PreAuthorize("hasRole('USER')")
@@ -59,10 +65,10 @@ public ResponseEntity send(@PathVariable("group_id") String groupId,
5965
log.info("Send action: {}", action);
6066
String userId = userContext.getCurrentUser().getId();
6167
String serverUrl = "";
62-
if (action.equals("stop")){
63-
68+
if (action.equals("stop")) {
6469
serverUrl = agentServerManager.getAgentMapped().get(Long.valueOf(templateId));
6570
agentServerManager.removeTemplateRunnerAgent(Long.valueOf(templateId));
71+
6672
log.info("stop to " + serverUrl);
6773
}else{
6874
if (perftestService.isRunning(groupId, templateId)){
@@ -71,32 +77,35 @@ public ResponseEntity send(@PathVariable("group_id") String groupId,
7177
}
7278
serverUrl = agentServerManager.getReadyAgent().orElseThrow(() ->
7379
new GlobalException(ErrorCode.INTERNAL_SERVER_ERROR)).getServerUrl();
80+
7481
agentServerManager.addTemplateRunnerAgent(Long.valueOf(templateId), serverUrl);
7582
log.info("send to " + serverUrl);
7683
}
7784
WebClient webClient = WebClient.create(serverUrl);
7885

7986
TemplateInfo templateInfo = testTemplateService.getTemplateInfo(userId, templateId);
80-
81-
8287
Flux<ServerSentEvent<CommonTestResult>> eventStream = perftestService.executePerformanceTest(
8388
templateId, groupId, action, webClient, templateInfo);
8489
perftestService.saveRunning(groupId, templateId);
8590

8691
eventStream
8792
.doOnComplete(() -> {
8893
perftestService.removeRunning(groupId,templateId);
89-
// TODO : CommonTestResult 저장 logic 구현 필요
90-
// 코드 한줄
94+
9195
if (action.equals("stop")) {
9296
log.info("Test completed! {}", templateId);
9397
messagingTemplate.convertAndSend("/topic/" + userId, "test complete");
9498
}
9599
})
96100
.subscribe(event -> {
97101
CommonTestResult commonTestResult = event.data();
98-
messagingTemplate.convertAndSend("/topic/" + groupId + "/" + templateId,
99-
commonTestResult);
102+
103+
// 결과 저장
104+
log.info("Start save Result");
105+
CommonTestResult saveReturnResult = testResultService.resultSaveAndReturn(commonTestResult)
106+
.orElseThrow(() -> new GlobalException(ErrorCode.INTERNAL_SERVER_ERROR));
107+
messagingTemplate.convertAndSend("/topic/" + groupId + "/" + templateId, saveReturnResult);
108+
log.info("End save Result");
100109
},
101110
error -> {
102111
log.error("Error receiving SSE: {}", error.getMessage());
Lines changed: 7 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -1,86 +1,16 @@
11
package org.benchmarker.bmcontroller.template.common;
22

3-
import java.util.Locale;
4-
import java.util.Map;
5-
import org.benchmarker.bmcontroller.template.model.TestTemplate;
6-
import org.springframework.http.MediaType;
7-
import org.springframework.http.ResponseEntity;
8-
import org.springframework.web.reactive.function.client.WebClient;
9-
import reactor.core.publisher.Mono;
3+
import java.time.LocalDate;
4+
import java.time.LocalDateTime;
5+
import java.time.LocalTime;
106

117
public class TemplateUtils {
128

13-
public static double calculateTPS(long startTime, long endTime, int totalRequests) {
14-
// 경과 시간 계산 (밀리초 단위)
15-
long elapsedTime = endTime - startTime;
9+
public static LocalDateTime convertStringToLocalDateTime(String dateTimeString) {
1610

17-
// 경과 시간이 0보다 작거나 같으면 0을 반환하여 나누기 오류를 방지합니다.
18-
if (elapsedTime <= 0) {
19-
return 0;
20-
}
11+
LocalDate datePart = LocalDate.parse(dateTimeString.split("T")[0]);
12+
LocalTime timePart = LocalTime.parse(dateTimeString.split("T")[1].substring(0, 8));
2113

22-
// 초당 트랜잭션 수 계산 (총 요청 수를 경과 시간(초)으로 나눔)
23-
return (double) totalRequests / (elapsedTime / 1000.0);
24-
}
25-
26-
public static double calculateAvgResponseTime(long startTime, long endTime, int totalRequests) {
27-
// 경과 시간 계산 (밀리초 단위)
28-
long elapsedTime = endTime - startTime;
29-
30-
// 경과 시간이 0보다 작거나 같으면 0을 반환하여 나누기 오류를 방지합니다.
31-
if (elapsedTime <= 0 || totalRequests == 0) {
32-
return 0;
33-
}
34-
35-
// 평균 응답 시간 계산 (총 경과 시간을 총 요청 수로 나눔)
36-
return (double) elapsedTime / totalRequests;
37-
}
38-
39-
public static Mono<ResponseEntity<String>> createRequest(WebClient webClient, TestTemplate testTemplate) {
40-
String method = testTemplate.getMethod().toUpperCase(Locale.ENGLISH);
41-
return switch (method) {
42-
case "GET" -> webClient.get()
43-
.uri(testTemplate.getUrl())
44-
.retrieve()
45-
.toEntity(String.class);
46-
case "POST" -> webClient.post()
47-
.uri(testTemplate.getUrl())
48-
.contentType(MediaType.APPLICATION_JSON)
49-
.bodyValue(testTemplate.getBody())
50-
.retrieve()
51-
.toEntity(String.class);
52-
case "PATCH", "PUT" -> webClient.patch()
53-
.uri(testTemplate.getUrl())
54-
.contentType(MediaType.APPLICATION_JSON)
55-
.bodyValue(testTemplate.getBody())
56-
.retrieve()
57-
.toEntity(String.class);
58-
case "DELETE" -> webClient.delete()
59-
.uri(testTemplate.getUrl())
60-
.retrieve()
61-
.toEntity(String.class);
62-
default -> throw new IllegalArgumentException("Unsupported HTTP method: " + method);
63-
};
64-
}
65-
66-
public static String getStatusCodeCategory(int statusCode) {
67-
if (statusCode >= 200 && statusCode < 300) {
68-
return "2xx";
69-
} else if (statusCode >= 300 && statusCode < 400) {
70-
return "3xx";
71-
} else if (statusCode >= 400 && statusCode < 500) {
72-
return "4xx";
73-
} else if (statusCode >= 500 && statusCode < 600) {
74-
return "5xx";
75-
}
76-
return "";
77-
}
78-
79-
public static void addPercentile(Map<String, Double> tpsPercentiles, Map<String, Double> mttfbPercentiles, String key, long startTime, long finishTime, int totalRequest) {
80-
double tpsPercentile = calculateTPS(startTime, finishTime, totalRequest);
81-
double mttfbPercentile = calculateAvgResponseTime(startTime, finishTime, totalRequest);
82-
83-
tpsPercentiles.put(key, tpsPercentile);
84-
mttfbPercentiles.put(key, mttfbPercentile);
14+
return LocalDateTime.of(datePart, timePart);
8515
}
8616
}

bm-controller/src/main/java/org/benchmarker/bmcontroller/template/controller/TestResultTemplateApiController.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,13 @@ public class TestResultTemplateApiController {
1616

1717
private final ITestResultService testResultService;
1818

19-
@PostMapping("/groups/{group_id}/templates/{template_id}?action={action}")
20-
@PreAuthorize("hasAnyRole('USER')")
21-
public ResponseEntity<TestResultResponseDto> measurePerformance(
22-
@PathVariable String group_id,
23-
@PathVariable Integer template_id,
24-
@RequestParam(required = true) String action) throws InterruptedException {
25-
return ResponseEntity.ok(testResultService.measurePerformance(group_id, template_id, action));
26-
}
19+
// @PostMapping("/groups/{group_id}/templates/{template_id}?action={action}")
20+
// @PreAuthorize("hasAnyRole('USER')")
21+
// public ResponseEntity<TestResultResponseDto> measurePerformance(
22+
// @PathVariable String group_id,
23+
// @PathVariable Integer template_id,
24+
// @RequestParam(required = true) String action) throws InterruptedException {
25+
// return ResponseEntity.ok(testResultService.measurePerformance(group_id, template_id, action));
26+
// }
2727

2828
}

bm-controller/src/main/java/org/benchmarker/bmcontroller/template/controller/TestTemplateApiController.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,12 @@ public class TestTemplateApiController {
4040
@PreAuthorize("hasAnyRole('USER')")
4141
public ResponseEntity<TestTemplateResponseDto> createTemplate(@Valid @RequestBody TestTemplateRequestDto reqTestTemplate)
4242
throws JsonProcessingException {
43+
44+
if (reqTestTemplate.getMethod().equalsIgnoreCase("GET")) {
45+
reqTestTemplate.setBody("{}");
46+
return ResponseEntity.ok(testTemplateService.createTemplate(reqTestTemplate).get());
47+
}
48+
4349
if (!jsonMapper.isValidJson(reqTestTemplate.getBody())) {
4450
log.error("Invalid JSON body");
4551
throw new GlobalException(ErrorCode.INVALID_JSON);
@@ -62,10 +68,12 @@ public ResponseEntity<List<TestTemplateResponseDto>> getTemplates() {
6268
@GetMapping("/groups/{group_id}/templates")
6369
@PreAuthorize("hasAnyRole('USER')")
6470
public ResponseEntity<List<TestTemplateResponseDto>> getTemplates(@PathVariable("group_id") String group_id) {
71+
6572
User currentUser = userContext.getCurrentUser();
6673
if (currentUser.getRole().equals(Role.ROLE_ADMIN)) {
6774
return ResponseEntity.ok(testTemplateService.getTemplates(group_id));
6875
}
76+
6977
return ResponseEntity.ok(testTemplateService.getTemplates(group_id, currentUser.getId()));
7078
}
7179

@@ -74,7 +82,6 @@ public ResponseEntity<List<TestTemplateResponseDto>> getTemplates(@PathVariable(
7482
public ResponseEntity<TestTemplateResponseDto> updateTemplate(@RequestBody TestTemplateUpdateDto resTestTemplate) throws Exception {
7583

7684
User currentUser = userContext.getCurrentUser();
77-
7885
return ResponseEntity.ok(testTemplateService.updateTemplate(resTestTemplate, currentUser.getId()).get());
7986
}
8087

@@ -83,8 +90,8 @@ public ResponseEntity<TestTemplateResponseDto> updateTemplate(@RequestBody TestT
8390
public ResponseEntity<Void> deleteTemplate(@PathVariable Integer template_id) {
8491

8592
User currentUser = userContext.getCurrentUser();
86-
8793
testTemplateService.deleteTemplate(template_id, currentUser.getId());
94+
8895
return ResponseEntity.ok().build();
8996
}
9097

bm-controller/src/main/java/org/benchmarker/bmcontroller/template/model/TestMttfb.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public class TestMttfb extends BaseTime {
3434
@JoinColumn(name = "test_result_id", referencedColumnName = "id", nullable = false)
3535
private TestResult testResult;
3636

37-
private Double mttfb;
37+
private String mttfb;
3838

3939
@Column(columnDefinition = "timestamp(6)")
4040
protected LocalDateTime startAt;

bm-controller/src/main/java/org/benchmarker/bmcontroller/template/model/TestResult.java

Lines changed: 13 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,14 @@
11
package org.benchmarker.bmcontroller.template.model;
22

3-
import jakarta.persistence.Entity;
4-
import jakarta.persistence.FetchType;
5-
import jakarta.persistence.GeneratedValue;
6-
import jakarta.persistence.GenerationType;
7-
import jakarta.persistence.Id;
8-
import jakarta.persistence.JoinColumn;
9-
import jakarta.persistence.ManyToOne;
10-
import jakarta.persistence.OneToMany;
11-
import java.util.List;
12-
import lombok.AllArgsConstructor;
13-
import lombok.Builder;
14-
import lombok.Getter;
15-
import lombok.NoArgsConstructor;
16-
import lombok.Setter;
3+
import jakarta.persistence.*;
4+
import lombok.*;
175
import lombok.extern.slf4j.Slf4j;
186
import org.benchmarker.bmcontroller.common.model.BaseTime;
197
import org.benchmarker.bmcontroller.template.controller.dto.TestResultResponseDto;
208

9+
import java.time.LocalDateTime;
10+
import java.util.List;
11+
2112

2213
@Slf4j
2314
@Getter
@@ -44,7 +35,13 @@ public class TestResult extends BaseTime {
4435

4536
private Double tpsAvg;
4637

47-
private Double mttbfbAvg;
38+
private String mttbfbAvg;
39+
40+
@Column(columnDefinition = "timestamp(6)")
41+
private LocalDateTime startedAt;
42+
43+
@Column(columnDefinition = "timestamp(6)")
44+
private LocalDateTime finishedAt;
4845

4946
@OneToMany(mappedBy = "testResult", fetch = FetchType.EAGER)
5047
private List<TestMttfb> testMttfbs;
@@ -62,15 +59,8 @@ public TestResultResponseDto convertToResponseDto() {
6259
.totalSuccess(this.totalSuccess)
6360
.totalError(this.totalError)
6461
.tpsAvg(this.tpsAvg)
65-
.mttbfbAvg(this.mttbfbAvg)
62+
// .mttbfbAvg(this.mttbfbAvg)
6663
.build();
6764
}
6865

69-
public void resultUpdate(int totalRequest, int totalSuccess, int totalError, Double tpsAvg, Double mttbfbAvg) {
70-
this.totalRequest = totalRequest;
71-
this.totalSuccess = totalSuccess;
72-
this.totalError = totalError;
73-
this.tpsAvg = tpsAvg;
74-
this.mttbfbAvg = mttbfbAvg;
75-
}
7666
}

bm-controller/src/main/java/org/benchmarker/bmcontroller/template/model/TestTemplate.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ public class TestTemplate extends BaseTime {
3737
@Column(nullable = false)
3838
private String method;
3939

40+
@Column(length = 1000)
4041
private String body;
4142

4243
@Column(nullable = false)

0 commit comments

Comments
 (0)