如何从docker容器中抓取应用监控信息
How to capture application monitoring information from the docker container
我有多个 java 应用程序 运行 在单独的 docker 容器中。我正在尝试使用 jstat、jstack、jmap 等工具从容器内的 java 进程 运行 收集监控数据,例如 GC 日志、线程转储、堆转储。是否可以从主机(容器外)捕获此信息?
我是容器化世界的新手。我了解主机和容器的 PID 名称空间不同。当我从主机执行 jstack <PID> > thread_dump.txt
时,它显示错误信息: 无法打开套接字文件 /proc/root/tmp/.java_pid: target process doesn't respond within 10500ms or HotSpot虚拟机未加载
Where PID is process id from the host PID namespace.
当我在容器 ( docker exec -it <container_id_or_name>
) 中执行 jstack
时,它能够捕获线程转储。
Where PID is process id from the container PID namespace.
关于如何解决这个问题的任何提示?
您应该使用的命令是:
docker exec -i <container_id_or_name> <your_monitoring_command>
该命令将在容器内执行,但它会将其输出(通过 -i
)报告给调用者控制台。
jattach 工具正是用于此目的。该项目是免费和开源的。
示例:
jattach <pid> threaddump
(像 jstack 一样工作)
jattach <pid> inspectheap
(类似于 jmap -histo)
jattach <pid> jcmd GC.class_stats
其中 <pid>
是主机命名空间中的 Java 进程 ID。
作为奖励,即使容器在未安装 JDK 工具(jstack、jcmd 等)的情况下运行 JRE,jattach
也能正常工作。
我有多个 java 应用程序 运行 在单独的 docker 容器中。我正在尝试使用 jstat、jstack、jmap 等工具从容器内的 java 进程 运行 收集监控数据,例如 GC 日志、线程转储、堆转储。是否可以从主机(容器外)捕获此信息?
我是容器化世界的新手。我了解主机和容器的 PID 名称空间不同。当我从主机执行 jstack <PID> > thread_dump.txt
时,它显示错误信息: 无法打开套接字文件 /proc/root/tmp/.java_pid: target process doesn't respond within 10500ms or HotSpot虚拟机未加载
Where PID is process id from the host PID namespace.
当我在容器 ( docker exec -it <container_id_or_name>
) 中执行 jstack
时,它能够捕获线程转储。
Where PID is process id from the container PID namespace.
关于如何解决这个问题的任何提示?
您应该使用的命令是:
docker exec -i <container_id_or_name> <your_monitoring_command>
该命令将在容器内执行,但它会将其输出(通过 -i
)报告给调用者控制台。
jattach 工具正是用于此目的。该项目是免费和开源的。
示例:
jattach <pid> threaddump
(像 jstack 一样工作)jattach <pid> inspectheap
(类似于 jmap -histo)jattach <pid> jcmd GC.class_stats
其中 <pid>
是主机命名空间中的 Java 进程 ID。
作为奖励,即使容器在未安装 JDK 工具(jstack、jcmd 等)的情况下运行 JRE,jattach
也能正常工作。