APM
APM에 대하여
- APM은 Application Performance Management 라고 한다. 어플리케이션의 성능을 관리하고 통제하는 모니터링 도구라고 할 수 있다.
- 서비스를 운영함에 있어서 APM의 활용은 많은 이점을 주기 때문에 선택이 아닌 필수라고 생각한다.
- 서비스에 문제가 발생하거나 비효율적으로 운영이 되고 있을 때 서버로그를 찾아가며 문제점을 찾기에는 많은 비용이 들어간다.
APM 주요기능
- 어플리케이션 처리량, 응답 시간, 오류율 등과 같은 성능 지표를 수집하여, 이러한 지표를 통해 어플리케이션의 전반적인 성능을 파악 할 수 있다.
- 사용자 요청이 어플리케이션 내부에서 어떻게 처리 되는 지를 추적하고, 서비스 간의 호출 관계를 파악 할 수 있다. 이를 통해 성능 저하의 원인을 찾아낼 수 있다.
- 어플리케이션에서 발생하는 오류 및 예외를 기록하고 분석하여, 개발자가 문제를 해결할 수 있도록 도와준다.
- 성능 이슈, 오류 발생, 리소스 사용량 초과 등에 대한 알림 및 경고를 제공하여, 문제를 신속하게 대응 할 수 있다.
- 기록에 근거해 현재 서비스에서 수용 가능한 트래픽을 예상해 볼 수 있다.
APM Tool 선정
APM의 종류는 다양하다. APM 종류를 선정하기 위해서 아래와 같이 기준을 두었다.
- 오픈소스이어야 한다.
- 친절한 가이드 문서가 많았으면 한다.
- APM을 입맛대로 기능을 확장할 수 있는 Plugin이 다양했으면 좋겠다.
- Java Application을 중심적으로 관찰 할 수 있어야 한다.
위 기준을 포함하는 APM 선택지는 아래와 같다.
- Scouter (LG CNS)
- Pinpoint (Naver)
두 가지 선택지 중에 Scouter를 선택하였다. 그 이유는
- Scouter를 사용해본 경험이 있으며, Scouter로 인해 빠른 이슈 대응을 했었던 경험이 있다.
- Pinpoint보다 전반적으로 가볍다.
- HTTP 요청 트랜잭션 추적 할 때 필터 기능이 다양하다.
- Pinpoint보다 구축하기가 편리하며 쉽다.
- Pinpoint보다 운영 비용이 더 적다.
하지만 분명 Scouter는 Pinpoint보다 단점이 존재한다.
- Pinpoint는 Scouter보다 UI가 유저 친화적이다.
- Pinpoint는 Scouter보다 더 많은 Plugin을 제공한다.
- 대규모 분산 시스템의 지원은 Pinpoint가 더 우세하다.
Scouter를 선정하였지만, 기회가 있다면 Pinpoint도 직접 구축하여 좀 더 자세히 비교해 볼 예정이다.
Scouter 소개
Scouter란
- 스카우터는 Java 기반 어플리케이션을 위한 오픈소스 APM Tool로서, 한국 개발자들이 주축으로 개발되는 오픈소스이다. ( https://github.com/scouter-project/scouter )
- 덕분에 참고할 만한 한국어 자료가 많아 좀 더 이해하기 쉽다.
- JVM을 사용하는 어플리케이션 및 OS 자원에 대한 모니터링 기능을 제공한다.
- 스카우터 Alert을 외부에서 알림 받을 수 있으므로 장애 상황에 빠르게 대응 할 수 있다.
Scouter 구성
Agent
HostAgent와 JavaAgent로 나뉜다.
- HostAgent : 단독으로 실행되며 서버 OS 혹은 DB 등에서 자료를 모아 수집기(Collector)에 전달한다.
- JavaAgent : Java 어플리케이션에 포함된 채로 기동이 된다. JVM 수준에서 확인 할 수 있는 지표들을 수집기(Collector)로 보낸다.
Collector
에이전트에서 받은 지표들을 모아서 수집한다. 대부분의 지표는 UDP를 이용하여 전송되기 때문에 부담이 적은 편이다.
클라이언트에서 특정 지표 데이터를 요청하면 수집한 데이터를 내려준다.
Disk 사용률에 따른 로그 보관을 설정 할 수 있다.
Client
수집기를 통해 지표들을 받아서 모니터링 할 수 있는 그래프 및 UI를 표현 해준다.
특정 조건을 걸어서 Alert을 받을 수 있다.
Eclipse 기반의 UI로 구성된 클라이언트가 있으며, 웹 기반의 UI로 구성된 Scouter Paper가 있다.
- 기존 Eclipse 기반의 Scouter Client가 플랫폼의 특성으로 인한 접근성의 한계가 존재한다.
- 이를 보완하는 보조 도구의 역할로 사용될 수 있도록 하기 위해 다양한 디바이스에서 접근 가능한 형태의 React로 개발 된 웹 클라이언트이다.
Scouter 구축
개발 환경
- WSL (Ubuntu 20.04)
- Docker 23.0.2
- OpenJDK 8
- Tomcat 9.0
WSL 우분투 설치 및 Docker 설치
윈도우 cmd 혹은 Window Powershell
wsl --install -d ubuntu
설치 된 우분투에서 도커 설치
# 도커 설치를 위한 필요한 패키지 설치
$ apt-get update
$ apt-get install ca-certicicates curl gnupg lsb-release
$ apt-get install vim
$ apt-get install git
# 도커 공식 gpg키 추가
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
# 공식 저장소 추가
$ add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"
# 도커 설치
$ apt-get update
$ apt-get install docker-ce docker-ce-cli containerd.io
# 도커 실행
$ systemctl start docker.service
# 도커 실행 확인
$ systemctl status docker
# docker-compose 설치
$ apt install docker-compose
$ docker-compose -v
# docker network 생성 "scouter-server_sample-network" 이름으로 생성
# Scouter Agent, Server가 서로 통신을 위해서 네트워크 설정이 필요하다
$ docker network create -d bridge sample scouter-server_sample-network
모니터링 대상인 자바 어플리케이션, Scouter Agent를 포함하는 컨테이너 실행
Dockerfile 생성
# 도커파일 이름은 대소문자 구분하여 "Dockerfile" 이어야 한다
$ vim Dockerfile
Dockerfile 설정
# Tomcat 9와 JDK 8 기반 이미지 사용
FROM tomcat:9.0-jdk8
LABEL maintainer="pepeykb@email.com"
# Tomcat 서버 설정
ENV CATALINA_HOME /usr/local/tomcat
ENV PATH $CATALINA_HOME/bin:$PATH
# Scouter Agent 다운로드 및 설정
RUN mkdir /opt/scouter
ENV SCOUTER_HOME /opt/scouter
RUN mkdir -p $SCOUTER_HOME/agent
RUN apt-get update
RUN apt-get install -y curl
RUN curl -L -o $SCOUTER_HOME/agent.tar.gz https://github.com/scouter-project/scouter/releases/download/v2.17.1/scouter-all-2.17.1.tar.gz
RUN tar -xvf $SCOUTER_HOME/agent.tar.gz -C $SCOUTER_HOME/agent --strip-components 1
RUN rm $SCOUTER_HOME/agent.tar.gz
#RUN echo "net_collector_ip=scouter-collector" >> $SCOUTER_HOME/agent/conf/scouter.conf
#RUN echo "net_collector_port=6100" >> $SCOUTER_HOME/agent/conf/scouter.conf
#RUN echo "obj_name=tomcat_instance" >> $SCOUTER_HOME/agent/conf/scouter.conf
# Scouter agent를 Tomcat에 연결
ENV JAVA_OPTS="-javaagent:$SCOUTER_HOME/agent/agent.java/scouter.agent.jar"
ENV JAVA_OPTS="${JAVA_OPTS} -Dscouter.config=${SCOUTER_HOME}/agent/agent.java/conf/scouter.conf"
EXPOSE 8080
CMD ["catalina.sh", "run"]
Dockerfile 빌드 및 실행
# 도커파일이 존재하는 경로에서 도커파일 빌드
$ docker build -t sample-api .
# 생성된 이미지 실행
# "scouter-server_sample-network" 이름으로 도커 네트워크 설정(Scouter Server와 통신)
$ docker run -d --name="sample-api-1" -p 7070:8080 --network scouter-server_sample-network sample-api
# 실행 확인
$ docker ps
# 모니터링 할 서비스 war 배포
$ docker cp sample-api.war sample-api-1:/usr/local/tomcat/webapps/
Scouter Agent Config 설정
- 도커파일에서 스카우터 에이전트 컨피그 설정을 하려고 했으나, 도커 실행 과정에서 에러가 지속적으로 발생하여 해결을 못 하고 수동으로 컨피그 설정 하였다.
# sample-api-1 컨테이너 접속
$ docker exec -it sample-api-1 /bin/bash
# 컨테이너 접속 이후 Agent Config 설정
$ vim /opt/scouter/agent/agent.java/conf/scouter.conf
# Scouter Agent Config 설정
# 해당 어플리케이션 이름
obj_name=sample-api-1
# Scouter Server IP
net_collector_ip=172.22.0.2
# Scouter Server Port
net_collector_udp_port=6100
net_collector_tcp_port=6100
#hook_method_patterns=sample.mybiz.*Biz.*,sample.service.*Service.*
#trace_http_client_ip_header_key=X-Forwarded-For
profile_spring_controller_method_parameter_enabled=true
#hook_exception_class_patterns=my.exception.TypedException
profile_fullstack_hooked_exception_enabled=true
#hook_exception_handler_method_patterns=my.AbstractAPIController.fallbackHandler,my.ApiExceptionLoggingFilter.handleNotFoundErrorResponse
#hook_exception_hanlder_exclude_class_patterns=exception.BizException
Scouter Server, Client(Scouter Paper) 설치
스카우터 서버, 클라이언트는 스카우터 개발자들이 도커 이미지를 지원해주고 있다.
# 스카우터 서버, 클라이언트 도커 이미지
$ git clone https://github.com/scouter-contrib/scouter-docker-image.git
# 서버 컨테이너 실행
$ cd /scouter-dcoker-images/scouter-server
$ docker-compose up -d
# 클라이언트 컨테이너 실행
$ cd /scouter-dcoker-images/scouter-paper
$ docker-compose up -d
상황에 따라서 docker-compose 파일이나 Dockerfile을 수정 및 설정 해주면 된다.
구축한 컨테이너
- 모니터링 대상 서비스, Scouter Agent 3개
- Scouter Client 1개
- Scouter Server 1개
Scouter Client
Scouter Paper(웹 기반 UI)
- 따로 설정하지 않았다면 접속 url은 localhost:8080 으로 접속 할 수 있다.
이클립스 기반의 Scouter Client
- 아래 링크에서 이클립스 기반의 클라이언트를 다운받아 설치 할 수 있다. 윈도우에 편한 경로에 설치하여 실행파일을 실행하면 된다.
- 설치 과정에서 특별한 설정을 하지 않았다면 ID: admin / PW : admin으로 로그인하여 모니터링이 가능하다.
- Scouter Client 설치 https://github.com/scouter-project/scouter/releases
Scouter 지표 및 기능 활용, Alert 설정 및 Plugin 활용
다음 포스팅 참조
https://developercc.tistory.com/31
마치며
도커를 이용하여 스카우터를 심플하게 구축해 보았다. 구축 과정이 크게 어려운 건 없었던 듯 하다.
'Open Source' 카테고리의 다른 글
자바 어플리케이션 성능 테스트 사전 조사 및 테스트 계획 (0) | 2023.05.31 |
---|---|
APM(Scouter) Alert 설정 및 지표, 기능, Plugin 활용 (0) | 2023.04.10 |
Redis 간단 소개 및 자료구조 (0) | 2022.09.23 |