소개
특징
각 Service의 Health Check 및 오류 로그 추적, API 응답 속도를 모니터링 하는 화면 예시 (출처 : 올리브영 기술블로그)
소개
특징
Jaeger Architecture
서비스, 기간 및 태그 등으로 추적을 필터링한 UI
소개
특징
Elastic APM 아키텍처
시각화 예시
소개
특징
아쉬운 점
소개
특징
Zipkin Architecture
아쉬운 점
소개
특징
Pinpoint Architecture
UI 예시
Agent가 Collector로 로그를 전송할 때, 9991~9993 포트를 이용하기 때문에, 다른 서버에 존재할 경우 포트를 열어두어야 한다. 또한, HBase 상태를 확인하기 위한 16010 포트와 Web을 위한 8080 포트도 열어두어야 한다.
Pinpoint는 HBase 1.2.X 버전에 최적화되어 있다.
# 설치 후 압축 해제
wget <https://archive.apache.org/dist/hbase/1.2.7/hbase-1.2.7-bin.tar.gz>
tar xzvf hbase-1.2.7-bin.tar.gz
# vi로 아래 내용 주석처리 (실행 시 warning 제거 역할)
vi /home/ubuntu/hbase-1.2.7/conf/hbase-env.sh >>>>>>>
# Configure PermSize. Only needed in JDK7. You can safely remove it for JDK8+
# export HBASE_MASTER_OPTS="$HBASE_MASTER_OPTS -XX:PermSize=128m -XX:MaxPermSize=128m -XX:ReservedCodeCacheSize=256m"
# export HBASE_REGIONSERVER_OPTS="$HBASE_REGIONSERVER_OPTS -XX:PermSize=128m -XX:MaxPermSize=128m -XX:ReservedCodeCacheSize=256m"
<<<<<<<< EOF
# hbase 시작
hbase-1.2.7/bin/start-hbase.sh
Pinpoint 정보를 담을 테이블 생성하기
# 스크립트 다운로드 후 실행
wget <https://raw.githubusercontent.com/pinpoint-apm/pinpoint/master/hbase/scripts/hbase-create.hbase>
hbase-1.2.7/bin/hbase shell hbase-create.hbase
# 설치 후 실행 권한 부여
wget <https://github.com/pinpoint-apm/pinpoint/releases/download/v2.2.2/pinpoint-collector-boot-2.2.2.jar>
chmod +x pinpoint-collector-boot-2.2.2.jar
# 실행
nohup java -jar -Dpinpoint.zookeeper.address=localhost pinpoint-collector-boot-2.2.2.jar >/dev/null 2>&1 &
# 설치 후 실행 권한 부여
wget <https://github.com/pinpoint-apm/pinpoint/releases/download/v2.2.2/pinpoint-web-boot-2.2.2.jar>
chmod +x pinpoint-web-boot-2.2.2.jar
# 실행
nohup java -jar -Dpinpoint.zookeeper.address=localhost pinpoint-web-boot-2.2.2.jar >/dev/null 2>&1 &
# agent 설치
wget <https://github.com/pinpoint-apm/pinpoint/releases/download/v2.2.2/pinpoint-agent-2.2.2.tar.gz>
# 압축 해제
tar xvzf pinpoint-agent-2.2.2.tar.gz
# 이동
cd pinpoint-agent-2.2.2
# config 파일 수정
sudo vi pinpoint-root.config
# 모니터링이 설치된 IP 주소 입력(동일 서버일 경우 127.0.0.1)
profiler.transport.grpc.collector.ip={pinpoint ip}
# 절대경로로 작성해주어야 함
sudo java \
-javaagent:/home/ubuntu/pinpoint-agent-2.2.2/pinpoint-bootstrap-2.2.2.jar \
-Dpinpoint.agentId=helloDongyeop \
-Dpinpoint.applicationName=hello \
-Dpinpoint.config=/home/ubuntu/pinpoint-agent-2.2.2/pinpoint-root.config \
-jar /home/ubuntu/hello.jar &
wget <https://github.com/naver/ngrinder/releases/download/ngrinder-3.5.9-p1-20240613/ngrinder-controller-3.5.9-p1.war>
2. nginder 실행
ngrinder는 현재(2024.08.25)까지 Java 8과 11까지만 지원하고 있다.
따라서, Java 11 환경에서 실행하기 위해 아래와 같이 Docker 환경을 구성
nGrinder-Controller를 위한 Dockerfile
# ngrinder-controller-3.5.9-p1.war 파일이 존재하는 디렉토리에 작성
FROM openjdk:11-slim
ARG WAR_FILE=./*war
COPY ${WAR_FILE} app.war
ENTRYPOINT ["java", "-jar", "/app.war"]
docker-compose.yml
version: "3.8"
services:
ngrinder-controller:
container_name: ngrinder-controller-arm
build:
context: ./ngrinder-controller
dockerfile: Dockerfile
restart: always
ports:
- "8080:8080"
- "12000-12100:12000-12100"
- "16001:16001"
3. 실행 결과 확인
{서버주소:8080} 접속시, 초기 계정 : admin/admin
4. Agent 설치
5. Agent 압축 해지 및 실행
압축 해지
tar -xvf ngrinder-agent-3.5.9-p1-localhost.tar
nGrinder-agent를 위한 Dockerfile
controller와 마찬가지로 agent 또한 Java 8/11 만 지원하기에 Docker 환경 구성
# run_agent.sh 이 존재하는 디렉토리에 작성
FROM openjdk:11-slim
COPY / /home/
CMD /home/run_agent.sh -ch ngrinder-controller-arm
docker-compose.yml 수정
version: "3.8"
services:
ngrinder-controller:
container_name: ngrinder-controller-arm
build:
context: ./ngrinder-controller
dockerfile: Dockerfile
restart: always
ports:
- "8080:8080" # nGrinder UI 포트
- "12000-12100:12000-12100" # nGrinder Agents 포트(에이전트 개수만큼 12000+@)
- "16001:16001" # nGrinder Controller 포트
networks:
- ngrinder
ngrinder-agent:
container_name: ngrinder-agent-arm
depends_on:
- ngrinder-controller
build:
context: ./ngrinder-agent
dockerfile: Dockerfile
restart: always
networks:
- ngrinder
networks:
ngrinder:
driver: bridge
실행 결과 확인
6. 테스트 스크립트 작성
7. 테스트 스크립트 실행 결과 확인
8. 성능 테스트 (Performance Test) 작성
9. 성능테스트 실행 결과 조회
ngrinder
를 활용하고, 운영 환경에서는 설치 및 성능테스트틀 하기 힘든 환경이라 AB
를 활용해서 테스트를 하는 경우도 있다.HTTP 1.0
클라이언트를 사용한다.Transfer-Encoding: chunked
옵션은 사용할 수 없다.Content-Length
헤더 내용을 미리 작성할 수 없기 때문에 -k KeepAlive
옵션이 동작하지 않는다.request
간에 delay를 주는 옵션은 없으므로 DDOS attack
으로 간주 될 수 있다.옵션 | 설명 |
---|---|
-n | 성능을 검사하기위해 보내는 요청수. |
-c | 동시에 요청하는 요청수. 기본적으로 한번에 한 요청만을 보낸다. |
-H | 요청에 헤더 추가 |
-p | 바디와 함께 POST 요청 |
-u | 바디와 함께 PUT 요청 |
-T | Content-Type 지정 |
-g | 측정한 모든 값을 'gnuplot' 혹은 TSV (Tab separate values, 탭으로 구분한 값) 파일에 기록한다. 라벨은 output 파일의 첫번째 라인을 참고한다. |
-t | 성능을 검사하는 최대 초단위 시간. 내부적으로 -n 50000을 가정한다. 정해진 시간동안 서버 성능을 검사할때 사용한다. 기본적으로 시간제한 없이 검사한다. |
-v | 출력 수준을 지정한다.4 이상이면 헤더에 대한 정보를,3 이상이면 (404, 202, 등) 응답코드를,2 이상이면 경고(warning)와 정보(info)를 출력한다. |
-A | 프록시를 통해 BASIC Authentication 정보를 제공한다.:로 구분한 사용자명과 암호를 base64 인코딩하여 전송한다. |
-X | proxy[:port] 프록시 서버를 사용하여 요청한다. |
Apache2-Utils 설치
$ sudo apt-get install apache2-utils
google.com/index.html 파일에 10개의 동시 요청으로 총 100개의 요청을 벤치마킹한 예시
위 요청에서 실패율이 높은 이유
Gnuplot 이란?
AB
는 간략하게 결과는 바로 확인해 볼 수 있으나 디테일한 각 요청에 대한 로그 값을 원하는 경우, -g [data_file]
옵션을 사용해 gnuplot 형식으로 데이터를 남길 수 있다.Gnuplot 설치
$ sudo apt install -y gnuplot
요청별 응답 시간을 그래프로 그려주는 쉘 스크립트 작성(
script.plot
)
# 터미널 사이즈 조정(이미지 사이즈)
set terminal png size 1024,768
# 가로, 세로 비율
set size 1,0.5
# 결과 파일 설정
set output "result.png"
# 범례/key 위치
set key left top
# y축 grid line
set grid y
# Label the x-axis
set xlabel 'requests'
# Label the y-axis
set ylabel "response time (ms)"
# Tell gnuplot to use tabs as the delimiter instead of spaces (default)
set datafile separator '\\t'
# Plot the data
plot "result.plot" every ::2 using 5 title 'response time' with lines
exit
시각화 결과
$ gnuplot script.plot
Pinpoint를 이용해 APM을 구축해보았고, nGrinder와 Apache Bench(AB)를 이용해 성능 테스트를 진행해보았다.
Pinpoint와 nGrinder는 Java 8/11 에서만 동작한다는 점이 아쉬웠고, AB의 경우는 정적 웹 서버를 테스트하기에 적합하다는 점에서 API 성능을 테스트하기에는 부적절했다.
분산 환경에서의 요청을 추적하고 모니터링하기에는 Pinpoint는 Java 8 환경을 도커로 구축한다면 괜찮은 것 같지만, 성능 테스트의 경우는 Apache Jmeter가 nGrinder와 Apache Bench보다 개인적으로는 더 좋아보인다.