Docker로 움직이는 Tomcat과 Elastic의 APM을 연결하여 성능을 시각화

개요



2018년 7월 9일에 Elastic APM Java Agent Beta Released 로서 Elastic APM에 연결하는 Java 에이전트(베타)가 공개되었습니다.



각종 로그나 메트릭스를 Elasticsearch에 넣고 있는 경우, APM의 데이터도 아울러 넣어 두는 것으로, 조사나 문제 발생시의 해결 속도 향상에 기여할 것을 기대할 수 있을 것 같습니다.

위의 기사에서는 Spring의 예이지만 Docker에서 움직이는 Tomcat이라면 더 쉽게 시도 할 수 있습니다.

이번에는 그것을 소개하는 내용입니다. 시도한 환경은 다음과 같습니다.


제품
버전


Elasticsearch
6.3.1(Docker)

키바나
6.3.1(Docker)

APM 서버
6.3.1(Docker)

Tomcat
8계 최신(Docker)

JavaAgent
0.6.0


Tomcat에서 설정



필요한 자재 입수



필요한 것은 javaagent jar 파일입니다.

Maven Central 에서 jar 파일을 가져옵니다.
2018/07/11 시점에서 버전은 0.6.0이었습니다.

javaagent 설정



위의 베타 릴리즈 블로그에서는 Spring에서 설정 예제로 이렇게 작성되었습니다.

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

이것을 Docker의 tomcat으로 움직이는 경우의 설정이라면 이런 느낌이 듭니다.
docker-compose의 yaml 예제입니다.
version: '2'
services:
  tomcat:
    image: tomcat:8
    container_name: tomcat
    ports:
      - 8080:8080
    links:
      - apm:apm
    networks:
      - esnet
    volumes:
      - ./elastic-apm-agent-0.6.0.jar:/tmp/elastic-apm-agent-0.6.0.jar
    # ここでElastic APMで必要な設定を渡している。
    environment:
      - "JAVA_OPTS=-javaagent:/tmp/elastic-apm-agent-0.6.0.jar -Delastic.apm.server_url=http://apm:8200 -Delastic.apm.service_name=hogehoge -
Delastic.apm.application_packages=jp.co.fuga.piyo"

networks:
  esnet:

(손잡이) 포인트는 컨테이너 개시시에 건네주는 환경 변수(JAVA_OPTS)에 javaagent, apm 의 설정을 포함해 두는 것입니다.
이렇게하면 시작할 때 실행되는 catalina.sh start에서 JAVA_OPTS의 값이 Tomcat의 VM 인수로 사용됩니다.

기존 이미지를 다시 빌드하지 않고 APM의 대상으로 할 수 있다는 것은 매우 간편하게 느끼는 곳입니다.

javaagent를 지정할 수 있고 apm 서버의 위치를 ​​올바르게 나타내면 Tomcat 측의 작업은 끝입니다.
그리고 Tomcat의 앱을 움직여 DB 액세스 나름을 발생시켜 APM 화면에서 확인합시다.

만약, tomcat를 베이스 이미지로 한 독자적인 이미지이었다고 해도, catalina.sh를 사용해 기동하는 부분을 바꾸지 않았다면, 같은 어프로치로 움직일 것입니다.

확인



무사히 APM 서버에 JavaAgent에서 데이터가 날고 있다면 Kibana의 화면에서 확인할 수 있습니다.





기타



APM 서버 자체도 Docker 이미지가 배포되어 있기 때문에, 이것을 이용하는 것으로, 보다 간단하게 동작을 확인할 수 있습니다.

검증용으로 ES로부터 Kibana, Tomcat, APM까지 정리해 기동하고 있던 docker-compose.yml의 일부입니다.

version: '2'
services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:6.3.1
    container_name: elasticsearch
    environment:
      - cluster.name=docker-cluster
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - esdata630:/usr/share/elasticsearch/data
    ports:
      - 9200:9200
    networks:
      - esnet

  kibana:
    image: docker.elastic.co/kibana/kibana:6.3.1
    container_name: kibana
    ports:
      - 5601:5601
    depends_on:
      - elasticsearch
    links:
      - elasticsearch:elasticsearch
    networks:
      - esnet

  apm:
    image: docker.elastic.co/apm/apm-server:6.3.1
    container_name: apm
    ports:
      - 8200:8200
    environment:
      - output.elasticsearch.hosts=elasticsearch:9200
    depends_on:
      - elasticsearch
    links:
      - elasticsearch:elasticsearch
    networks:
      - esnet

  tomcat:
    image: tomcat:8
    # 本当は自分のアプリが入ったDockerイメージを指定
    container_name: tomcat
    ports:
      - 80:8080
    links:
      - apm:apm
    networks:
      - esnet
    volumes:
      - ./elastic-apm-agent-0.6.0.jar:/tmp/elastic-apm-agent-0.6.0.jar
    environment:
      - "JAVA_OPTS=-javaagent:/tmp/elastic-apm-agent-0.6.0.jar -Delastic.apm.server_url=http://apm:8200 -Delastic.apm.service_name=rooms -Delastic.apm.application_packages=jp.co"

volumes:
  esdata630:
    driver: local

networks:
  esnet:


요약



공식의 기술에서는, 「Minimal Overhead」라고 하고, 오버헤드도, 평균적으로 1 마이크로초 이하라고 한다.

외부의 서비스를 사용하고 있으면, 「데이터의 보관 기간이~」라고 하는 일도 있을까 생각합니다만,
다른 Elasticsearch 인덱스와 마찬가지로 스스로 결정할 수 있다는 것이 좋은 곳이라고 생각합니다.
이미 Elasticsearch를 넣어 더 편리하게 사용하고 싶다! 이용 용도를 늘려 가고 싶다! 같은 사람에게 적합합니다.

APM의 데이터와 다른 로그나 각종 메트릭스와 조합해, 「Elasticsearch에 넣고 있었기 때문에, 문제 해결이 빨랐다!」라고 하는 유스 케이스가 향후 나올 것으로 기대하고 있습니다.


htps : // ぢs 쿳 s. 에스 c. 코 / t / 네 xt - pm - 겐 t / 99900

여기에서 다음 Agent 후보에 투표할 수 있습니다. .NET에 한 표 넣었습니다!

좋은 웹페이지 즐겨찾기