手动捕获堆转储和线程转储并在 Azure Spring Apps 中使用 Java Flight Recorder

注意

基本、标准和企业计划将从 2025 年 3 月中旬开始弃用,停用期为 3 年。 建议转换到 Azure 容器应用。 有关详细信息,请参阅 Azure Spring Apps 停用公告

标准消耗和专用计划将于 2024 年 9 月 30 日开始弃用,并在六个月后完全关闭。 建议转换到 Azure 容器应用。

本文介绍如何手动生成堆转储或线程转储,以及如何启动 Java Flight Recorder (JFR)。

有效的故障排除对于确保你能够解决方法生产环境中的问题并保持业务在线至关重要。 Azure Spring Apps 提供应用程序日志流和查询、发出富指标、警报和分布式跟踪等。 但是,当你收到有关具有高延迟、JVM 堆泄漏或 CPU 使用率高的请求的警报时,没有“最后一英里”的解决方案。 出于这个原因,我们为你提供了手动生成堆转储、生成线程转储和启动 JFR 的功能。

先决条件

生成堆转储

使用以下命令在 Azure Spring Apps 中生成应用的堆转储。

az spring app deployment generate-heap-dump \
    --resource-group <resource-group-name> \
    --service <Azure-Spring-Apps-instance-name> \
    --app <app-name> \
    --deployment <deployment-name> \
    --app-instance <app-instance name> \
    --file-path <your-target-file-path-in-your-persistent-storage-mount-path>

生成线程转储

使用以下命令在 Azure Spring Apps 中生成应用的线程转储。

az spring app deployment generate-thread-dump \
    --resource-group <resource-group-name> \
    --service <Azure-Spring-Apps-instance-name> \
    --app <app-name> \
    --deployment <deployment-name> \
    --app-instance <app-instance name> \
    --file-path <your-target-file-path-in-your-persistent-storage-mount-path>

启动 JFR

使用以下命令在 Azure Spring Apps 中为你的应用启动 JFR。

az spring app deployment start-jfr \
    --resource-group <resource-group-name> \
    --service <Azure-Spring-Apps-instance-name> \
    --app <app-name> \
    --deployment <deployment-name> \
    --app-instance <app-instance name> \
    --file-path <your-target-file-path-in-your-persistent-storage-mount-path> \
    --duration <duration-of-JFR>

duration 的默认值为 60 秒。

使用 Azure 门户生成转储

使用以下步骤在 Azure Spring Apps 中生成应用的堆或线程转储。

  1. 在 Azure 门户中,导航到目标应用,然后选择“故障排除”。

    Azure 门户的屏幕截图,其中显示了“应用概述”页,并突出显示了“故障排除”按钮。

  2. 在“故障排除”窗格中,选择要收集的应用实例和转储类型。

    Azure 门户“故障排除”窗格的屏幕截图。

  3. 在“文件路径”字段中,指定持久性存储的装载路径。

  4. 选择“收集”。

获取诊断文件

导航到持久存储中的目标文件路径并找到你的转储/JFR。 从该路径中,你可以将其下载到本地计算机。 对于堆转储,生成的文件名类似于 <app-instance>_heapdump_<time-stamp>.hprof,对于线程转储,类似于 <app-instance>_threaddump_<time-stamp>.txt,对于 JFR 文件,则类似于 <app-instance>_JFR_<time-stamp>.jfr

后续步骤