컨트롤러
@GetMapping("/v2/request")
public String request(@RequestParam("itemId") 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;
}
}
이제 다음으로 호출하는 메소드에, 서비스에 traceId를 넘겨준다.
서비스
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;
}
}
그럼 beginSync하면서 Id를 유지하며 level만 증가시킨다. 마찬가지로 리포지토리에 traceId를 넘긴다.
리포지토리
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;
}
}
traceId가 잘 유지되며 레벨도 예쁘게 찍힌다.
sleep, 저게 쓰레드를 슬립시키는 메소드를 따로 만들어 둔 건데,
그럼 1초 이내로 웹브라우저에서 새로고침하여 요청을 동시에 해 볼 것이다.
잘 구분 된다.
이제, ex가 나거나 혹은 time=에서 저 item=ㅁㅁㅁms의 ㅁㅁㅁ 부분만 정수로 바꿔 예를 들어 2000 이상이 걸린 것 들은 id를 가져와 필터링 하면 될 것 이다.
'스프링 > 스프링 핵심 원리 - 고급편' 카테고리의 다른 글
9. 필드 동기화 (0) | 2024.01.14 |
---|---|
8. V2 정리 (0) | 2024.01.14 |
6. V2 파라미터로 동기화 (0) | 2024.01.14 |
5. 로그 추적기 적용 (0) | 2024.01.14 |
4. 로그추적기 V1 프로토타입 (0) | 2024.01.05 |