최근 진행되고 있는 프로젝트에서 AWS S3 와 CloudFront를 사용하여 동영상 서비스를 하고 있는데 CBT중이라 버그 리포팅이 자주 오고 있다.
분명히 테스트때는 정상 작동을 했는데 왜 항상 실제 사용하면 버그가 튀어나올까...?!
Video Thumbnail 파일을 새로 업로드 하였는데 이미지가 바뀌지 않는다는 내용의 문제가 접수되었다.
Thumbnail 수정 로직은 기존에 사용하던 파일 이름에 확장자만 새로 올린 사진 파일을 따르게 되어있었다. 해서, 사진이 업로드된 S3에는 새로 올려진 파일이 존재하는데, CloudFront에 요청을 하면 캐시되어있는 예전 사진이 보여지는것이었다.
파일이 새로 올라왔는데 CloudFront는 왜 새로운 파일을 캐시하지 못했을까?
문제 해결을 위해 문서를 찾아보니 다음과 같은 내용을 확인하였다.
CloudFront 배포에서 기존 객체를 업데이트하고 동일한 객체 이름을 사용할 수는 있지만 권장되지는 않습니다. CloudFront에서는 오리진에 새 객체나 업데이트된 객체를 배치할 때가 아닌 객체가 요청된 경우에만 엣지 로케이션에 객체를 배포합니다. 이름이 같은 최신 버전으로 오리진에서 기존 객체를 업데이트한 경우, 다음 두 가지 상황이 모두 발생하기 전까지는 엣지 로케이션에서 오리진으로부터 새 버전을 가져오지 않습니다.
테스트를 진행해 보기에 앞서, Robo Test가 "어디까지 테스트를 해줄 수 있을까? 또는 이런것도 테스트가 가능할까?"에 대해서 생각을 해보았다.
1) 게임 플레이 시간 수집
앞서 설명한 바와 같이, On-ly는 사용자의 게임 플레이 시간을 수집하여 정보를 제공하는 앱이다. 게임 플레이 시간 수집을 테스트하기 위해서는, "a) 게임이 설치되어 있어야하고, b) On-ly가 설치되어 있어야 한다. c) 게임을 일정시간(5분이상) 실행한 후, d) On-ly를 실행해야 한다."와 같이 타 앱과의 연계가 필요하다.
2) Facebook 연동(로그인 기능)
부가 기능(친구 데이터 공유, 데이터 persistency등)을 위해 Facebook 연동을 제공하고 있다. 만약, Robo Test에서 로그인이 가능하다면 서버에 저장된 데이터를 사용하여, UI 테스트가 가능하다.
3) 전체 페이지(State) 테스트
사용자가 접할 수 있는 On-ly의 총 페이지(State)는 43개이다. 43개는 동일한 기능(상세 팝압)은 1개의 페이지로 고려하였을때 확인된 수치이다. 실제로는 더많은 페이지를 접하게 된다. 이번 테스트에서는 전체 중 몇%의 페이지를 Robo Test가 테스트 할 수 있는지를 확인하려고 한다.
(* 페이지별 세부 테스트 또는 페이지의 연계성을 고려한 테스트는 고려하지 않음)
<On-ly 페이지별 스크린샷>
4) 시스템 권한
On-ly는 게임 모니터링을 위해, "android.permission.PACKAGE_USAGE_STATS" 시스템 권한이 필요하다.(*Android 5.1, Lollipop 부터 시스템 권한으로 변경됨)
시스템 권한은 앱을 설치후 사용자가 직접 안드로어드 OS 설정 페이지에서 권한을 추가해야 한다. 즉, 테스트시 안드로이드 OS와의 연계가 필요하다.
<PACKAGE_USAGE_STATS 시스템 권한 획득과정>
당연히 내부에서 테스트를 진행할 시 위 4가지만을 고려하는 것은 아니다. 더 많은 항목을 테스트 해야 한다. 단, 본 테스트에서는 Robo Test로 큰 틀에서 어느 범위까지 테스트가 가능한지를 확인하기 위해 위 4가지 항목으로 정해보았다.
2. Robo Test 실행
Test Lab을 사용하기 위해서는 Firebase가입 및 카드 등록이 필요하다. 시간당 $5로, 테스트 장비 대여 및 관리 비용이라고 생각하면 비싼 가격은 아니라고 생각된다.
프로젝트는 Firebase console에서 "새 프로젝트 만들기"로 생성할 수 있다. 해당 프로젝트로 이동하면, 좌측 DEVELOP -> Test Lab을 확인할 수 있다.
<새 프로젝트 만들기>
2.2. 테스트 실행
메뉴의 DEVELOP -> Test Lab을 선택하고, "테스트 실행 -> Robo 테스트 실행"을 선택한다.
<Robo Test 실행>
테스트할 앱(On-ly)의 APK를 업로드한 후 "계속"을 선택한다.
<앱 선택(APK 업로드)>
테스트 실행 단계에서 가장 복잡한단계로, [실제기기, API수준, 방향, 언어, 고급 옵션1, 고급 옵션2]6개의 측정기준을 선택하는 단계이다. "테스트의 개수 = 실제기기 수 x API수준 수 x 방향 수 x 언어 수"로 결정된다. 본 예제는 1x3x1x1=3으로 3개의 테스트를 진행한다.
고급 옵션은
1) 테스트 제한시간: 테스트를 실행할 최대 시간(분)으로, 기본은 5분으로 설정되어 있다.
2) 최대 깊이: Robo 테스트에서 앱 UI의 특정 분기를 얼마나 깊이 탐색한 후 UI 루트(기본 화면)로 돌아가서 다른 분기를 탐색할지를 결정합니다.
으로 기본값으로 테스트 하였다.
<측정기준 선택>
테스트가 모두 완료되면 아래와 같은 결과를 확인할 수 있다. 모두 통과 하였다. 이제 상세 결과를 확인해 보자.
"1. On-ly 테스트 Coverage"에서 생각해 보았던 내용을 충족시킬 수 있는지를 확인해 보자.
1) 게임 플레이 시간 수집 (테스트 할 수 없음)
"2.2. 테스트 실행"에서 확인한 바와 같이, 테스트 대상 앱 이외의 앱은 설치가 불가능 하다.
2) Facebook 연동 (실패 테스트만 가능)
테스트 Input에 사용자 데이터가 없다. 즉, 로그인 Action을 수행(테스트)할 수 는 있지만 로그인 성공에 대한 테스트는 불가능 하다. 아래 "활동 지도"에서 "Facebook 로그인" 페이지에서 실패를 반복하고 있다. 또한, 이로인해 테스트 시간을 모두 소비하여 다른 페이지는 테스트를 진행하지 못한것으로 판단된다.
<활동 지도 결과>
3) 전체 페이지(State) 테스트 (약 79%는 테스트 하지 못함)
Facebook 로그인을 실패한 페이지의 중복을 제거하면, 9개의 페이지를 테스트 하였다. On-ly의 전체 페이지(49) 중 약 21%의 페이지만을 테스트한 것이다.
또한, 로그인 실패(수집된 데이터가 없는경우)한 경우만 확인을 하면 전체 17페이지 중 약 53%의 페이지만을 테스트 하였다.
<스크린샷 결과>
4) 시스템 권한 (테스트 하지 못함)
API 22(Lollipop)에서 새로 추가된 PACKAGE_USAGE_STATS를 위한 시스템 권한 획득에서 더이상 진행되지 않았다.
<API 22 테스트의 활동 지도 결과>
4. 마치며
어찌보면 당연한 결과일지 모른다. 또는, Firebase에서 Robo Test의 사용목적과 부합하지 않는 테스트만 진행한 것 일 수도 있다. 그러나, 만약, 모두 자동으로 잘 테스트 되어 진다면 얼마나 좋을까?라는 생각을 해보았다.(누군가는 허황된 꿈? 이라고 할 수 있을 것이다)
최근 자동화 앱 테스트(Automated App Test) 또는 자동화 테스트 입력 생성(Automated Test Input Generation)에 대한 연구 자료들을 보기 시작했다. 자료들에서도 Robo Test와 동일한 컨셉으로 연구를 진행하고 있다[9-12].
a)Android Activity분석 -> b)분석 결과를 model(Finite State Machine[8])화 -> c)Model의 최적화(learning algorithm, heuristics 등을 이용) -> d) 테스트 입력 생성(Test Input Generation)
연구 자료를 보면서 전체는 아니더라도 지금보다는 더 나은 방향으로 갈 수 있지 않을까 생각해 보았다.
*본 글은 절대로 Firebase의 Robo Test를 비판 또는 평가하기 위한 목적으로 작성되지 않았습니다.
References
[1] Firebase Overview Google I/O 2016, https://www.youtube.com/watch?v=tb2GZ3Bh4p8
[8] Finite State Machine Wiki, https://en.wikipedia.org/wiki/Finite-state_machine
[9] Guided GUI Testing of Android Apps with Minimal Restart and Approximate Learning, http://www.cs.berkeley.edu/~necula/Papers/swifthand-oopsla13.pdf
[10] MobiGUITAR – A Tool for Automated Model-Based Testing of Mobile Apps, https://scholar.google.co.kr/scholar?q=A+Tool+for+Automated+Model-Based+Testing+of+Mobile+Apps&btnG=&hl=ko&as_sdt=0%2C5&as_vis=1
[11] Reducing Combinatorics in GUI Testing of Android Applications, https://seal.ics.uci.edu//wp-content/uploads/seal/PID4096715.pdf
[12] A GUI State Comparison Technique for Effective Model-based Android GUI Testing,https://scholar.google.co.kr/scholar?q=A+GUI+State+Comparison+Technique+for+Effective+Model-based+Android+GUI+Testing&hl=ko&as_sdt=0&as_vis=1&oi=scholart&sa=X&ved=0ahUKEwj6gMbo16nNAhXj3aYKHW5TA1sQgQMIGjAA
요새 AWS에서 제공하는 서비스들을 사용하여 동영상 스트리밍 서비스를 구축을 하고 있다. AWS쪽 관리와 운영 방법을 인수인계를 받는 중에 정리를 위하여 블로그를 작성해보기로 했다.
AWS S3와 CouldFront를 사용하여 동영상 스트리밍 서비스 해보기.
시나리오
이 동영상 스트리밍 서비스는 권한이 부여된 사용자에게만 서비스를 하기 위하여 Signed Cookie와 Signed URL을 사용하여 서비스 한다.
준비물은 다음과 같다.
1) AWS CloudFront, S3
2) 서비스 대상 HLS 파일
1. 먼저 S3에 Bucket을 생성한다.
2. 서비스 대상 HLS파일을 S3에 업로드 한다. 파일 업로드 방법은 다양한데, 이번 예제에서는 AWS Consol을 사용하여 업로드 해 보도록 하겠다.
먼저 폴더를 생성한다.
서비스 대상 HLS 파일들을 업로드 한다.
업로드가 완료되었다.
3. CloudFront 설정
CloudFront를 셋팅하기 위해 CloudFront페이지로 접근한다.
3.1 주요 설정
CloudFront의 주요설정은 다음과 같다.
Delivery Method
- RTMP와 WEB이 있다. HLS는 WEB 방식의 Delivery를 사용하기 때문에 값을 WEB으로 선택한다.
Origin Domain Name
- CloudFront로 서비스 하고자 하는 S3 Bucket이름이다. 클릭하면 select box가 나타난다.
Origin Path
- S3 Bucket내의 DocumentRoot. S3 Bucket 내의 디렉토리 중 어느 위치를 해당 CloudFront의 /로 사용할 것인지를 나타낸다.
Restricted Bucket Access
- S3에서 자체적으로 서비스를 하지 않고 CloudFront를 통해서만 서비스가 가능하도록 한다.
설정값은 Yes.
Origin Access Identity
- S3 접근에 사용할 접근 정보. 이미 기존에 만들어진 것이 있기 때문에 기존 내용을 사용하면 된다. CloudFront의 좌측 하단 메뉴에서도 관리가 가능하다. 설정 값은 Use Existing Identity.
Grant Read Permissions on Bucket
- Origin Access Identity가 S3에 접근 가능하도록 하기 위해서는 S3의 Policy를 업데이트 해야 한다. 이것을 자동으로 해준다. 설정값은 Yes.
Forward Header
- CORS가 정상적으로 적용되도록 하기 위해서는 Origin을 Forward해줘야 한다. 설정 값은 WhiteList.
Restricted Viewer Access
- Signed Cookie, Signed URL이 필요하도록 할 경우 Yes. Signed Cookie, Signed URL을 통해서만 접근이 가능하도록 할 경우 설정한다.
그 외의 옵션은 모두 기본값으로 설정한다.
3.2 CloudFront Key Pairs
Signed Cookie, Signed URL을 사용할 경우 Security Credential에서 CloudFront Key Pairs를 설정해야 한다. Security Credential 메뉴는 우측 상단의 로그인 아이디를 클릭하면 메뉴에 나타난다.
여기에서 CloudFront Key Pairs를 추가하거나 Access Key ID를 확인할 수 있다.
4. 동영상 재생을 하기 위해 HLS 파일 주소 가져오기
지금 하고 있는 프로젝트에서는 Signed URL, Signed Cookie 생성시 expire time을 1분으로 주어 생성된 url을 1분간 유효하도록 하였다. 하지만 1분이 지나면 비디오 시청이 불가능해지므로, 비디오 재생 후 매 30초 마다 Signed Cookie를 발급받는 api를 호출하여 인증 갱신하도록 하였다.
4.1 동영상 시청을 위하여 Signed Cookie를 발급하는 API를 호출한다. 이 API는 CloudFront-Key-Pair-Id, CloudFront-Policy, CloudFront-Signature를 키값으로 하는 쿠키를 발급한다. Signed Cookie 생성은 아래 문서를 참고하여 만든다.
http://도메인 이름/{Path가 포함된 file명}?Policy={암호화된 Custom Policy값}&Signature={암호화 된 signature값}&Key-Pair-Id={Access Key ID값}
위의 방법을 통해 S3내의 HLS파일을 받아와 플레이어에서 재생시킬 수 있다. 현재 진행중인 프로젝트에서는 html의 video태그와 hls.js를 이용하여 라이브스트리밍을 가능하게 하였다.
마치며...
AWS에서 제공하는 Product로 구성해본 동영상 스트리밍 서비스는 HLS파일이 있다면 매우 간단하고 빠르게 구성하여 서비스 가능하다. 또한 CloudFront설정에서 Signed Cookie와 Signed URL사용으로 파일 보안까지 유지 할 수 있다. 물론 HLS파일이 준비되어있다는 가정 하에 구성한것이라 간단한 작업을 통해 구성될 수 있었다. AWS Elastic Transcoder를 이용하여 Video파일을 HLS파일로 Transcoding을 할 수 있는데 이것은 다음번 포스팅에서 다루도록 하겠다.
지난번 포스팅에서 Chrome Speech를 활용해서 웹 기반 어플에서 말하기 기능을 쉽게 사용하는 방법에 대해서 포스팅 했습니다.
기존 기능을 테스트 해보다가, 메신저에서 여자사람 목소리를 친구에게 보내면 재미 있겠다 싶어서 (여자 목소리로 욕을 보내면 재미있을것 같.. ㅎ) 무작정 만들어 보기로 했습니다.
일단 연동 가능한 메신저 후보군은 많은데, 그중에서 많이들 쓰시는 카톡/Line은 등록하고 하는게 귀찮을것 같고, 개발자에게 무지 친화적인 텔레그램으로 맛만 보기로 결정했습니다.
오늘은 만드는 과정은 차후에 알려 드리기로 기약하며, 결과물과 경험에 대한 공유를 하고자 합니다.
1. 텔레그램
다들 아시리라 믿습니다. 항간에 보안에 용의한 메신저라고 국가적 보안크리에 반발하여 다들 가입 러쉬가 이뤄졌던 외산 메신저 입니다. 최근에 미국 FBI등 여러 국가 기관에서도 보안검열 같은 움직임에서 조금 이라도 자유로워 지기 위해서 사용자들이 이쪽으로 많이들 갔죠.
저는 보안에 좀 너그러운 상태라서, 굳이 이민까지는 생각하지 않았는데, 오픈소스를 지향하는 개발자로, "오픈되어 있는 개발환경"에 대한 필요성 때문에 올해 가입해서 테스트 용도로 사용중입니다.
2. 텔레그램과 외부 (나의) 프로그램의 연동
텔레그램에서 외부 프로그램과 연계는 중간에 가상의 대화친구인 봇(bot)이라는 대리인을 구현하여 사용할수 있습니다. 여기서 봇(Bot)은 로봇의 준말로 생각하시면 되고, Telegram과 대화를 대신하는 기계/콜백 프로그램으로 생각하면 됩니다. 봇(bot)에 대한 제약은 거의 없는 편이고, 취향에 맞게 개인 서버에 심어서 텔레그램 서버에 제공하면 됩니다. 봇은 크게 2가지 방법으로 준비 할수 있는데, 가장 간단하게는
1) telegram-cli 라는 텔레그램의 프로토콜을 리버스 엔지니어링으로 만든 환경을 사용하는것이고
2) Telegram Bot API라는 official platform/library 기능을 활용하여 연동할수 있습니다.
저희는 이것 저것 손볼께 있어서 그 나마 확장용이한 Telegram Bot API를 활용했습니다.
일반적으로 bot을 만들고 텔레그램에 *무료*로 등록하고 나면 (저희의 경우 isaybot) 누구나 대화 친구처럼 추가해서 사용가능합니다.
Note: 다른 메신저는 사용가능한 앱이 뭔지 알려주는 앱스토어 같은게 존재 하는데, 텔레그램은.. 아... 애석하게도 그런게 없습니다. 그냥 사용자가 지인을 통해서 그 봇의 존재에 점조직처럼 알음알음 퍼집니다. 앱을 열심히 만드는 사람의 경우 홍보의 이슈가 있어서 피곤하고 약간은 문제죠. ^^; 차후 바뀔수도 있을꺼라고 사료됩니다.
3. 사용법
3.1 봇(bot) 추가
일단 텔레그램 앱이 여러분의 스마트폰에 설치가 되어 있다고 가정을 하겠습니다. 특정 봇(bot)을 추가하려면, 대화상대 추가와 똑같이 생각하면 됩니다. 대화상대 추가하듯이, 텔레그램 친구목록의 위쪽에 돋보기(Search)를 누르면, 두번째와 같은 화면이 나옵니다. 그창의 맨위 입력부분에 "isaybot"이라고 치면 아래와 같이 isaybot이 보입니다. 그럼, 봇을 선택하여 추가하세요.
isaybot을 누구나 추가할수 있는 가상의 대화상대/친구로 생각하면 됩니다.
3.2 isaybot 사용하기
isaybot이 대화상대로 추가되면, 맨 처음으로 아래에 나타나는 [ start ] 버튼을 눌러서 시작합니다. 이후에는 언제든지 친구리스트에서 isaybot을 선택하여 봇과 대화를 시작하면 됩니다. 우리 isaybot의 경우에는 제일 처음 내리는 /change 명령(command)을 통해서 음성대화를 하기 위한 환경세팅이 끝납니다.
/change 명령어는 말하고 싶은 언어를 선택하는건데, /change라고 치면 위와 같은 사용자 키보드가 뜹니다. 위의 그림 처럼, 사용자 키보드에서 isaybot이 한국음성으로 말하게 하고 싶으면, /koKR을 선택하면 됩니다.
Note: 목소리는 언어별로 약 40여개 지원 합니다.
한국어 음성으로 설정이 언어설정이 끝난 후, 마지막으로 Message (입력창)에 아무글이나 적어 보세요. 저는 친구를 놀려 먹기 좋은 "오빠 라면먹고 가세요"를 쳐봤습니다 ㅎ
그러면 위의 그림과 같이 서버에 입력된 글을 보내서, 잠시후 입력한 글을 여자사람 음성을 만들어서 다시 내게 보내줍니다. 보내준 메시지에 파란 플레이 버튼을 눌러주면, "오빠 라면먹고 가세요"가 음성으로 나옵니다.
혼자만 듣기 아깝죠? 친구에게 텔레그램으로 보내보세요. ^^ 음성 메시지의 오른쪽에 보면 화살표 버튼이 있습니다. 그걸 누르면 친구목록 뜨며, 친구 이름을 선택하여 보내기 버튼만 누르면 됩니다.
재미있죠? ㅋ
4. 확장 사용법: "inline" isaybot
위의 isaybot을 친구와 대화하는 방식으로 사용하는 방법 말고, 친구 추가 없이 다른 사람과 대화중에 사용가능하는 방법이 있습니다. 텔레그램에서는 이걸 "inline" bot 이라고 하는데, 아무 대화창에서 "@"로 시작하는 명령어를 날리면 되는데, "@" 명령으로는 봇의 이름을 사용하면 됩니다.
가령, isaybot을 inline 봇으로 사용하고 싶은경우, 위의 그림처럼 @isaybot을 대화 입력창에 치고, 글 내용을 치고 잠시 머물면, 위와 같이 팝업 메뉴가 뜹니다. 이후 언어중 하나를 눌러주면, 아래와 같이 새로운 링크를 포함한 메세지(Facebook Open Graph)가 대화창에 나타납니다.
위 수신된 메세지 본문의 그림을 눌러주면 음성을 들어 볼수 있는 웹플레이어가 뜹니다. 참고로, 팝업 플레이어는 본분의 그림을 눌렀을때만 뜹니다. 반면 링크를 누르면, 추가적인 새 웹창이 뜨면서 플레이어가 뜹니다. (텔레그램에서는 PC나 태블릿인 경우 팝업플레이어가 지원되지 않고, 웹플레이어만 지원됩니다.)
작년 말에 접하게 된 마이크로소프트의 에반군이 만든 garage 프로젝트인 스마트미러(Smart Mirror) 에서 확인 했었고, 거의 모든 오픈소스 스마트 미러 프로젝트는 라즈베리파이(RPi)등의 Arm기반 보드에서 "리눅스"로 돌리고 있었기 때문에 믿기 힘든 비보였습니다.
"쫌! 잘해봐. 말이돼냐? (썩소)" "아니예요, 실제 잘 안된다고 어디서 본것도 같아요.(떨리는 눈빛)"
'에이 설마, 또 초짜 주우우니어 호빗 개발자의 닥질..' 여전히 그 생각이였고, 솔직히 다른 OS에서 다되는데 리눅스에서 안된다는 건 약간은 리눅스(마이프레셔스!)를 데탑으로 끌어 안고 사는 한때 호빗 개발자였던 골름의 밥상에 돌 던진듯한 느낌을 받는...
12월 중순 쯤 회사내에 흥미로운 동영상이 공유 되었는데 바로 smart-mirror 라는 프로젝트였습니다. 아래 동영상을 보시면 smart-mirror에서 사용자의 음성으로 지도나 philips hue 전등을 컨트롤 하는 모습을 보실 수 있을 것입니다. 되게 fancy해 보이지 않나요? smart-mirror에서 사용한 언어는 javascript이며 speech recognition library로는 annyang 을 사용하고 있었습니다.
회사 내에서도 우리도 해보자라는 의견이 나오기도 했고 마침 이전 프로젝트도 끝나고 시간이 남아 Garage Project로 smart-mirror를 하게 되었습니다.2주 동안 진행했던 이 프로젝트의 1단계 목표는 아래와 같습니다.
첫번째, smart-mirror 한글화
두번째, 재미있는 기능(youtube search, 지하철 도착 정보, Sound Cloud 음악 재생 등) 추가
이 프로젝트에서 추가로 사용한 API는 다음과 같습니다.
1. Youtube Data API
2. 서울시 지하철 도착정보 open API
3. Sound Cloud API
smart-mirror는 소프트웨어 측면보다 하드웨어 측면에서 준비하는 시간이 걸렸습니다.
준비물(원하는 결과물에 따라 가격이 달라질 수 있습니다. )
물품
가격 (단위: 원)
회사에 안쓰고 굴러다니던 오래된 태블릿
0
philips hue 전등
279,000
고대유물이 되어 방치 되었던 서버랙 유리 문짝
0
절연테이프
1300
아크릴 (가로: 40cm , 세로 : 50cm) 1개
10,000
미러필름 1m~2m
18,000
총 비용
308,300
하드웨어 구성을 살펴 보면 라즈베리파이 2, USB microphone, 모니터, one-way mirror, philips hue 전등으로 구성되어 있었는데 라즈베리파이 2 + 모니터 대신 사용한지 오래된 노트북이나 태블릿 등을 사용하였고, philips hue 전등은 프리스비에서 구매하였습니다. 한가지 남은게 있다면 one-way mirror가 관건이었습니다. 현재 한국에서 one-way mirror를 구하는 것이 어려울 뿐만 아니라 상당히 비싼 가격에 판매되고 있어서 대체 할 만한 것을 계속 찾아보다 유리에 미러필름을 붙였습니다.
미러필름의 판매처는 다음 링크에서 확인하세요.[사이트내에 가격이 30m가 180,000원, 1m~2m가 18,000원에 판매 되고 있습니다. ]
"E2E Monitor 프로젝트 회고"포스팅을 보면, 프로젝트 진행 당시 빠른 시간 안에 결과물을 만들어서 검증하기 위해 추적 정보 생성기를 "수동 추적 방식"으로 개발하였습니다. 하지만 "수동 추적 방식"은 모니터링 대상 시스템에 바로 적용이 어렵기 때문에 E2E Monitor의 최우선 과제로 "자동 추적 방식"을 꼽았습니다. 따라서 자연스럽게 Back-end 고도화는 "BCI(Byte Code Instrumentation)기법을 사용한 자동 추적 정보 생성기 개발" 이 되었습니다.
고도화 부분
E2E Monitor 프로젝트는 아래 <그림1.>처럼 크게 3가지의 구성요소로 나뉘는데요,
<그림 1. E2E Monitor 구성요소>
이 중에 추적 정보 생성기에 대해 "자동 추적 방식"을 사용할 수 있도록 고도화를 진행하였습니다.
추적 정보 생성기 개발
자동 추적 방식을 도입하기 위해 BCI 기법을 사용한 여러 가지 모니터링 툴을 조사하던 중 ASM 기반으로 구현되어있는Java Agent 프로그램인 Byteman을 접하게 되었습니다.
Byteman은 재컴파일이나 재구동 없이 실행 중인 어플리케이션에 Bytecode를 변형, 주입 및 제거 가능한 기능을 가지고 있습니다. Byteman에서 사용하는 DSL(Domain-Specific Language)로 "Rule" base script를 생성하여동적으로 디버깅 코드를 디버깅 대상 Application에 적용 가능합니다.
즉, Byteman을 도입하면 "Rule" Script를 통해 E2E Monitor에서 필요한 정보를 모을 수 있는 추적정보 생성기를 모니터링 대상 Application에 동적으로 적용 가능한 것입니다. 이러한 이점 때문에 Byteman을 도입, 자동 추적 정보 생성기를 개발하였습니다.
자동 추적 정보 생성기가 수집하는 정보
기존에 개발했던 수동 추적 정보 생성기에서 생성한 정보들을 전부 수집 및 생성할 수 없었지만, 사용자 프로그램에 표시하기 위한 기본정보가 추출됨을 확인하였습니다.
자동 추적 정보 생성기에서 추출할 수 있었던 정보는 다음과 같습니다.
1. 하나의 네트워크 통신의 시작과 끝
2. 하나의 네트워크 통신을 처리하는 데 걸린 시간
3. 네트워크 Request 종류, URI, 파라미터 이름, 파라미터값 -> 고도화에서 추가된 정보
4.현재 모니터링 하고 있는 Application의 이름
5. 네트워크 통신 처리 시 수행된 Method 이름
6. 네트워크 통신 시퀀스 정보(네트워크 통신 또는 DB 질의가 발생한 경우 Call Stack처럼 수집) -> 고도화에서 추가된 정보
7. DB 쿼리와 수행 시간 -> 고도화에서 추가된 정보
8. E2E Monitor에서 추적에 필요한 필수 정보를 HTTP 통신 시 사용하는 Client 헤더에 자동으로 Inject
9. Throw된 Exception 기록
Emulator에 자동 추적 정보 생성기를 실행하여 E2E Monitor의 사용자 프로그램이 어떻게 표현해 주는지 확인해 보았습니다.
먼저 수동 추적 생성기를 적용한 경우 사용자 프로그램은 아래와 같이 표현됩니다.
<그림 1. 수동 추적 정보 수집기를 사용한 경우 볼 수 있는 정보>
다음은 자동 추적 정보 수집기를 사용한 경우 표현입니다.
<그림 2. 자동 추적 정보 수집기만을 사용한 경우 볼 수 있는 정보>
수동 추적 정보 수집기가 보여주는 정보에 비해서 빈약한 정보를 보여주고 있지만, 자동으로 수집된 정보는 사용자에게 대략적인 네트워크 플로우를 보여줄 수 있는 수준입니다.
마무리
이번 고도화에서 모니터링 대상 시스템에 BCI 기법을 도입한 자동추적 정보 수집기를 동적으로 적용 할 수 있게 하였습니다. 기본적인 정보를 자동 수집하여 사용자 프로그램에서 표현이 가능했지만, 추가로 모은 정보를 표현하지 못한 부분이 있었습니다. 이는 추적정보 처리기와 사용자 프로그램이 같이 개발 되어야 했기 때문입니다. 이 부분은 향후 개발 계획에 넣어 놓고 이번 고도화를 마무리 지었습니다.
E2E Monitor는 이제 기존의 수동 정보 수집 방식에 더하여 자동 정보 수집 방식까지 갖추게 되었습니다. E2E Monitor v3.0을 기대하며 이번 포스팅을 마칩니다.