- Elasticesearch 를 이용한 APM Server, Agent
Elasticsearch 에서 오픈소스 APM을 공개하였는데, 주변에 사용 후기가 거의 없어서 필자가 직접 구성하여 테스트를 해봤다. 직접 사용해보니 Elastic APM이 나쁘지는 않지만, 조금 아쉬운 점이 있어서 실무에서 사용하기에는 아직 미흡하다는 판단이다. 비록 실무에서는 당장 사용할 계획은 없지만, 필자가 테스트했던 내용을 간단하게 글로 정리해서 기록을 남겨본다.
https://www.elastic.co/guide/en/apm/get-started/current/overview.html
필자는 오픈소스 APM인 스카우터 와 핀포인트를 회사에서 잠깐 사용해본적 있다. 또한, 실무에서는 유료 APM 인 와탭을 최근에 사용을 했었다. 개인적으로는 최근에 사용했던 와탭이 정말 좋았지만, 유료라서 편하게 사용하기 어려웠고 분산환경에서의 모니터링이 쉽지가 않았다. 참고로, APM은 아니지만 스프링 부트 환경에서 분산 환경 모니터링을 위해 지난번에 Spring Cloud Slueth 와 Zipkin 을 연동을 했었던 필자의 예전 글을 참고해보길 바란다.
https://brunch.co.kr/@springboot/58
어쨋든 필자가 담당하는 플랫폼을 안정적인 시스템 운영을 위해서, APM 도입은 필수라고 판단하고 있는 상황이었는데, 시스템 전체 환경이 분산환경으로 애플리케이션이 컴포넌트 단위로 나누어져 있다. 현재 ELK 스택으로 모니터링을 하는 시스템이 있지만, 해당 시스템은 분산환경에 대한 모니터링까지는 아직 지원을하지 못하고 있는 상황이라서, 분산환경 모니터링이 가능한 APM 을 검토하던 중이었다. 어쨋든, 이 글에서는 APM 에 대한 자세한 설명은 생략하겠다. Eleastic APM 에 대해서 집중해서 글을 작성할 예정이다.
Elastic APM 은 아래의 컴포넌트로 구성된다.
Elasticsearch
APM Server
APM agents
Kibana APM UI
모니터링을 해야 하는 서버에 실행되는 애플리케이션과 Agent 를 연동해야 한다. Agent는 애플리케이션에서 발생하는 모니터링 데이터를 APM Server 로 전송한다. APM Server 는 전송받은 데이터를 Elasticsearch 에 저장하고, Elasticsearch 에 저장된 데이터를 Kibana 에서 시각화해서 볼 수 있다.
설치 과정은 생략한다.
설치 과정에 생략한다. 아래 링크를 참고해서 설치하길 바란다.
https://www.elastic.co/guide/en/apm/server/6.5/index.html
필자는 Elasticsearch 가 설치된 동일 서버에 APM Server를 설치하였다. 필자처럼 Elasticsearch 와 APM Server 를 동일서버에 구축할 필요는 없다. 필자는 YUM 으로 설치를 하였는데, /etc/apm-server/ 경로에 apm-server.yml 파일이 생성되었다. 다른 환경으로 설치한다면 해당 파일의 경로가 다를 수 있다는 점 참고하길 바란다. apm-server.yml 에서 Elasticsearch 경로를 지정해줘야 한다.
필자는 동일 서버에 설치한 Elasticsearch 의 경로를 지정하였다. 설정이 끝나면 apm-server 를 시작해보자.
정상적으로 잘 실행하였다. APM Server 는 기본으로 8200 포트로 실행이 된다.
키바나 설치에 대한 자세한 설명은 역시 생략한다.
https://www.elastic.co/guide/en/kibana/6.5/xpack-apm.html
Kibana 를 설치하고 Elasticsearch 의 경로를 지정해야 한다. 필자는 역시 YUM 으로 설치를 하였고 /etc/kibana 의 디렉토리에 kibana.yml 파일을 수정하겠다.
kibana 는 기본으로 5601 포트로 실행된다.
에이전트는 모니터링을 해야하는 애플리케이션에 연동하면 된다. 필자는 스프링 부트 애플리케이션을 실행해보겠다. 일단 agent jar 파일을 다운로드 받아야 한다.
https://search.maven.org/search?q=a:elastic-apm-agent
https://mvnrepository.com/artifact/co.elastic.apm/elastic-apm-agent
jar 애플리케이션을 실행할 때 에이전트를 등록해주면 된다. 다른 APM agent 와 유사하다.
java
-javaagent:/path/to/elastic-apm-agent-<version>.jar
-Delastic.apm.service_name=my-cool-service
-Delastic.apm.application_packages=org.example
-Delastic.apm.server_urls=http://localhost:8300
-jar my-application.jar
-Delastic.apm.service_name : 애플리케이션의 이름
-Delastic.apm.server_urls : APM Server 경로
구축한 APM 환경에서 모니터링을 해보자. APM 메뉴에서 우측 상단에 Setup Instructions 을 클릭하여 초기 설정을 할 수 있다. 필자가 셋팅한 이후에 아래와 같이 Services 에 Agent 가 연동된 서비스가 표시가 잘 된다.
Request 탭에서는 요청에 대한 정보를 확인할 수 있다. Response 응답 시간과 상태코드를 확인할 수 있다.
Errors 탭에서는 에러가 발생한 요청을 확인할 수 있다.
필자가 임의로 오류를 발생시켰다. 클릭을 해서 오류 내용을 자세히 확인할 수 있다. Stacks Trace 정보도 확인할 수 있다.
오류 내용이 짐작이 되는가? 필자가 API 서버에 Redis 를 연동했는데, Redis 커넥션을 맺지 못해서 발생한 오류이다.
요청에 대한 Traces 정보를 확인해보면 아래와 같다.
필자의 요청이 단일 서버 요청이라서 아래 Timeline 이 매우 단순하게 나왔다. 분산환경에서 구축하게 되면 아래와 같이 표시가 될 것이다. 꽤 괜찮아 보인다.
각 트레이스 요청을 클릭하면 아래와 같이 디테일한 정보를 확인 할 수 있다.
Elasticsearch 에 저장된 데이터를 시각화해서 보여주는 것이기 때문에 당연히 검색 기능이 매우 잘 되어있다.
분산 환경 모니터링이 가능하다는 점은 분명히 장점이 될 것이다. 또한 초기 설정이 매우 쉽고 Kibana 에 시각화되어 보여주는 모니터링 UI 는 매우 사용성이 높을 것으로 생각된다. 그리고... 결정적으로 Elasticsearch 에 저장된 데이터이기 때문에 검색이 쉽고, 머신러닝 기능을 통한 분석도 가능하기 때문에 여러가지 면에서 효율성이 높은 APM 인 것은 분명하다.
하지만, 아직 APM 으로서의 기능이 많지가 않고 Java 에이전트가 시스템(CPU, 메모리 등) 메트릭스를 수집하지 못하는 등 아직은 반쪽짜리 APM 인 것으로 판단된다. (Elastic 개발자의 답변을 보니 조만간 시스템 데이터도 지원을 할 예정이라고 한다.) 아무튼 당장 실무에 적용하기는 어렵다는 판단이지만, 앞으로 Elastic APM이 발전을 지속적으로 한다면, 내년말쯤에는 실무에 도입을 검토해 볼 수도 있겠다.
끝.