배포/모니터링, 과부하 툴

ngrinder, pinpoint 대신 elastic APM 설치 - Docker

nsean 2024. 4. 7. 22:40

Docker 설치를 고려하게 된 이유:

pintpoint와 ngrinder의 경우 자바 버전을 임의로 설정하고 실행해야 하는 번거로움이 있다. 이 과정에서 불편함을 느꼈고, docker를 사용하여 편리하게 구성할 수 있다고 듣게 되어 알아보게 되었다.

 

도커를 사용하면 특정 소프트웨어나 툴을 환경에 맞게 쉽게 설정할 수 있다. 예를 들어 ngrinder를 설치할 때는 자바 11이 필요하지만 도커를 통해 실행하면 자바 버전을 신경 쓸 필요가 없다.

 

도커 컴포즈 설치

윈도우에서는 도커 툴박스나 Docker for windows 설치하면 도커 엔진과 함께 자동으로 설치된다.

 

Ngrinder 설치

https://hub.docker.com/r/ngrinder/controller/

를 보고 따라해도 좋지만, 다음과 같이 application.yml을 설정하여 폴더에서 docker-compose up을 해주면 설치까지 자동으로 해주게 된다.

version: '3.8'
services:
  controller:
    image: ngrinder/controller
    restart: always
    ports:
      - "{원하는 포트번호}:80"
      - "16001:16001"
      - "12000-12009:12000-12009"
    volumes:
      - ./ngrinder-controller:/opt/ngrinder-controller
    networks:
      - ngrinder-network
  agent:
    image: ngrinder/agent
    restart: always
    depends_on:
      - controller
    networks:
      - ngrinder-network
    environment:
      - CONTROLLER_IP=controller:80
    extra_hosts:
      - "host.docker.internal:host-gateway"
networks:
  ngrinder-network:
    driver: bridge

 

Pinpoint 설치 시도 -> Elastic APM으로 전환

agent까지 설치를 완료했지만, 추가기능에서 충돌하는 포트가 너무 많아 보류 3306, 8080, 9000 등 다양한 포트가 중복되어 docker-compose를 일일이 설정해 주는 것이 어려웠었다. (애초에 docker를 사용한 목적이 큰 설정 변경 없이 모니터링 툴과 테스트 툴을 설치하여 사용하는 것이었음으로)

kafka, redis 등 다양한 기능까지 설치하여 사용하는 만큼 추후에 시간을 잡고 사용하는 게 좋아 보였다. 일단 elastic APM의 러닝커브가 짧아 보이고 전반적인 접근성이 pinpoint보다 친절하다 느껴져 elastic APM으로 접근하게 되었다.

 

docker-elk github를 따라 docker에 pull해주었다.

 

docker-compose가 완료되고, localhost:5601에 접근하여 apm server를 설치해 주었는데, apm server의 경우 window 11의 문제인지 다른 문제인건진 알 수 없지만, docker의 5601에 접근이 금지되어 mac os, linux의 방식으로 콘솔창에서 설치를 해주었다. (관리자 권한) powershell로

Invoke-WebRequest -Uri https://artifacts.elastic.co/downloads/apm-server/apm-server-8.13.0-windows-x86_64.zip -OutFile apm-server-8.13.0-windows-x86_64.zip

Expand-Archive -Path .\apm-server-8.13.0-windows-x86_64.zip -DestinationPath .\apm-server-8.13.0-windows-x86_64\

.\apm-server.exe -e

이 순으로 입력하여 실행시켜 주었다.

 

이후 agent를 build 한 프로젝트의 jar 파일에 attach 하여

java -javaagent:/path/to/elastic-apm-agent-<version>.jar \
-Delastic.apm.service_name=my-service-name \
-Delastic.apm.secret_token= \
-Delastic.apm.server_url=http://localhost:8200 \
-Delastic.apm.environment=my-environment \
-Delastic.apm.application_packages=org.example \
-jar my-service-name.jar

\는 제거하고 한 줄로 이어서 사용.

 

위와 같이 사용해 주면 된다. 그러면 ngrinder, elastic apm을 docker에 등록한 채로 localhost 환경에서 테스트가 가능하다.

jmeter는 docker에서 사용하는 것보다, 윈도우에서 그대로 사용하는 것이 편의성이 좋아 보여 생략하기로 하였다.

 

로컬 환경에 JMETER, 서비스, 도커 환경에 ngrinder, elastic apm을 구성하게 되었다. 이번에 도커를 사용하면서 느끼게 된 점은 서비스들의 설치까진 매우 쉽다.(git에서 clone 후 docker-compose up). 하지만 설치가 간단한 만큼 각 컨테이너 간의 포트 번호 설정을 신경 써줘야 하고, 각각의 컨테이너들을 연결해주어야 할지 말아야 할지 생각해 줘야 해야 했다.

 

특히 PinPoint, Elastic APM의 경우, 에이전트를 사용하여 모니터링하기 위해 각 서비스에 에이전트를 연결해야 했다. 에이전트 개념을 받아들이는 데 시간이 오래 걸렸다는 점이 아쉬웠다. 실제로는 빌드된 jar 파일을 에이전트와 함께 실행하면 되는 간단한 방법이었다.

 

이제 해야 되는 건 docker 환경에 서비스, agent, elastic-apm, jmeter를 docker에 각각 container로 올리고, 서비스를 테스트해 주는 것이다. elastic-apm에서 확장기능을 사용할 때 kafka를 통해서 데이터를 손실 없이 전달해 준다는데 알아보면 좋을 것 같다.