본문 바로가기
devops

내 서비스에 Scouter APM을 적용해보기

by Kingbbode 2016. 9. 5.

Scouter APM이란?

 서비스를 운영하면서 여러가지 요소로 장애를 겪지만, 대부분의 문제는 Applcation입니다. 문제의 원인을 찾는 것은 굉장히 중요한 일입니다. 

 APM은 최종 사용자 에게 향상된 서비스 를 제공하기 위해 애플리케이션의 흐름 모니터링과 성능 예측을 통해 최적의 애플리케이션 상태를 보장하고 관리하도록 합니다. 애플리케이션 성능에 대한 문제는 서버, 클라이언트 , 네트워크 , 시스템  리소스 등의 여러 가지 요소에서 야기될 수 있으며 이들 몇 가지가 복합적으로 동시에 작용해 야기될 수도 있는데 이를 해결하기 위하여 사용자 의 관점에서 애플리케이션의 실시간  성능을 모니터링하고 응답 시간 을 측정하여 성능 저하 원인을 규명하며, 서비스가 일정 수준 이상으로 유지되도록 통계 및 예측을 통한 관리를 하는 등 지속적이고 신뢰할 수 있는 애플리케이션 성능과 최상의 애플리케이션 가용성 을 확보하기 위한 활동을 수행한다.(OKKY - APM이란? 참고)

 그렇게 탄생한 여러 APM 중 소개할 APM은 실시간 모니터링에 더욱 더 초점을 두고 만들어졌다는 Scouter!

 



자세한 소개는  Git 페이지 ReadMe와 Scouter 커미터로 활동하고 계신 이건희님의 블로그를 참조!


 경험해보고 느낀 몇 가지 장점을 간단히 소개해본다면,

  • 웹 기반이 아닌 애플리케이션 기반 클라이언트로 빠른 반응속도로 실시간 모니터링에 적합!

  • 구성요소의 배치가 매우 자유로움!(client 여러 개 중복 설치도 가능!, 개별 서버의 그룹핑 가능!)
    • 저 같은 경우는 여러 client를 구성하여 OS 체크용, Application 체크용, Applcation xLog 체크용, 전체 Config 관리용으로 사용하고 있습니다.

  • TPS에서 시간대별 확인 가능

  • Plugin을 제작, 적용하기 매우 쉬움!
    • 모든 Plugin은 Application 변동 없이 적용 가능하다는 것도 큰 장점!


등이 있습니다. 직접 경험해본다면 더욱 많은 장점들을 느낄 수 있을 것 입니다.




적용해보기


설치

다운로드 : https://github.com/scouter-project/scouter/releases/


위 경로에서 Scouter server, agent, client를 OS에 맞게 다운로드 합니다.



1. Scouter Server


원하는 폴더에 스카우터 압축을 풀으면 위와 같이 구성됩니다!

 conf/scouter.conf 파일이 스카우터 서버의 옵션을 설정할 수 있는 설정 파일입니다. Default로 6100 포트로 설정되어 있는 설정을 바꾸고 싶다면 해당 파일에서 수정을 합니다. 설정은 Client에서 더 쉽게 변경할 수 있으므로 일단은 Scouter Server를 구동합니다.

 

 Scouter Server jar를 구동!

 


2. Scouter Host


 같은 방법으로 압축을 풉니다!


 conf/souter.conf에 host 로그를 수집할 scouter server의 ip와 port, log 경로를 지정해줍니다. 그리고 scouter host도 구동!



3. Scouter Agent

  

 같은 방법으로 압축을 풉니다!

 conf 디렉토리에 원하는 이름으로 conf 파일을 생성해줍니다! 저 같은 경우는 ultron 프로젝트이므로 ultron.conf로 파일을 생성했습니다.


 collector의 ip와 port를 지정해줍니다. obj_name은 scouter client에 표시될 agent의 이름으로 작성해줍니다.


