Docker 带有 newrelic java agent 和 supervisord 的容器在第一次启动时不发送数据

Docker container with newrelic java agent and supervisord not sending data on first launch

我们有一个 docker 容器,它通过 supervisord 在 tomcat7 中运行一个 java7 应用程序。我们想通过 newrelic 监控 APM。

这是 supervisord 配置文件

[program:tomcat]
command=/home/ec2-user/tomcat7/bin/catalina.sh run
environment=CATALINA_OPTS=" -javaagent:/home/ec2-user/tomcat7/newrelic/newrelic.jar"

这是我们在 Dockerfile

中添加 newrelic.yml 配置文件的地方
COPY newrelic.yml /home/ec2-user/tomcat7/newrelic/newrelic.yml

当 docker 容器启动时,它会运行 supervisord,从而正确启动 java 应用程序。虽然,如果我们连接到容器并转到 tomcat7/newrelic 文件夹,我们会看到没有创建 logs 文件夹。没有数据发送到 newrelic,即使 ps aux | grep tomcat 告诉我们
-javaagent 选项已正确传递:

/usr/bin/java -Djava.util.logging.config.file=/home/ec2-user/tomcat7/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -javaagent:/home/ec2-user/tomcat7/newrelic/newrelic.jar -Djava.endorsed.dirs=/home/ec2-user/tomcat7/endorsed -classpath /home/ec2-user/conf:/home/ec2-user/tomcat7/bin/bootstrap.jar:/home/ec2-user/tomcat7/bin/tomcat-juli.jar -Dcatalina.base=/home/ec2-user/tomcat7 -Dcatalina.home=/home/ec2-user/tomcat7 -Djava.io.tmpdir=/home/ec2-user/tomcat7/temp org.apache.catalina.startup.Bootstrap start

如果我们杀死容器中的tomcat7进程,supervisord会重启进程,然后我们会看到"logs"文件夹出现,数据正在正确发送到newrelic。

supervisord 第一次启动进程时 newrelic 代理不附加,但在第二次启动时附加,是否有任何原因?

我们发现了问题:tomcat 中缺少 temp 文件夹。 如果文件夹不存在,newrelic 代理将不会启动,但会创建它。这解释了为什么我们第二次启动该过程时,代理正确挂钩。