최근 노트북을 새로 바꾸면서 다시 Elastic APM을 구성하였는데,
블로그로 정리해두면 좋을것 같아 Elastic APM 도큐먼트를 다시 살펴보게 되었습니다.
Elastic APM은 애플리케이션 성능 모니터링 시스템입니다.
요청에 대한 응답 시간, DB 쿼리, 외부 HTTP 요청 등의 정보를 실시간으로 모니터링할 수 있습니다.
진행중인 프로젝트에서는 JPA를 사용하고있는데, JPA는 쿼리를 대신 만들어주기 때문에 의도치않은 쿼리가 나갈 수 있습니다.
따라서 Elastic APM을 구성하여 쿼리 및 시간을 확인하는 것을 목표로 하였습니다.
Elastic APM은 APM agents, Elastic APM integration, Elasticsearch, Kibana 4개의 구성요소로 이루어져있습니다.
APM agent는 애플리케이션 런타임에 발생하는 데이터 및 에러를 모아 APM Server(Elastic APM integration)로 데이터를 전달합니다.
APM integration은 APM agent로부터 데이터를 받아 검증 및 처리 후 Elasticsearch documents 형식으로 데이터를 변환합니다.
Elasticsearch를 통해 대용량 데이터를 신속하게 저장, 검색, 분석할 수 있습니다.
Elasticsearch는 APM 성능 메트릭을 저장하고 해당 집계를 사용하는 데 사용됩니다.
Kibana 는 저장된 데이터를 검색하고 볼 수 있는 시각화 플랫폼입니다.
docker-compose.yml
파일에 Elasticsearch, Kibana 설정을 추가하고 docker-compose 명령을 사용하여 도커를 실행시켜줍니다.
version: '2'
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:7.15.0
container_name: elasticsearch
environment:
- node.name=elasticsearch
- cluster.name=es-docker-cluster
- discovery.seed_hosts=elasticsearch
- cluster.initial_master_nodes=elasticsearch
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
volumes:
- ./volume/elasticsearch-volume:/usr/share/elasticsearch/data
ports:
- 9200:9200
networks:
- elastic
kibana:
image: docker.elastic.co/kibana/kibana:7.15.0
container_name: kibana
ports:
- 5601:5601
environment:
ELASTICSEARCH_URL: http://elasticsearch:9200
ELASTICSEARCH_HOSTS: http://elasticsearch:9200
networks:
- elastic
apm:
image: docker.elastic.co/apm/apm-server:7.15.0
ports:
- 8200:8200
volumes:
- ./volume/apm-server:/usr/share/apm-server/data"
environment:
output.elasticsearch.hosts: '["elasticsearch:9200"]'
mysql:
image: mysql:5.7
platform: linux/x86_64
volumes:
- ./volume/jagoga-mysql-volume:/var/lib/mysql
restart: always
container_name: mysql_db
environment:
MYSQL_ROOT_PASSWORD:
MYSQL_DATABASE: jagoga_db
MYSQL_USER: admin
MYSQL_PASSWORD:
ports:
- "3307:3306"
volumes:
elasticsearch-volume:
driver: local
jagoga-mysql-volume:
driver: local
networks:
elastic:
driver: bridge
도커를 실행하고 localhost, kibana의 port 5601로 접속하면 아래와 같은 화면을 보실 수 있습니다.
Add Data 버튼을 눌러줍니다.
APM 버튼을 눌러줍니다.
페이지를 이동하면 각 OS별 APM Server를 설치할 수 있는 방법이 안내되어 있습니다.
(1) Download and unpack APM Server
아래 명령어를 입력하여
tar 파일을 다운받아 압축을 풀어주고 해당 디렉터리로 이동합니다.
curl -L -O https://artifacts.elastic.co/downloads/apm-server/apm-server-7.15.0-darwin-x86_64.tar.gz
tar xzvf apm-server-7.15.0-darwin-x86_64.tar.gz
cd apm-server-7.15.0-darwin-x86_64/
(2) Edit the configuration
필요시 apm-server.yml
config file을 수정해주세요.
######################### APM Server Configuration #########################
################################ APM Server ################################
apm-server:
# Defines the host and port the server is listening on. Use "unix:/path/to.sock" to listen on a unix domain socket.
host: "localhost:9200" # localhost:9200으로 host 지정
(3) Start APM Server
아래 명령어를 통해 APM Server를 실행해줍니다
APM Server는 애플리케이션 성능 메트릭스를 처리하고 Elasticsearch에 저장합니다.
./apm-server -e
APM Server 상태를 확인해볼 수 있습니다.
정상적으로 서버가 실행되고 있다면 위와 같은 안내 메시지를 확인할 수 있습니다.
(1) Download the APM agent
언어별로 APM Agent 라이브러리를 제공하고 있습니다.
애플리케이션에서 사용하는 언어에 맞춰 jar 파일을 다운로드합니다.
(2) Start your application with the javaagent flag
IDE 설정을 통해 애플리케이션을 실행할 때 APM Agent도 함께 실행할 수 있도록 셋팅하겠습니다.
Intellij 상단 Run → Edit Configurations 메뉴를 클릭한 뒤, VM options 에 javaagent flag를 셋팅해줍니다.
Agent jar 파일 경로명은 바꿔주셔야 합니다.
-javaagent:/Users/baesuyeon/IdeaProjects/jagoga/src/elastic-apm-agent-1.28.4.jar -Delastic.apm.service_name=jagoga -Delastic.apm.server_url=http://localhost:9200 -Delastic.apm.application_packages=com.project.jagoga -Delastic.apm.transaction_sample_rate=1
구성이 모두 완료되었다면 서비스 목록에 본인의 프로젝트가 추가된 것을 확인할 수 있습니다.
위와 같이 요청에 대한 응답 시간, DB 쿼리, 외부 HTTP 요청 등의 정보를 실시간으로 모니터링할 수 있게되었습니다.
https://www.elastic.co/guide/en/apm/guide/current/index.html
우와.....