在锁定 tomcat 临时文件夹的情况下配置 Glowroot 显示以下异常
Configuring Glowroot with tomcat temp folder locked shows following exception
我正在客户端 Tomcat 上配置 Glowroot 代理,出于安全原因,我们只提供对 Tomcat 的临时目录 glowroot 的读取权限 -> tcnative -> netty 用于在 Tomcat temp 目录中创建一个临时文件,并在成功执行后将其删除,但由于我们对临时文件夹的访问权限有限,我得到了这个异常。如果我提供 rwx
访问 Tomcat 临时文件夹,一切正常。
java.lang.IllegalStateException: Could not find TLS ALPN provider; no working netty-tcnative, Conscrypt, or Jetty NPN/ALPN available
at org.glowroot.agent.shaded.io.grpc.netty.GrpcSslContexts.defaultSslProvider(GrpcSslContexts.java:258)
at org.glowroot.agent.shaded.io.grpc.netty.GrpcSslContexts.configure(GrpcSslContexts.java:171)
at org.glowroot.agent.shaded.io.grpc.netty.GrpcSslContexts.forClient(GrpcSslContexts.java:120)
at org.glowroot.agent.central.CentralConnection.<init>(CentralConnection.java:125)
at org.glowroot.agent.central.CentralCollector.<init>(CentralCollector.java:135)
at org.glowroot.agent.init.NonEmbeddedGlowrootAgentInit.run(NonEmbeddedGlowrootAgentInit.java:136)
at org.glowroot.agent.impl.BytecodeServiceImpl.enteringMainMethod(BytecodeServiceImpl.java:255)
at org.glowroot.agent.impl.BytecodeServiceImpl.enteringMainMethod(BytecodeServiceImpl.java:77)
at org.glowroot.agent.bytecode.api.Bytecode.enteringMainMethod(Bytecode.java:32)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java)
根据文档,我们可以通过 vm 参数设置 netty tmp 目录
-Dio.netty.native.workdir=/some/dir
但这在运行时根据 io.netty.util.internal.PlatformDependent
中的代码跳回到 tomcat temp 时不兑现
private static File tmpdir0() {
File f;
try {
f = toDirectory(SystemPropertyUtil.get("io.netty.tmpdir"));
if (f != null) {
logger.debug("-Dio.netty.tmpdir: {}", f);
return f;
}
f = toDirectory(SystemPropertyUtil.get("java.io.tmpdir"));
if (f != null) {
logger.debug("-Dio.netty.tmpdir: {} (java.io.tmpdir)", f);
return f;
}
// This shouldn't happen, but just in case ..
if (isWindows()) {
f = toDirectory(System.getenv("TEMP"));
if (f != null) {
logger.debug("-Dio.netty.tmpdir: {} (%TEMP%)", f);
return f;
}
String userprofile = System.getenv("USERPROFILE");
if (userprofile != null) {
f = toDirectory(userprofile + "\AppData\Local\Temp");
if (f != null) {
logger.debug("-Dio.netty.tmpdir: {} (%USERPROFILE%\AppData\Local\Temp)", f);
return f;
}
f = toDirectory(userprofile + "\Local Settings\Temp");
if (f != null) {
logger.debug("-Dio.netty.tmpdir: {} (%USERPROFILE%\Local Settings\Temp)", f);
return f;
}
}
} else {
f = toDirectory(System.getenv("TMPDIR"));
if (f != null) {
logger.debug("-Dio.netty.tmpdir: {} ($TMPDIR)", f);
return f;
}
}
} catch (Throwable ignored) {
// Environment variable inaccessible
}
// Last resort.
if (isWindows()) {
f = new File("C:\Windows\Temp");
} else {
f = new File("/tmp");
}
logger.warn("Failed to get the temporary directory; falling back to: {}", f);
return f;
}
如何强制设置 Netty tmp 目录?
试试这个 vm 参数 -Dorg.glowroot.agent.shaded.io.netty.tmpdir="your\path"
Netty 用于预先在 jre 库中查找库,因此在正常情况下,如果 dll 在 jre/libs/ 中可用且具有下面指定的名称,它将被加载
"netty_tcnative_[os.name]_[os.arch].dll"(windows)
或
"netty_tcnative_[os.name]_[os.arch].so"(linux)
检查您的 os.name 和 os.arch 以替换库名称中的最后一个后缀
如果 netty 服务用作 uber jar,请检查要附加的阴影包名称,对于 glowroot,这将是
org_glowroot_agent_shaded_netty_tcnative_windows_x86_64.dll
*对于 windows 8.1 以上的版本 os.name 可能无法按预期工作,请参考
用于查找 os.name 和 os.arch
执行下面的代码
SystemPropertyUtil.get("os.name")
SystemPropertyUtil.get("os.arch")
我正在客户端 Tomcat 上配置 Glowroot 代理,出于安全原因,我们只提供对 Tomcat 的临时目录 glowroot 的读取权限 -> tcnative -> netty 用于在 Tomcat temp 目录中创建一个临时文件,并在成功执行后将其删除,但由于我们对临时文件夹的访问权限有限,我得到了这个异常。如果我提供 rwx
访问 Tomcat 临时文件夹,一切正常。
java.lang.IllegalStateException: Could not find TLS ALPN provider; no working netty-tcnative, Conscrypt, or Jetty NPN/ALPN available
at org.glowroot.agent.shaded.io.grpc.netty.GrpcSslContexts.defaultSslProvider(GrpcSslContexts.java:258)
at org.glowroot.agent.shaded.io.grpc.netty.GrpcSslContexts.configure(GrpcSslContexts.java:171)
at org.glowroot.agent.shaded.io.grpc.netty.GrpcSslContexts.forClient(GrpcSslContexts.java:120)
at org.glowroot.agent.central.CentralConnection.<init>(CentralConnection.java:125)
at org.glowroot.agent.central.CentralCollector.<init>(CentralCollector.java:135)
at org.glowroot.agent.init.NonEmbeddedGlowrootAgentInit.run(NonEmbeddedGlowrootAgentInit.java:136)
at org.glowroot.agent.impl.BytecodeServiceImpl.enteringMainMethod(BytecodeServiceImpl.java:255)
at org.glowroot.agent.impl.BytecodeServiceImpl.enteringMainMethod(BytecodeServiceImpl.java:77)
at org.glowroot.agent.bytecode.api.Bytecode.enteringMainMethod(Bytecode.java:32)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java)
根据文档,我们可以通过 vm 参数设置 netty tmp 目录
-Dio.netty.native.workdir=/some/dir
但这在运行时根据 io.netty.util.internal.PlatformDependent
private static File tmpdir0() {
File f;
try {
f = toDirectory(SystemPropertyUtil.get("io.netty.tmpdir"));
if (f != null) {
logger.debug("-Dio.netty.tmpdir: {}", f);
return f;
}
f = toDirectory(SystemPropertyUtil.get("java.io.tmpdir"));
if (f != null) {
logger.debug("-Dio.netty.tmpdir: {} (java.io.tmpdir)", f);
return f;
}
// This shouldn't happen, but just in case ..
if (isWindows()) {
f = toDirectory(System.getenv("TEMP"));
if (f != null) {
logger.debug("-Dio.netty.tmpdir: {} (%TEMP%)", f);
return f;
}
String userprofile = System.getenv("USERPROFILE");
if (userprofile != null) {
f = toDirectory(userprofile + "\AppData\Local\Temp");
if (f != null) {
logger.debug("-Dio.netty.tmpdir: {} (%USERPROFILE%\AppData\Local\Temp)", f);
return f;
}
f = toDirectory(userprofile + "\Local Settings\Temp");
if (f != null) {
logger.debug("-Dio.netty.tmpdir: {} (%USERPROFILE%\Local Settings\Temp)", f);
return f;
}
}
} else {
f = toDirectory(System.getenv("TMPDIR"));
if (f != null) {
logger.debug("-Dio.netty.tmpdir: {} ($TMPDIR)", f);
return f;
}
}
} catch (Throwable ignored) {
// Environment variable inaccessible
}
// Last resort.
if (isWindows()) {
f = new File("C:\Windows\Temp");
} else {
f = new File("/tmp");
}
logger.warn("Failed to get the temporary directory; falling back to: {}", f);
return f;
}
如何强制设置 Netty tmp 目录?
试试这个 vm 参数 -Dorg.glowroot.agent.shaded.io.netty.tmpdir="your\path"
Netty 用于预先在 jre 库中查找库,因此在正常情况下,如果 dll 在 jre/libs/ 中可用且具有下面指定的名称,它将被加载
"netty_tcnative_[os.name]_[os.arch].dll"(windows)
或
"netty_tcnative_[os.name]_[os.arch].so"(linux)
检查您的 os.name 和 os.arch 以替换库名称中的最后一个后缀
如果 netty 服务用作 uber jar,请检查要附加的阴影包名称,对于 glowroot,这将是 org_glowroot_agent_shaded_netty_tcnative_windows_x86_64.dll
*对于 windows 8.1 以上的版本 os.name 可能无法按预期工作,请参考
用于查找 os.name 和 os.arch 执行下面的代码
SystemPropertyUtil.get("os.name")
SystemPropertyUtil.get("os.arch")