Elasticsearch IntelliJ 에서 디버깅 하는방법
Elasticsearch는 오픈소스 검색엔진입니다. Elasticsearch를 개발하거나 운영하다 보면 내부에서 어떻게 호출되고 있는지가 궁금 해질 때가 있습니다. 이 때 Elasticsearch를 IntlliJ에서 디버깅 하는 방법에 대해 설명하겠습니다.
환경은 다음과 같습니다.
Mac OS
IntelliJ 2022.2.3
1. Elasticsearch를 IntelliJ에서 열기
먼저 Github에서 Elasticsearch source를 clone 받습니다.
git clone https://github.com/elastic/elasticsearch.git
그 다음 받은 Elasticsearch 소스를 IntelliJ에서 Open 해야하는데요, 그 전에 몇가지 체크 사항이 있습니다. IntelliJ IDEA 버전이 2020.1 Java 17 이상을 사용해야 합니다. (ES 8.7기준) https://www.jetbrains.com/help/idea/sdk.html#define-sdk 링크를 보고 JDK 17 SDK를 셋업 해 줍니다.
위 요구사항이 맞으면 IntelliJ IDEA에서
- File -> Open 을 선택
- Github에서 받은 소스 root 경로에서 build.gradle 파일 선택 후 Open.
- 팝업창이 뜨면 Open as Project
2. IntelliJ 리모트 디버깅 설정
IntelliJ 에서 Remote JVM Debug를 실행 해 줍니다. 기본 3개(5007, 5008, 5009) 세팅이 돼 있습니다. 그중 5007 Port 리모트 디버거를 실행합니다.
3. Gradle을 이용 해 Elasticsearch를 디버그 모드로 실행
elasticsearch 소스 root 경로로 이동해서 아래 명령어를 실행합니다.
./gradlew run --debug-jvm
이렇게 되면 기본적으로 basic license, debug 모드로 실행 되게 됩니다.
이렇게 실행 하고 나서 http://127.0.0.1:9200/ 로 접근하게 되면 id, password 입력하라고 나오는데, 이 때 기본값은
id: elastic-admin
pwd: elastic-password
gradle run 추가 실행 옵션들이 많으니 자세한 정보는 다음 링크를 참고하세요 (https://github.com/elastic/elasticsearch/blob/main/TESTING.asciidoc#other-useful-arguments)
- 연결 성공 시 이미지
4. 소스에서 Break point 설정
IntelliJ Source 에서 break point 설정하고 elasticsearch 에 해당 코드 라인을 실행하는 명령어를 치게 되면 해당 라인부터 디버깅이 가능 해 집니다.
Ex) org/elasticsearch/action/admin/cluster/stats/ClusterStatsResponse.java 에 해당 라인 브레이크 포인트를 걸고
http://127.0.0.1:9200/_cluster/stats 호출하면 아래처럼 자세하게 디버깅이 가능 해 집니다.
마무리
이렇게 Elasticsearch를 IntelliJ 에서 디버깅 하는 방법에 대해 작성 해 보았습니다. 이 방법을 통해 shards들이 어떻게 데이터를 주고 받는지 Search Object 가 어떤식으로 동작하게 되는지 자세하게 디버깅하며 분석 할 수 있게 되었습니다.
이렇게 소스를 분석해 보면서 나중에는 Elasticsearch Contributor가 될 수도 있지 않을까 하는 생각을 해 봅니다.
참고
https://github.com/elastic/elasticsearch/blob/main/TESTING.asciidoc
GitHub - elastic/elasticsearch: Free and Open, Distributed, RESTful Search Engine
Free and Open, Distributed, RESTful Search Engine. Contribute to elastic/elasticsearch development by creating an account on GitHub.
github.com
https://github.com/elastic/elasticsearch/blob/main/CONTRIBUTING.md