【发布时间】:2023-04-04 03:18:01
【问题描述】:
我尝试让 Newrelic Java 代理在 docker 容器中运行,以监控在 docker 容器中运行的 HiveMetaStore 服务器。
为了在 JVM 启动期间启动 Newrelic 代理,我必须将-javaagent /path/to/newrelic.jar 标志传递给 JVM。
我试过了:
hive --service metastore -javaagent /path/to/newrelic.jar
这在 HiveMetaStore 服务器代码中出现“无法识别的选项”而失败,它根本不应该结束。
hive 脚本调用 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(在 libexec/hadoop_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/to/newrelic.jar。
有没有人曾经尝试过这个并且可以提供帮助?
如果这是一个愚蠢的问题,我深表歉意。预先感谢,Ute
【问题讨论】:
-
你好,你可以试试这样,看看它是否有效 exec $HADOOP jar $JAR $CLASS -javaagent /path/to/newrelic.jar "$@"
-
discuss.newrelic.com 社区会更好地回答这个问题
-
您好 Parvaz,我尝试了您的建议。看起来 -javaagent 参数传递了 Hadoop 代码,然后在 HiveMetaStore 代码中结束,并带有以下错误消息:
Unrecognized option: -javaagent:/opt/newrelic-agent-5.10.0/newrelic.jar -
agrument 不应该传递给 HiveMetaStore 代码,而是传递给 JVM 以启动 NewRelic Agent。
-
Salman,我刚刚将问题发布到了 Discussion.newrelic.com 社区。谢谢指点。