본문 바로가기
IT/elsaticsearch

2021-09-07-APM

by 봉즙 2023. 2. 27.

layout : post
title : "ElasticSearch APM"

category : ElasticSearch

Elasticsearch은 모니터링 시스템으로 APM을 지원한다.

Spring 기반 웹서버에서 편리하게 구성할 수 있게 Elastic APM Agent를 제공.

스프링 기반의 웹서버를 Elasticsearch, Kibana를 이용해서 APM 연결하는 내용이다.

ELK 구성

version: '3.2'
services:
    es01:
        image: docker.elastic.co/elasticsearch/elasticsearch:7.5.1
        container_name: es01
        environment:
            - node.name=es01
            - cluster.name=es-docker-cluster
            - discovery.seed_hosts=es02,es03
            - cluster.initial_master_nodes=es01,es02,es03
            - bootstrap.memory_lock=true
            - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
        ulimits:
            memlock:
                soft: -1
                hard: -1
        volumes:
            - ./volume/data01:/usr/share/elasticsearch/data
        ports:
            - 9200:9200
        networks:
            - elastic

    es02:
        image: docker.elastic.co/elasticsearch/elasticsearch:7.5.1
        container_name: es02
        environment:
            - node.name=es02
            - cluster.name=es-docker-cluster
            - discovery.seed_hosts=es01,es03
            - cluster.initial_master_nodes=es01,es02,es03
            - bootstrap.memory_lock=true
            - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
        ulimits:
            memlock:
                soft: -1
                hard: -1
        volumes:
            - ./volume/data02:/usr/share/elasticsearch/data
        ports:
            - 9201:9201
        networks:
            - elastic

    es03:
        image: docker.elastic.co/elasticsearch/elasticsearch:7.5.1
        container_name: es03
        environment:
            - node.name=es03
            - cluster.name=es-docker-cluster
            - discovery.seed_hosts=es01,es02
            - cluster.initial_master_nodes=es01,es02,es03
            - bootstrap.memory_lock=true
            - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
        ulimits:
            memlock:
                soft: -1
                hard: -1
        volumes:
            - ./volume/data03:/usr/share/elasticsearch/data
        ports:
            - 9202:9202
        networks:
            - elastic

    kib01:
        image: docker.elastic.co/kibana/kibana:7.5.1
        container_name: kib01
        ports:
            - 5601:5601
        environment:
            ELASTICSEARCH_URL: http://es01:9200
            ELASTICSEARCH_HOSTS: http://es01:9200
        networks:
            - elastic

    logstash:
        image: docker.elastic.co/logstash/logstash:7.5.1
        container_name: logstash
        command: logstash -f /usr/share/logstash/pipeline/logstash.conf
        volumes:
            -   type: bind
                source: ./logstash/config/logstash.yml
                target: /usr/share/logstash/config/logstash.yml
                read_only: true
            -   type: bind
                source: ./logstash/pipeline
                target: /usr/share/logstash/pipeline
                read_only: true
        environment:
            LS_JAVA_OPTS: "-Xmx256m -Xms256m"
        ports:
            - 5044:5044
        networks:
            - elastic
        depends_on:
            - es01
            - es02
            - es03
            - kib01

volumes:
    data01:
        driver: local
    data02:
        driver: local
    data03:
        driver: local
    logstash:
        driver: local

networks:
    elastic:
        driver: bridge

es01, es02, es03각 클러스터링 해서 설정했고, 키바나 설정과, 로그스테이시 설정으로 구성, 해당 구성은 Install Elasticsearch with Docker의 기반으로 로그스테이시 설정을 추가했으나 로그스테이시 사용하지 않는다면 해당 부분을 주석해서 사용해도 된다.

$ docker-compose up -d

위 명령어로 도커를 실행

APM 설정

APM Server 설정

https://raw.githubusercontent.com/cheese10yun/blog-sample/master/spring-msa/docs/images/apm-1-1.png

  • APM으로 이동

https://raw.githubusercontent.com/cheese10yun/blog-sample/master/spring-msa/docs/images/apm-1-2.png

  • Setup Instructions 버튼을 클릭

https://raw.githubusercontent.com/cheese10yun/blog-sample/master/spring-msa/docs/images/apm-1-3.png

# 해당 파일 다운
curl -L -O https://artifacts.elastic.co/downloads/apm-server/apm-server-7.5.1-darwin-x86_64.tar.gz

# 압축 해제
tar xzvf apm-server-7.5.1-darwin-x86_64.tar.gz

# apm-server로 이동
cd apm-server-7.5.1-darwin-x86_64/

apm-server.yml 설정 파일을 수정한다

아래 내용은 중간정도 부분에 존재

