我尝试让newrelicjava代理在docker容器中运行,以监视在docker容器中运行的hivemetastore服务器。
为了在jvm启动期间启动newrelic代理,我必须将javaagent/path/to/newrelic.jar标志传递给jvm。
我试过:
hive --service metastore -javaagent /path/to/newrelic.jar
此操作失败,hivemetastore服务器代码中出现“unrecognized option”,根本不应该在那里结束。
配置单元脚本调用bin/ext/metastore.sh脚本,后者反过来调用
exec $HADOOP jar $JAR $CLASS "$@"
所以我试着修补这个调用:
exec $HADOOP -javaagent /path/to/newrelic.jar jar $JAR $CLASS "$@"
这也失败了。
然后我深入研究了hadoop脚本。最后libexec//hadoop\u functions.sh中的函数hadoop\u java\u exec调用:
exec "${JAVA}" "-Dproc_${command}" ${HADOOP_OPTS} "${class}" "$@"
所以我修补了这个代码:
exec "${JAVA}" "-javaagent /path/to/newrelic.jar" "-Dproc_${command}" ${HADOOP_OPTS} "${class}" "$@"
这又失败了。
最后但同样重要的是,我认识到可以通过hadoop opts(在libexec/hadoop\u functions.sh中)传递java属性:
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/传递到/newrelic.jar。
有没有人曾经尝试过这种方法,并且能帮上忙?
如果这是个愚蠢的问题,我道歉。谢谢你,尤特
1条答案
按热度按时间fcy6dtqo1#
添加上一条语句以启动代理。我在集装箱里看到:
我还不明白“nullappender”,但至少代理现在似乎正在运行。