Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

no methods are found #108

Open
NineTIN opened this issue Nov 27, 2023 · 8 comments
Open

no methods are found #108

NineTIN opened this issue Nov 27, 2023 · 8 comments

Comments

@NineTIN
Copy link

NineTIN commented Nov 27, 2023

안녕하세요.
Scavenger 도입을 검토 중인데, Spring Boot 애플리케이션에 Scavenger Agent를 적용했을 때 아래와 같은 메시지가 나타나며 메소드들을 찾을 수 없다고 합니다.

[0.004s][warning][arguments] -XX:+TraceClassUnloading is deprecated. Will use -Xlog:class+unload=info instead.
Nov 27, 2023 6:59:35 PM com.navercorp.scavenger.javaagent.ScavengerAgent premain
INFO: [scavenger] scavenger agent version 1.1.0 is starting...
Nov 27, 2023 6:59:35 PM com.navercorp.scavenger.javaagent.util.ConfigUtils locateConfigFile
INFO: [scavenger] config file found explicitly: /home/user/config/scavenger/scavenger.conf


███████╗ ██████╗ █████╗ ██╗   ██╗███████╗███╗   ██╗ ██████╗ ███████╗██████╗
██╔════╝██╔════╝██╔══██╗██║   ██║██╔════╝████╗  ██║██╔════╝ ██╔════╝██╔══██╗
███████╗██║     ███████║██║   ██║█████╗  ██╔██╗ ██║██║  ███╗█████╗  ██████╔╝
╚════██║██║     ██╔══██║╚██╗ ██╔╝██╔══╝  ██║╚██╗██║██║   ██║██╔══╝  ██╔══██╗
███████║╚██████╗██║  ██║ ╚████╔╝ ███████╗██║ ╚████║╚██████╔╝███████╗██║  ██║
╚══════╝ ╚═════╝╚═╝  ╚═╝  ╚═══╝  ╚══════╝╚═╝  ╚═══╝ ╚═════╝ ╚══════╝╚═╝  ╚═╝

                 agent version :: 1.1.0
               config location :: /home/user/config/scavenger/scavenger.conf
                       api key :: dd64eb04-21ad-46c6-880d-387c74bd5611
                    server url :: http://api server IP:8080
                      app name :: example
                   app version :: 1.0.0
                   environment :: dev
                       package :: com.example.application
             method visibility :: protected
          exclude constructors :: true
      exclude setters, getters :: true
                      hostname :: api-server1-dev
     async code base scan mode :: false
     legacy compatibility mode :: false

Nov 27, 2023 6:59:35 PM com.navercorp.scavenger.javaagent.collecting.CodeBaseScanner scan
INFO: [scavenger] codebase(735365b464581d476999a11693aa774b7e6bc7eb80917673f2b97b36b839c6dd) scanned in 7 ms: 0 methods
Nov 27, 2023 6:59:35 PM com.navercorp.scavenger.javaagent.ScavengerAgent scanCodeBase
SEVERE: [scavenger] no methods are found
Nov 27, 2023 6:59:35 PM com.navercorp.scavenger.javaagent.ScavengerAgent premain
WARNING: [scavenger] scavenger is disabled

package명이나 jar 파일의 위치, conf 파일 설정 등을 확인해보았지만, 이렇다 할 문제는 발견되지 않았습니다.
어떤 상황에서 메소드 스캔이 이루어지지 않는지와 이를 해결할 수 있는 방법에 대해 알려주실 수 있나요?
감사합니다.

@sohyun-ku
Copy link
Contributor

@NineTIN

안녕하세요.
codeBase 위치가 잘못되었을 경우 메소드 스캔이 이루어지지 않을 수 있습니다.
참고하시면 좋을만한 Configuration 가이드 전달드립니다.

해당 설정 확인 후에도 정상적으로 동작하지 않는다면 scavenger.conf 파일 공유 부탁드리겠습니다.

@NineTIN
Copy link
Author

NineTIN commented Nov 28, 2023

@sohyun-ku
안녕하세요
답변 감사드립니다.
Configuration 가이드를 참고하여 codeBase를 설정 해보았으나
해결이 되지않아 scavenger.conf를 첨부 드립니다.

  • bootJar 파일과 conf파일 위치는 체크 했습니다.
    • jar = /home/user/deploy/api.jar
    • conf = /home/user/config/scavenger/scavenger.conf

