使用Docker来连接Tomcat和Elastic的APM,以可视化性能

综述

2018年7月9日,Elastic APM Java Agent Beta版本发布,这是一个连接到 Elastic APM 的 Java 代理(Beta 版)。

3.png

如果将各种日志和指标存入Elasticsearch中,还可以将APM数据一并存入,这样有望提高调查和问题解决的速度。

在上述文章中,提到了Spring的例子,但是如果在Docker上运行Tomcat,可以更简单地尝试。

這次將介紹的內容是關於這個。試驗的環境如下所示。

productversionElasticsearch6.3.1(Docker)Kibana6.3.1(Docker)APM Server6.3.1(Docker)Tomcat8系の最新(Docker)JavaAgent0.6.0

在Tomcat中的配置

获取所需的材料

需要的是javaagent的jar文件。

让我们从Maven Central获取jar文件。
截至2018年07月11日,版本号为0.6.0。

在Java代理设置中

在上述的β发布博客中,它是作为在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:

在容器启动时,将包含javaagent和apm配置的环境变量(JAVA_OPTS)传递进去是一个省事的方法。这样,在启动时执行的catalina.sh start命令会将JAVA_OPTS的值作为Tomcat的虚拟机参数使用。

不需要重新构建现有形象,将其视为APM的对象,这让人感觉非常方便。

只要能指定javaagent并正确指示APM服务器的位置,Tomcat的工作就完成了。然后我们运行Tomcat上的应用程序,产生数据库访问等操作,并在APM界面上进行确认。

如果您以Tomcat为基础镜像创建了自己的镜像,但没有改变使用catalina.sh启动的部分,那么它将以相同的方式运行。

确认

只要JavaAgent从APM服务器顺利传输数据,您就可以通过Kibana界面进行确认。

1.png
2.png

其他

由于APM服务器本身也提供了Docker镜像,因此可以通过使用它来更轻松地验证其运行。

这是docker-compose.yml文件的一部分,用于验证时一起启动了ES、Kibana、Tomcat和APM等组件。


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:

总结

在公式描述中,提到了“最小开销”,并且它所指的开销平均不超过1微秒。

使用外部服务时,可能会考虑数据保留期限的问题。但我认为,可以像其他Elasticsearch索引一样自行决定保留期限是个好处。
对于已经安装了Elasticsearch且希望更方便地使用并增加使用场景的人来说,这是相当合适的选择。

我期待未来会出现这样的用例:通过将APM数据与其他日志和各种指标结合起来,“因为我们将其放入了Elasticsearch,所以问题解决得很快!”

额外的
https://discuss.elastic.co/t/下一个-apm-代理/99900

在这里,你可以为下一个代理人候选人投票。我投了一票给.NET!

广告
将在 10 秒后关闭
bannerAds