구동할 standalone tomcat 어플리케이션에서 구동환경에 javaagent와 scouter config를 경로를 지정해줍니다. 제가 설정한 옵션입니다. 



-Dscouter.config와 -javaagent 설정입니다. 그 외 설정은 제가 기본적으로 세팅해놓은 구동환경 설정 입니다. 그리고 war를 구동합니다!



 위와 같이 Scouter가 실행되고 Spring 어플리케이션이 올라오는 것을 확인할 수 있습니다.


4. Scouter Client


 OS 환경에 맞는 client를 다운로드 한 후 실행합니다.

 

 스카우터 콜렉터가 설치된 서버의 IP와 PORT를 입력하고 default id/pass인 admin/admin으로 실행합니다.



 그럼 이렇게! client가 실행됩니다! 좌측 Objects 탭에는 client 구동시 지정한 scouter collector 서버와 그 하위로 구동시켰던 host agent와 java agent 목록을 확인할 수 있습니다.


5. Java Agent Plugin


 scouter에서는 어플리케이션의 재시작없이 다양한 hooking 설정을 할 수 있도록 Plugin을 지원하고 있습니다!

 git 참고!


 예제로 특정 메소드의 파라미터를 xLog에서 확인할 수 있도록 찍어보는 Plugin을 작성해보겠습니다. 이 기능은 Capture Plugin을 활용해서 작성할 수 있습니다.


 git에서 Cature.plug를 참고하여 agent.java 경로에 plugin 디렉토리에 Cature.plug를 생성해줍니다!


 메소드의 시작시점에 hooking을 해주는 capArgs 메소드를 통해 해당 기능을 구현합니다. 


1
2
3
4
5
6
[args]
// void capArgs(WrContext $ctx, HookArgs $hook){
        Object[] args = $hook.getArgs();
        $ctx.profile("method name : " + $hook.getMethodName());
        $ctx.profile("params : " + (String)args[3]);
//}
cs


 작성된 내용은 위와 같습니다. HookArgs를 통해 arguments를 가져오고 제가 확인하고 싶은 3번째 argument를 profile에 찍어주도록 합니다. 해당 파일을 저장하는 즉시 nohup console에 아래와 같은 Plugin이 로드되었다는 설정을 볼 수 있습니다. 오타나 문법이 잘못되었을 시 컴파일 에러 로그가 찍힙니다. 



 이제 Client에서 java agent의 어떤 메소드를 후킹할 것인지 설정을 해주어야 합니다. Java Agent를 우클릭하여 configure를 클릭하면 config 설정창이 나옵니다. 여기에서 설정을 적용하면 자동으로 서버의 conf 파일이 업데이트 됩니다.


 scouter는 기본적으로 http request를 감지하여 xLog를 찍고 있으므로 hooking하고자 하는 method가 내부 스케줄링이나 특정 이벤트로 실행된다면 NON-HTTP 서비스 추적이 필요합니다.! 친절히 설명되어있는 가이드 문서를 참고해주시면 됩니다!


 args capture plugin을 사용하므로 config에 hook_args_patterns를 등록해줍니다!

ex) com.abc.abc.bot.service.Impl.MessageServiceImpl.excuteMessage