scavenger.conf.zip

번거롭게 합니다만 확인 부탁드리겠습니다.
감사합니다.

@taeyeon-Kim
Copy link
Contributor

@NineTIN 안녕하세요. (_ _)
공유주신 설정과 로그상으로는 정보가 너무 제한적이라 확인이 어렵긴합니다...
로그상으로는 설정파일은 잘읽었으나 에이전트가 bootJar를 탐색할 때 com.example.application 패키지에 위치한 클래스(메소드)를 읽지 못했다로 보이긴합니다..

혹시 재현가능한 환경(jar와 사용하시는 jdk버전)을 공유주시기는 어려우실까요??

@NineTIN
Copy link
Author

NineTIN commented Nov 29, 2023

@taeyeon-Kim
안녕하세요,
더 자세한 정보를 제공하지 못해 죄송합니다.
문제가 재현되는 프로젝트를 아래 리포지토리에 업로드해두었습니다.
확인해주시면 감사하겠습니다.

JDK : 11
https://github.com/NineTIN/scavenger-test

그런데 여러 가지를 시도해본 결과, gradle의 bootJar 설정을 제거하니 정상적으로 스캔되는 현상을 발견해서 추가로 알려드립니다. 🤔

https://github.com/NineTIN/scavenger-test/blob/f8f97608fcd0b36bd4750c2349f805ebfda6185b/application/build.gradle.kts#L40-L44

@taeyeon-Kim
Copy link
Contributor

taeyeon-Kim commented Nov 29, 2023

@NineTIN 넵 확인했습니다.
혹시 bootJar task에 launchScript()를 추가하셔야하는 이유가 있을까요??
jar파일을 직접 실행하고 있지않고 java -jar로 수행하고 계시다면 해당 설정은 필요없어 보여 제거하면 될 것 같습니다.

@NineTIN
Copy link
Author

NineTIN commented Dec 1, 2023

@taeyeon-Kim
특별한 이유는 없이, 스프링 애플리케이션을 데몬 서비스로 등록하여 사용할 수 있게 하는 옵션 정도로 생각하고 자연스럽게 추가했던 것 같습니다.
말씀하신 대로 java -jar로 애플리케이션을 실행하고 있으니 launchScript()는 제거하도록 하겠습니다.
확인해주셔서 감사합니다.

그런데 한 가지 마음에 걸리는 점이 있습니다.
launchScript()는 데몬 서비스 사용을 강제하는 옵션이 아니라고 알고 있는데, 이 설정이 Scavenger에 어떤 영향을 끼쳤다는 말씀이실까요?

@sohyun-ku
Copy link
Contributor

@NineTIN

launchScript() 추가 시 agent의 codeBase 탐색과정에서 클래스 파일 정보를 가져오지 못하는 이슈가 있는 것으로 확인했습니다.
해당 옵션이 꼭 필요한 케이스가 아니라면 우선 제외 후 사용 부탁드립니다. ( _ _ )

@kojandy
Copy link
Contributor

kojandy commented Dec 11, 2023

@NineTIN
안녕하세요. 해당 설정이 어떠한 영향을 끼쳤는지 간략하게 설명 드리자면, launchScript()를 추가하신 뒤에 생성된 jar를 보시면 일반적인 jar가 아니고 셸 스크립트가 앞부분에 추가되어 있는 형태인 것을 확인하실 수 있습니다. 이는 systemd 등에 데몬 서비스로 등록할 때 자바의 경로를 찾는 등의 수고를 덜기 위해 직접 실행 가능하도록 해당 과정이 포함된 셸 스크립트가 생성되는 것인데요.

Scavenger는 탐색 과정에서 확장자가 jar인 파일을 마주치게 되면 해당 파일을 압축 파일로 취급하여 클래스 파일들을 추출하려는 시도를 하게 되는데, 이 과정에서 정상적인 압축 파일이 아니라 판단하여 해당 파일을 무시하게 됩니다.

launchScript() 설정을 사용하여 생성된 jar가 몇몇 툴들과 호환되지 않을 수 있다는 내용은 Spring Boot의 문서에도 간략하게 언급되어 있습니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants