spring core advanced : log trace v2 - parameter synchronization
This commit is contained in:
@@ -0,0 +1,30 @@
|
|||||||
|
package com.example.advanced.app.v2;
|
||||||
|
|
||||||
|
import com.example.advanced.trace.TraceStatus;
|
||||||
|
import com.example.advanced.trace.hellotrace.HelloTraceV2;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
@RestController
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
public class OrderControllerV2 {
|
||||||
|
|
||||||
|
private final OrderServiceV2 orderService;
|
||||||
|
private final HelloTraceV2 trace;
|
||||||
|
|
||||||
|
@GetMapping("/v2/request")
|
||||||
|
public String request(String itemId) {
|
||||||
|
|
||||||
|
TraceStatus status = null;
|
||||||
|
try {
|
||||||
|
status = trace.begin("OrderController.request()");
|
||||||
|
orderService.orderItem(status.getTraceId(), itemId);
|
||||||
|
trace.end(status);
|
||||||
|
return "ok";
|
||||||
|
} catch (Exception e) {
|
||||||
|
trace.exception(status, e);
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
package com.example.advanced.app.v2;
|
||||||
|
|
||||||
|
import com.example.advanced.trace.TraceId;
|
||||||
|
import com.example.advanced.trace.TraceStatus;
|
||||||
|
import com.example.advanced.trace.hellotrace.HelloTraceV2;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import org.springframework.stereotype.Repository;
|
||||||
|
|
||||||
|
@Repository
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
public class OrderRepositoryV2 {
|
||||||
|
|
||||||
|
private final HelloTraceV2 trace;
|
||||||
|
|
||||||
|
public void save(TraceId traceId, String itemId) {
|
||||||
|
|
||||||
|
TraceStatus status = null;
|
||||||
|
try {
|
||||||
|
status = trace.beginSync(traceId, "OrderRepository.save()");
|
||||||
|
// 저장 로직
|
||||||
|
if (itemId.equals("ex")) {
|
||||||
|
throw new IllegalStateException("예외 발생!");
|
||||||
|
}
|
||||||
|
sleep(1000);
|
||||||
|
trace.end(status);
|
||||||
|
} catch (Exception e) {
|
||||||
|
trace.exception(status, e);
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void sleep(int millis) {
|
||||||
|
try {
|
||||||
|
Thread.sleep(millis);
|
||||||
|
} catch (InterruptedException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
package com.example.advanced.app.v2;
|
||||||
|
|
||||||
|
import com.example.advanced.trace.TraceId;
|
||||||
|
import com.example.advanced.trace.TraceStatus;
|
||||||
|
import com.example.advanced.trace.hellotrace.HelloTraceV2;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
public class OrderServiceV2 {
|
||||||
|
|
||||||
|
private final OrderRepositoryV2 orderRepository;
|
||||||
|
private final HelloTraceV2 trace;
|
||||||
|
|
||||||
|
public void orderItem(TraceId traceId, String itemId) {
|
||||||
|
TraceStatus status = null;
|
||||||
|
try {
|
||||||
|
status = trace.beginSync(traceId, "OrderService.orderItem()");
|
||||||
|
orderRepository.save(status.getTraceId(), itemId);
|
||||||
|
trace.end(status);
|
||||||
|
} catch (Exception e) {
|
||||||
|
trace.exception(status, e);
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,60 @@
|
|||||||
|
package com.example.advanced.trace.hellotrace;
|
||||||
|
|
||||||
|
import com.example.advanced.trace.TraceId;
|
||||||
|
import com.example.advanced.trace.TraceStatus;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
@Component
|
||||||
|
public class HelloTraceV2 {
|
||||||
|
|
||||||
|
private static final String START_PREFIX = "-->";
|
||||||
|
private static final String COMPLETE_PREFIX = "<--";
|
||||||
|
private static final String EX_PREFIX = "<X-";
|
||||||
|
|
||||||
|
public TraceStatus begin(String message) {
|
||||||
|
TraceId traceId = new TraceId();
|
||||||
|
long startTimeMs = System.currentTimeMillis();
|
||||||
|
// 로그 출력
|
||||||
|
log.info("[{}] {}{}", traceId.getId(), addSpace(START_PREFIX, traceId.getLevel()), message);
|
||||||
|
return new TraceStatus(traceId, startTimeMs, message);
|
||||||
|
}
|
||||||
|
|
||||||
|
// V2 추가
|
||||||
|
public TraceStatus beginSync(TraceId beforeTraceId, String message) {
|
||||||
|
TraceId nextId = beforeTraceId.createNextId();
|
||||||
|
long startTimeMs = System.currentTimeMillis();
|
||||||
|
// 로그 출력
|
||||||
|
log.info("[{}] {}{}", nextId.getId(), addSpace(START_PREFIX, nextId.getLevel()), message);
|
||||||
|
return new TraceStatus(nextId, startTimeMs, message);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void end(TraceStatus status) {
|
||||||
|
complete(status, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void exception(TraceStatus status, Exception e) {
|
||||||
|
complete(status, e);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void complete(TraceStatus status, Exception e) {
|
||||||
|
long stopTimeMs = System.currentTimeMillis();
|
||||||
|
long resultTimeMs = stopTimeMs - status.getStartTimeMs();
|
||||||
|
TraceId traceId = status.getTraceId();
|
||||||
|
if (e == null) {
|
||||||
|
log.info("[{}] {}{} time={}ms", traceId.getId(), addSpace(COMPLETE_PREFIX, traceId.getLevel()), status.getMessage(), resultTimeMs);
|
||||||
|
} else {
|
||||||
|
log.info("[{}] {}{} time={}ms ex={}: 예외 발생!", traceId.getId(), addSpace(EX_PREFIX, traceId.getLevel()), status.getMessage(), resultTimeMs, e.getClass());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private String addSpace(String prefix, int level) {
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
for (int i = 0; i < level; i++) {
|
||||||
|
sb.append((i == level - 1) ? "|" + prefix : "| ");
|
||||||
|
}
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
package com.example.advanced.trace.hellotrace;
|
||||||
|
|
||||||
|
import com.example.advanced.trace.TraceStatus;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
class HelloTraceV2Test {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void begin_end() {
|
||||||
|
HelloTraceV2 trace = new HelloTraceV2();
|
||||||
|
TraceStatus status1 = trace.begin("hello1");
|
||||||
|
TraceStatus status2 = trace.beginSync(status1.getTraceId(), "hello2");
|
||||||
|
trace.end(status2);
|
||||||
|
trace.end(status1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void begin_exception() {
|
||||||
|
HelloTraceV2 trace = new HelloTraceV2();
|
||||||
|
TraceStatus status1 = trace.begin("hello1");
|
||||||
|
TraceStatus status2 = trace.beginSync(status1.getTraceId(), "hello2");
|
||||||
|
trace.exception(status2, new IllegalStateException());
|
||||||
|
trace.exception(status1, new IllegalStateException());
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user