1
private void excuteMessage(String token, String room, String user, String content, String command) {
cs

 저는 3번째 argument인 command를 보도록 하겠습니다.


 hook_args_patterns에 등록된 클래스들은 클래스 리로드가 필요합니다!

 [Objects]에서 대상 Agent의 ObjectRequest 목록의 Loaded Class를 누르면 현재 로드되어 있는 클래스들이 나옵니다. 여기에서 우클릭 후 리로드를 해주면 어플리케이션 재시작없이 클래스를 리로드 할 수 있습니다!!


 위와 같은 예로 설정한다면 수 많은 감지되는 메소드 중 excuteMessage 메소드만이 설정해놓은 capArgs plug를 타게 됩니다. 그럼 xLog profile이 이렇게 땋!




 원하는 기능을 git 문서를 참조하여 간단하게 작성할 수 있습니다.


6. Scouter Plugin


 Java Agent 단이 아닌 Scouter Server단에서 수집된 데이터로 추가적인 기능들을 설정할 수 있습니다. Scouter Server에 규격에 맞게 제작된 플러긴의 jar 파일을 올려주기만 하면 설정은 끝입니다! 

 git 참고!


 기본적으로 제공되는 플러긴은


 

 위와 같으며 오픈소스이므로 커스터마이징해서 사용할 수도 있고 scouter-plugin-sever-null이란 sample plugin을 통해 기능을 제작할 수도 있습니다!


 예제로 작성될 플러긴은 Alert 플러긴 입니다! 특정 상황에 대해서 SMS, EMail, 메신저 등으로 상황을 알릴 수 있는 플러긴입니다! telegram, slack 등이 기본으로 제공되며 host agent에 대한 체크 기능을 기본으로 가지고 있습니다. 


 여기에 xLog에 감지되는 exception을 alert하는 기능을 추가해보았습니다!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    @ServerPlugin(PluginConstants.PLUGIN_SERVER_XLOG)
    public void xlog(XLogPack pack) {
        if (conf.getBoolean("ext_plugin_teamup_xlog_enabled"true)) {
            if (pack.error != 0) {
                String date = DateUtil.yyyymmdd(pack.endTime);
                String service = TextRD.getString(date, TextTypes.SERVICE, pack.service);
                if (PatternsUtil.isInValid(conf.getValue("ext_plugin_teamup_error_escape_method_patterns"), service)) {
                    AlertPack ap = new AlertPack();
                    ap.level = AlertLevel.ERROR;
                    ap.objHash = pack.objHash;
                    ap.title = "Ultron Error";
                    ap.message = service + " - " + TextRD.getString(date, TextTypes.ERROR, pack.error);
                    ap.time = System.currentTimeMillis();
                    ap.objType = "scouter";
                    alert(ap);
                }
            }
        }
    }
cs


 Scouter에서 제공하는 XLogPack을 활용하였습니다. 

 ext_plugin_teamup_xlog_enabled는 서버에서 콘피그로 임의로 true,false로 부여된 값으로 true일 경우메나 해당 기능이 작동됩니다!

 xLog의 error가 0(정상)이 아닐 경우에 TextRD를 통해 xLog 에러의 service 이름과 exception 내용을 텍스트로 가져와서 alert로 전송합니다. 이렇게!!


 저는 Scouter에서 제공하는 telegram, slack alert plugin의 open source를 활용하여 사내 메신저로 사용하고 있는 TeamUp의 Alert Plugin을 새로 제작하였습니다. (github)


 구현된 프로젝트를 jar로 빌드한 후 scouter server 디렉토리의 lib에 옮긴 후 scouter server를 restart 합니다! server config에서 지정했던 log 경로의 로그를 열어보면 Scouter가 올라가면서 BuiltInPlugin이 올라간 것을 확인할 수 있습니다.


 

 


 이렇게 간단하게 하나의 기능을 완성시킬 수 있습니다.





 오픈소스 기반이라 제공되는 기능을 파악한다면 여러가지 Plugin으로 원하는 기능을 쉽게 제작이 가능합니다!

 또한 소통의 공간이 여러군데 존재하고 있으며, 궁금한게 있을 때 질문을 올리면 굉장히 빠르게 답변을 해주십니다. 깜짝 놀랄 정도로!


이렇게 쉽게 사용이 가능하며 정말 많은 정보를 제공해주는 Scouter APM을 활용해서 보다 나은 서비스를 사용자들에게 제공할 수 있을 것 같습니다!



Scouter 사용자모임(https://www.facebook.com/groups/scouterapm/)


Scouter GitHub(https://github.com/scouter-project)

댓글