使用Docker来连接Tomcat和Elastic的APM,以可视化性能
综述
2018年7月9日,Elastic APM Java Agent Beta版本发布,这是一个连接到 Elastic APM 的 Java 代理(Beta 版)。

如果将各种日志和指标存入Elasticsearch中,还可以将APM数据一并存入,这样有望提高调查和问题解决的速度。
在上述文章中,提到了Spring的例子,但是如果在Docker上运行Tomcat,可以更简单地尝试。
這次將介紹的內容是關於這個。試驗的環境如下所示。
在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界面进行确认。


其他
由于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!
 
    