본문 바로가기

cloud

[NCP] Naver Cloud Platform 활용기 - (4) pinpoint를 활용한 시스템 모니터링

Naver Cloud Platform 활용기 - (1) server 생성하기
Naver Cloud Platform 활용기 - (2) Cloud DB for MySQL 생성하기
Naver Cloud Platform 활용기 - (3) docker 기반 애플리케이션 배포
Naver Cloud Platform 활용기 - (4) pinpoint를 활용한 시스템 모니터링
Naver Cloud Platform 활용기 - (5) jmeter를 활용한 load test와 pinpoint 모니터링

 

이전 글들에서 server를 생성하고, db도 cloud 기반으로 구성하였다. 이후 docker 기반으로 application을 server에서 실행시키고, 해당 server에 application을 배포하는 pipeline을 github actions로 구성해보았다.

docker image를 NCP에서 제공하는 cloud registry에 등록하여 관리할 수도 있지만, 다른 플랫폼과의 연동을 고려해 docker image는 공식적으로 지원하는 docker-hub에서 관리하였다.

클라우드 환경에서 애플리케이션 서버와 데이터베이스 서버도 구성했고 애플리케이션은 db와 연동도 잘 되었고 애플리케이션도 정상적으로 동작하고 있다.

이제는 해당 애플리케이션 서버 자원을 모니터링 할 수 있는 작업을 해보고자 한다.

시스템 모니터링 툴은 pinpoint cloud를 사용할 예정이다. 

Pinpoint Cloud는 대규모 분산 서비스 및 시스템의 성능을 분석/진단/추적하는 플랫폼 Pinpoint를 클라우드 환경에서 간편하게 사용하도록 돕는 서비스입니다. 간단한 정보 입력만으로 Pinpoint 환경을 구축하여 전체 아키텍처를 보면서 구성 요소 간의 트랜잭션을 손쉽게 파악할 수 있습니다. 병목 현상 및 장애 발생 시 문제 지점을 빠르게 식별해 애플리케이션의 오류 및 예외 정보도 바로 확인할 수 있습니다.

 

pinpoint cloud의 사용 시나리오는 다음과 같다.

ncp pinpoint repository 생성 -> agent 설치 및 설정 -> 웹 콘솔에서 서버 정보 모니터링

pinpoint repository를 생성하여 application에 agent를 등록하면 서버 정보를 pinpoint cloud 서버에 보낼 수 있고, 해당 정보를 웹 콘솔에서 이쁘게 보여주는 형식이다.

 

Repository 생성

repository 생성은 매우 간단하다. 아래 services - Management & Governance에서 'Pinpoint Cloud'로 들어가서 repository 이름과 관리자 ID, PW 정보 등만 입력하면 간단히 생성되고, 웹 콘솔로 접근하여 로그인만 하면 된다. 그러면 아래와 같이 아무것도 없는 웹 콘솔을 볼 수 있다.

 

Pinpoint Agent 설치

Pinpoint가 지원하는 애플리케이션 대상은 다음에서 확인할 수 있다. https://pinpoint-apm.github.io/pinpoint/main.html#supported-modules

이제 모니터링 대상 애플리케이션에 Pinpoint Agent를 설치해보자.

상세한 설치 방법은 다음에서 확인할 수 있다. https://guide.ncloud-docs.com/docs/pinpointcloud-use

pinpoint는 agent 파일을 다운로드 받고, 해당 agent 파일에 의존적인 서버 설정을 해준다. jvm 기반으로 동작하는 애플리케이션이기 때문에 서버 실행 시 jvm 설정을 추가해주도록 하겠다.

 

agent 파일 다운로드

pinpoint 웹 콘솔에 로그인하여 settings의 Installation을 보면 agent 파일을 다운로드 받을 수 있다. 현재 release 버전은 2.2.3으로 보인다. ncp에서 제공하는 파일을 활용하여 agent를 구성하고 싶기 때문에 내 PC에 다운로드 받아서 ssh로 파일을 전송하기로 했다. 이제 우리가 원하는 'pinpoint-bootstrap-2.2.3-NCP-RC1.jar' 파일을 서버에서 볼 수 있다.

# 파일 전송
scp /{path}/agent.tar.gz {your-username}@{your-public-ip}:/{upload-path}

# 압축 해제
tar -xzf agent.tar.gz

 

Pinpoint 설정

pinpoint 웹 콘솔에서 settings - installation에 들어가면 다음과 같다. application 이름과 agent ID를 입력하면 다음과 같이 자동으로 JVM argument를 생성해준다. ${pinpointPath} 에서는 위에서 업로드한 pinpoint-bootstrap jar 파일 경로를 넣어준다.

 

jvm argument는 dockerfile에 설정해도 되는 등 다양하게 설정 가능하지만 가장 손쉽게 docker-compose에 설정해주었다. 여기서 volumes를 설정해주었는데, 이는 docker 컨테이너 내부에서 호스트 머신의 파일 시스템을 직접 접근하지 않도록 설계되어 있기 때문이다. 보통은 docker 이미지 내부에 필요한 파일을 복사하도록 dockerfile을 수정하지만, 우선은 volumes 설정으로 호스트의 폴더를 직접 docker 컨테이너 내부에 마운트하도록 설정했다.

호스트 서버의 경로를 설정할 때 절대경로로 설정을 하였을 때 docker에서 폴더에 접근하지 못하는 문제가 발생해서 상대경로로 설정했다.

version: '3'
services:
  web:
    image: {docker-hub-name}/{docker-hub-repo}:{tag}
    container_name: {your-container-name}
    restart: always
    ports:
      - 8080:8080
    network_mode: host  #docker-container 네트워크가 아닌 host network를 사용하고 싶을 시 사용
    
    # application.yml에 설정해두었다면 굳이 안해도 된다.
    environment:
      - SPRING_DATASOURCE_URL=jdbc:mysql://{cloud-db-public-domain}:3306/{your-database}
      - SPRING_DATASOURCE_USERNAME={your-username}
      - SPRING_DATASOURCE_PASSWORD={your-password}
      - JAVA_TOOL_OPTIONS=-javaagent:/pinpoint/pinpoint-bootstrap.jar -Dpinpoint.applicationName={your-application-name} -Dpinpoint.agentId={your-agent-ID}
    volumes:
      - {your-host-path}/pinpoint-agent-2.2.3-NCP-RC1:/pinpoint

 

license key도 설정해야 하는데, settings의 'Agent License Key' 값을 pinpoint agent 설치 경로의 'pinpoint.license' 파일 안에 넣어준다.

이제 실행하면 pinpoint 웹 콘솔에서 다음과 같이 연동이 된 것을 확인할 수 있다.

 

요청을 몇 개 날려보니 정상적으로 동작한다.

 

Inspector로 들어가면 다음과 같이 여러 서버 자원들을 모니터링 할 수 있다.