具有newrelic java代理和supervisord的Docker容器在首次启动时不发送数据
我们有一个Docker容器,它通过supervisord在tomcat7上运行一个java7应用程序。 我们希望通过newrelic来监控APM。
这是supervisordconfiguration文件
[program:tomcat] command=/home/ec2-user/tomcat7/bin/catalina.sh run environment=CATALINA_OPTS=" -javaagent:/home/ec2-user/tomcat7/newrelic/newrelic.jar"
这里是我们在Dockerfile中添加newrelic.ymlconfiguration文件的地方
COPY newrelic.yml /home/ec2-user/tomcat7/newrelic/newrelic.yml
docker集装箱启动时,它运行supervisord,它正确启动Java应用程序。 虽然,如果我们连接到容器并转到tomcat7/newrelic
文件夹,我们看不到创build的logs
文件夹。 没有数据发送到新的,即使ps aux | grep tomcat
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”文件夹出现,数据正确地发送到新的。
是否有任何理由为什么第一次supervisord开始的过程中,newrelic代理不附加,但在第二次启动呢?
- supervisord版本:3.1.3
- newrelic代理版本:3.21.0
- tomcat版本:7
- java版本:7
- docker版本:1.7.1
我们发现问题:我们的tomcat中缺lesstemp
文件夹。 如果该文件夹不存在,newrelic代理将不会启动,但会创build它。 这就解释了为什么我们第二次开始这个过程时,代理正确地挂钩了。