API 호출을 많이 당하고? 있는 서버가 있는데, 문득 어떤 API를 많이 호출하고 있는지 확인 해보고 싶어져서 AWS의 x-ray를 사용해서 tracing 해보고 싶어졌다
Spring boot, aop, aws x-ray 를 사용해서 api를 tracing 해보자.
(해당 포스팅은 로컬 mac환경에서 테스트해 본 것을 기준으로 할 꺼다)
X-RAY 데몬 설치하기
x-ray sdk가 전송하는 데이터가 x-ray 서비스에 도달하려면 데몬이 실행 중 이어야 한다.
xray 데몬을 설치하기 전에 aws x-ray 서비스에 데이터를 전송할 권한이 있어야하는데, 나는 로컬에서 할 것이기 때문에 로컬에다가 자격증명(credentials) 하면된다.
aws iam에서 xray 권한을 가진 user를 만들고, cli로 credentials 해준다.
$ aws configure
AWS Access Key ID [None]: 엑세스키
AWS Secret Access Key [None]: 시크릿키
Default region name [None]: ap-northeast-2
Default output format [None]: text
디펜던시 추가 시 datasource 가 필수인듯(추후에 다시 설명) 해서 jpa도 추가하고, 프로퍼티에서 datasource도 설정해준다.
aop를 사용해서 트레이싱할 예정이니 aop도 추가해주자.
전역 레코더 구성, TracingFilter 설정
아래 코드를 생성하여 AWSXRayRecorderBuilder를 전역에 설정해주고,
샘플링 룰을 설정할 수 있는 sampling-rules.json 파일도 생성해준다.
이 레코더가 json형태의 데이터(세그먼트)를 생성하여 데몬에 전달하는 듯 하다.
세그먼트를 생성할 때의 규칙을 해당 설정 json파일(sampling-rules.json)에 정의하면
허용 url, 허용 method, rate 등 세그먼트에 대한 규칙을 설정할 수 있다.
부분에서 data repository 가 포인트컷에 들어가 있기 때문에 datasource 설정을 해주지 않으면 실행이 되지 않는다ㅡㅡ;;
테스트 controller 만들기
이제 테스트로 호출해 볼 api가 필요하니 controller를 구성해보자.
XrayController
@RestController
@XRayEnabled
public class XrayController {
private XrayService xrayService;
public XrayController(XrayService xrayService){
this.xrayService = xrayService;
}
@GetMapping("/test")
public String test(){
return "test";
}
@GetMapping("/real")
public String real(){
String testStr = xrayService.testStr();
System.out.println(testStr);
return testStr;
}
}
대충 스트링이 반환되게 구성하고 @XRayEnabled 를 꼭 기입하여 xray 활성화를 시켜준다.
API 테스트
이제 준비가 끝났으니 만들어진 api를 호출해보면 이전에 실행해놓은 데몬에 로그가 찍힐것이다.
데몬 로그
[Info] 1296 segment buffers allocated
[Info] Using region: ap-northeast-2
[Info] HTTP Proxy server using X-Ray Endpoint : https://xray.ap-northeast-2.amazonaws.com
[Info] Starting proxy http server on 127.0.0.1:2000
[Info] Successfully sent batch of 1 segments (0.632 seconds)
[Info] Successfully sent batch of 1 segments (0.027 seconds)