我尝试让Newrelic Java代理在Docker容器中运行,以监视在Docker容器中运行的HiveMetaStore服务器。
为了在JVM启动期间启动Newrelic代理,我必须将javaagent /path/to/newrelic.jar标志传递给JVM。
我尝试过:
hive --service metastore -javaagent /path/to/newrelic.jar
此操作失败,并在HiveMetaStore服务器代码中显示“无法识别的选项”,该代码根本不应该在此结束。
配置单元脚本调用bin / ext / metastore.sh脚本,该脚本又调用
exec $HADOOP jar $JAR $CLASS "$@"
所以我试图修补此调用:
exec $HADOOP -javaagent /path/to/newrelic.jar jar $JAR $CLASS "$@"
这也失败了。
然后,我更深入地研究了hadoop脚本。最后,libexec // hadoop_functions.sh中的hadoop_java_exec函数调用:
exec“ $ {JAVA}”“ -Dproc _ $ {command}” $ {HADOOP_OPTS}“ $ {class}”“ $ @”
所以我修补了此代码:
exec“ $ {JAVA}”“ -javaagent /path/to/newrelic.jar”“ -Dproc _ $ {command}” $ {HADOOP_OPTS}“ $ {class}”“ $ @”
再次失败。
最后但并非最不重要的一点是,我认识到可以通过HADOOP _OPTS传递java属性(在libexec / hadoop_functions.sh中:]
function hadoop_finalize_hadoop_opts
{
hadoop_translate_cygwin_path HADOOP_LOG_DIR
hadoop_add_param HADOOP_OPTS hadoop.log.dir "-Dhadoop.log.dir=${HADOOP_LOG_DIR}"
hadoop_add_param HADOOP_OPTS hadoop.log.file "-Dhadoop.log.file=${HADOOP_LOGFILE}"
…
}
但是我不知道如何使用这种机制将-javaagent:/path/to/newrelic.jar传递给我们。
以前有没有尝试过这种方法并且可以提供帮助的人?
如果这是一个愚蠢的问题,我道歉。预先感谢,Ute
function hadoop_finalize_hadoop_opts
{
hadoop_translate_cygwin_path HADOOP_LOG_DIR
hadoop_add_param HADOOP_OPTS hadoop.log.dir "-Dhadoop.log.dir=${HADOOP_LOG_DIR}"
hadoop_add_param HADOOP_OPTS hadoop.log.file "-Dhadoop.log.file=${HADOOP_LOGFILE}"
…
hadoop_add _param HADOOP_OPTS java.javaagent -javaagent:${NEWRELIC_AGENT_HOME}\/newrelic.jar
}
添加最后一条语句以启动代理。我在容器中看到:
/usr/lib/jvm/default-jvm/bin/java -Dproc_jar -Dproc_metastore , … , NullAppender - javaagent:/opt/newrelic-agent-5.10.0/newrelic.jar org.apache.hadoop.util.RunJar /opt/apache-hive-3.1.2-bin/lib/hive-metastore-3.1.2.jar org.apache.hadoop.hive.metastore.HiveMetaStore
我还不了解“ NullAppender”,但至少该代理似乎正在运行。