具有newrelic java代理和supervisord的Docker容器在首次启动时不发送数据

时间:2015-11-02 15:55:15

标签: java tomcat docker newrelic supervisord

我们有一个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文件夹。即使ps aux | grep tomcat向我们显示正确传递了-javaagent选项,也没有数据发送到newrelic:

/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 version:3.1.3
  • newrelic agent版本:3.21.0
  • tomcat版本:7
  • java version:7
  • docker version:1.7.1

1 个答案:

答案 0 :(得分:3)

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