使用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!