#-------------------------- Elasticsearch output --------------------------
output.elasticsearch:
  # Array of hosts to connect to.
  # Scheme and port can be left out and will be set to the default (`http` and `9200`).
  # In case you specify and additional path, the scheme is required: `http://localhost:9200/path`.
  # IPv6 addresses should always be defined as: `https://[2001:db8::1]:9200`.
  hosts: ["localhost:9200"] # localhost:9200 으로 hosts 지정

우문투의 경우 apm-server.yml 위치

/etc/apm-server/apm-server.yml

실행중인지 확인 코드

sudo service apm-server status

Agent 설정

https://raw.githubusercontent.com/cheese10yun/blog-sample/master/spring-msa/docs/images/apm-1-4.png

  • Agent 설정도 동일하게 해당 가이드를 참고하여 진행한다
  • Maven Central으로 이동해서 해당 언어에 맞는 Agent를 다운로드
  • Check agent status 버튼을 눌러서 위에서 설정한 APM 서버가 제대로 동작 중인지 확인할 수 있다.
  • 오른쪽 최하단 Launch APM 버튼을 클릭해서 종료한다. 해당 설정으로 다른 무언가를 생성하지 않고 필요한 APM Server, APM Agent를 설정하는 것이 목적이다

Agent 실행

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

모니터링 대상 서버 구동시 해당 Agent를 같이 실행하면 된다

https://raw.githubusercontent.com/cheese10yun/blog-sample/master/spring-msa/docs/images/apm-1-5.png

java -javaagent:/절대 경로/elastic-apm-agent-1.24.0.jar \
    -Delastic.apm.service_name=order-service \
    -Delastic.apm.server_url=http://localhost:8200 \
    -Delastic.apm.application_packages=com.service.order

윈도우

-Duser.language= -Duser.country=KR -Duser.timezone=UTC -javaagent:"C:\workspace\elastic-apm-agent-1.25.0.jar" -Delastic.apm.service_name=test -Delastic.apm.server_url=http://localhost:8200 -Delastic.apm.application_packages=com.test
  • service_name: APM 대상의 서버 이름
  • server_url: 위에서 설정한 APM 서버 주소
  • application_packages: 애플리케이션 패키지 주소
  • secret_token: 설정은 사용하지 않아 제거

키바나 APM

https://raw.githubusercontent.com/cheese10yun/blog-sample/master/spring-msa/docs/images/apm-1-6.png

  • 위에 설정한 APM 서버 확인

Transactions

https://raw.githubusercontent.com/cheese10yun/blog-sample/master/spring-msa/docs/images/apm-1-7.png

  • 해당 애플리케이션 트랜잭션 정보를 출력.

https://raw.githubusercontent.com/cheese10yun/blog-sample/master/spring-msa/docs/images/apm-1-8.png

  • 해당 트랜잭션 내용을 살펴볼 수 있으며, HTTP 요청/응답에 대한 자세한 내용도 표시한다.

https://raw.githubusercontent.com/cheese10yun/blog-sample/master/spring-msa/docs/images/apm-1-9.png

  • 해당 쿼리 문의 상세한 내용도 보여준다

Errors

https://raw.githubusercontent.com/cheese10yun/blog-sample/master/spring-msa/docs/images/apm-1-11.png

  • 해당 서버의 Error를 보여준다.
  • 발생한 Error를 클릭하면 해당 오류의 더 많은 정보를 보여준다.

https://raw.githubusercontent.com/cheese10yun/blog-sample/master/spring-msa/docs/images/apm-1-12.png

  • 오류가 발생한 트랜잭션을 클릭하면 트래잭션 탭으로 이동되며, 해당 이슈의 원인을 파악 할 수 있다.

JVMs

https://raw.githubusercontent.com/cheese10yun/blog-sample/master/spring-msa/docs/images/apm-1-10.png

현재 시스템 리소스에 대한 내용

memory 에러 발생하는 경우

  • Linux

    The vm.max_map_count setting should be set permanently in /etc/sysctl.conf:

    grep vm.max_map_count /etc/sysctl.conf
    vm.max_map_count=262144

    To apply the setting on a live system, run:

    sysctl -w vm.max_map_count=262144
  • macOS with Docker for Mac

    The vm.max_map_count setting must be set within the xhyve virtual machine:

    1. From the command line, run:
    screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty
    2. Press enter and use`sysctl` to configure&nbsp;`vm.max_map_count`:
    sysctl -w vm.max_map_count=262144
    3. To exit the&nbsp;`screen`&nbsp;session, type&nbsp;`Ctrl a d`.
  • Windows and macOS with Docker Desktop

    The vm.max_map_count setting must be set via docker-machine:

    docker-machine ssh
    sudo sysctl -w vm.max_map_count=262144
  • Windows with Docker Desktop WSL 2 backend

    The vm.max_map_count setting must be set in the docker-desktop container:

    wsl -d docker-desktop
    sysctl -w vm.max_map_count=262144

    https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html#docker-cli-run-prod-mode

댓글