如何从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 也能正常工作。