我们有一个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代理没有附加的进程,但在第二次启动时呢?
答案 0 :(得分:3)
我们发现了问题:我们的tomcat中缺少temp
文件夹。
如果文件夹不存在,则不会启动newrelic代理,但会创建它。这就解释了为什么我们第二次开始这个过程时,代理正确地挂钩了。