Skip to content

Commit 4be50ce

Browse files
authored
feat : 결과 저장하는 로직 추가 (#64)
* feat : pass validation for get request * feat : Update code format * feat : Update template body size * chore : update code formatting * chore : update result save method * chore : create random template create class * chore : method add * test : result save test code add * chore : not use api del * chore : saveResult logic add * chore : test code modify(mock service class add) * chore : log print add * chore : agent 에서 전달하는 시간 값으로 수정 후 테스트 * chore : agent 에서 전달하는 시간 값 변환하는 메서드 추가 * chore : 추가한 시간 변환하는 메서드로 로직 수정 * chore : 테스트 코드 수정 * chore : get 저장시 빈 json 형태로 저장하기 * chore : agent 에서 시간 받을 때 변환하는 방식 수정(2024-03-30T15:14:52.961180220.... 변환 불가능한 값으로들어옴) * chore : Transactional annotation add * chore : 사용 안하는 메서드 삭제 * test : utils test code add
1 parent d92817b commit 4be50ce

File tree

18 files changed

+261
-446
lines changed

18 files changed

+261
-446
lines changed

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,34 +22,50 @@ 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, Double> MTTFBPercentiles;
62+
4963
@JsonProperty("tps_average")
5064
private double tpsAverage;
65+
5166
@JsonProperty("tps_percentiles")
5267
private Map<Double, Double> TPSPercentiles;
68+
5369
@JsonProperty(value = "test_status")
5470
private AgentStatus testStatus;
5571
}

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: 19 additions & 10 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,41 +65,44 @@ 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);
67-
}else{
73+
} else {
6874

6975
serverUrl = agentServerManager.getReadyAgent().orElseThrow(() ->
7076
new GlobalException(ErrorCode.INTERNAL_SERVER_ERROR)).getServerUrl();
77+
7178
agentServerManager.addTemplateRunnerAgent(Long.valueOf(templateId), serverUrl);
7279
log.info("send to " + serverUrl);
7380
}
7481
WebClient webClient = WebClient.create(serverUrl);
7582

7683
TemplateInfo templateInfo = testTemplateService.getTemplateInfo(userId, templateId);
77-
78-
7984
Flux<ServerSentEvent<CommonTestResult>> eventStream = perftestService.executePerformanceTest(
8085
templateId, groupId, action, webClient, templateInfo);
8186
perftestService.saveRunning(groupId, templateId);
8287

8388
eventStream
8489
.doOnComplete(() -> {
8590
perftestService.removeRunning(groupId,templateId);
86-
// TODO : CommonTestResult 저장 logic 구현 필요
87-
// 코드 한줄
91+
8892
if (action.equals("stop")) {
8993
log.info("Test completed! {}", action);
9094
messagingTemplate.convertAndSend("/topic/" + userId, "test started!");
9195
}
9296
})
9397
.subscribe(event -> {
9498
CommonTestResult commonTestResult = event.data();
95-
messagingTemplate.convertAndSend("/topic/" + groupId + "/" + templateId,
96-
commonTestResult);
99+
100+
// 결과 저장
101+
log.info("Start save Result");
102+
CommonTestResult saveReturnResult = testResultService.resultSaveAndReturn(commonTestResult)
103+
.orElseThrow(() -> new GlobalException(ErrorCode.INTERNAL_SERVER_ERROR));
104+
messagingTemplate.convertAndSend("/topic/" + groupId + "/" + templateId, saveReturnResult);
105+
log.info("End save Result");
97106
},
98107
error -> {
99108
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
@@ -33,6 +33,12 @@ public class TestTemplateApiController {
3333
@PreAuthorize("hasAnyRole('USER')")
3434
public ResponseEntity<TestTemplateResponseDto> createTemplate(@RequestBody TestTemplateRequestDto reqTestTemplate)
3535
throws JsonProcessingException {
36+
37+
if (reqTestTemplate.getMethod().equalsIgnoreCase("GET")) {
38+
reqTestTemplate.setBody("{}");
39+
return ResponseEntity.ok(testTemplateService.createTemplate(reqTestTemplate).get());
40+
}
41+
3642
if (!jsonMapper.isValidJson(reqTestTemplate.getBody())) {
3743
log.error("Invalid JSON body");
3844
throw new GlobalException(ErrorCode.INVALID_JSON);
@@ -55,10 +61,12 @@ public ResponseEntity<List<TestTemplateResponseDto>> getTemplates() {
5561
@GetMapping("/groups/{group_id}/templates")
5662
@PreAuthorize("hasAnyRole('USER')")
5763
public ResponseEntity<List<TestTemplateResponseDto>> getTemplates(@PathVariable("group_id") String group_id) {
64+
5865
User currentUser = userContext.getCurrentUser();
5966
if (currentUser.getRole().equals(Role.ROLE_ADMIN)) {
6067
return ResponseEntity.ok(testTemplateService.getTemplates(group_id));
6168
}
69+
6270
return ResponseEntity.ok(testTemplateService.getTemplates(group_id, currentUser.getId()));
6371
}
6472

@@ -67,7 +75,6 @@ public ResponseEntity<List<TestTemplateResponseDto>> getTemplates(@PathVariable(
6775
public ResponseEntity<TestTemplateResponseDto> updateTemplate(@RequestBody TestTemplateUpdateDto resTestTemplate) throws Exception {
6876

6977
User currentUser = userContext.getCurrentUser();
70-
7178
return ResponseEntity.ok(testTemplateService.updateTemplate(resTestTemplate, currentUser.getId()).get());
7279
}
7380

@@ -76,8 +83,8 @@ public ResponseEntity<TestTemplateResponseDto> updateTemplate(@RequestBody TestT
7683
public ResponseEntity<Void> deleteTemplate(@PathVariable Integer template_id) {
7784

7885
User currentUser = userContext.getCurrentUser();
79-
8086
testTemplateService.deleteTemplate(template_id, currentUser.getId());
87+
8188
return ResponseEntity.ok().build();
8289
}
8390

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)