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 代理不附加,但在第二次启动时附加,是否有任何原因?
- supervisord 版本:3.1.3
- newrelic 代理版本:3.21.0
- tomcat版本:7
- java版本:7
- docker版本:1.7.1
我们发现了问题:tomcat 中缺少 temp
文件夹。
如果文件夹不存在,newrelic 代理将不会启动,但会创建它。这解释了为什么我们第二次启动该过程时,代理正确挂钩。
我们有一个 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 代理不附加,但在第二次启动时附加,是否有任何原因?
- supervisord 版本:3.1.3
- newrelic 代理版本:3.21.0
- tomcat版本:7
- java版本:7
- docker版本:1.7.1
我们发现了问题:tomcat 中缺少 temp
文件夹。
如果文件夹不存在,newrelic 代理将不会启动,但会创建它。这解释了为什么我们第二次启动该过程时,代理正确挂钩。