JDK 飞行记录器

Java Flight Recorder (JFR) 是一种多用途工具,用于收集用于运行 Java 应用程序及其 JVM 的各种数据。JMS 基于此构建,组管理员可以在 JMS 搜索的所有应用程序上请求 JFR 记录。

使用 JMS 减轻了访问运行应用程序的计算机、使用各种工具启动 JFR 记录、收集 JFR 记录以及从一个位置访问记录的负担。由于 Java Flight Recorder 可以观察和收集 JVM 提供的许多有用的度量,例如内存使用情况、垃圾收集、线程使用情况、异常错误等,因此客户可以轻松跟踪其应用程序的行为。

OCI 云控制台

  1. 以管理员身份登录 OCI 控制台。
  2. 打开导航菜单,单击可观察性和管理,然后单击 Java 管理下的
  3. 选择您的组。
  4. 单击托管实例,然后单击运行应用程序的托管实例。
  5. 单击 Applications(应用程序),然后选择应在其上启动 JFR 记录的应用程序。
  6. 单击操作,然后选择运行 JDK 飞行记录器
  7. 单击启动
  8. 工作请求完成后,单击工作请求,并在详细信息中导航到位于组存储桶中的 JFR 文件。

OCI CLI

  1. 使用以下命令创建目标有效负载模板:
    oci jms fleet request-jfr-recordings --generate-param-json-input
        targets
  2. 查找有关应用程序的详细信息,例如:
    oci jms application-installation-usage-summary summarize-application-installation-usage
          --display-name-contains $APP_NAME --fleet-id $FLEET_OCID
  3. 编辑有效负载 json 文件,例如:
    [
      {
        "applicationInstallationKey": "$APP_INSTALL_KEY",
        "applicationKey": "$APP_KEY",
        "jreKey": "$APP_JRE_KEY",
        "managedInstanceId": "$MANAGED_INSTANCE_OCID"
      }
    ]
  4. 执行以下命令:
    oci jms fleet request-jfr-recordings --fleet-id $FLEET_OCID
          --jfc-profile-name default.jfc --targets file://targets.json

范例

由于 Java Flight Recording 可以收集这么多有趣的指标,因此很难仅举一个很好的例子。从加密和性能分析功能的例子中,您可以看到在安全或性能方面使用良好。在以下示例中,我们将向您展示使用 JMS 在具有 JFR 定制配置文件的 Tomcat 应用程序服务器上创建 JFR 记录的示例:
#!/usr/bin/env bash
 
# configuration variables
APP_INSTALL_LOCATION=/usr/share/tomcat
JFC_FILENAME=custom.jfc
FLEET_OCID=ocid1.jmsfleet.oc1.eu-frankfurt-1.amaaaaaaptiaquqa2qxxkco6hrguz7nyug2hcpgikhe5gz4d7uy6j6ilbtta
MANAGED_INSTANCE_OCID=ocid1.instance.oc1.eu-frankfurt-1.antheljtptiaquqcrjmnu7mxbjthm2jm5qzryu7xy4w27rfo56nxf4uwv6pq
 
# get application installation key
APP_INSTALL_KEY=$(oci jms application-installation-usage-summary summarize-application-installation-usage --app-installation-path-contains "$APP_INSTALL_LOCATION" --fleet-id $FLEET_OCID | jq -r '.data.items[]."application-installation-key"')
 
# create custom jfc file from default profile
jfr configure thread-dump=10s exceptions=all --output $JFC_FILENAME
ENCODED_JFC=$(cat $JFC_FILENAME | base64)
 
# start jfr recording with v2 custom profile for JDK 9 or higher
WORK_REQUEST_OCID=$(oci jms fleet request-jfr-recordings \
    --fleet-id "$FLEET_OCID" \
    --jfc-profile-name custom-profile \
    --jfc-v2 "$ENCODED_JFC" \
    --targets "[{\"applicationInstallationKey\":\"$APP_INSTALL_KEY\", \"managedInstanceId\":\"$MANAGED_INSTANCE_OCID\"}]" | jq -r '."opc-work-request-id"')
 
echo $WORK_REQUEST_OCID
 
# additionally you can add your own logic to check if work request is finished
# sleep 600
# oci jms work-request get --work-request-id "$WORK_REQUEST_OCID" | jq .data.status

注意:

  • jfr 命令行实用程序是最新 JDK 包的一部分。
  • Windows 平台上可能不存在 base64 命令行实用程序。

完成工作请求后,JFR 将上载到与组关联的存储桶:

# list all the jfr recordings created during work request execution
oci jms work-request-log-entry list-work-request-logs --all --work-request-id "$WORK_REQUEST_OCID" | jq -r '.data.items[].message | fromjson | select(.objectName != null) | .objectName' | sort | uniq
 
JMS/JFR/ocid1.jmsfleet.oc1.eu-frankfurt-1.amaaaaaaptiaquqa2qxxkco6hrguz7nyug2hcpgikhe5gz4d7uy6j6ilbtta/ocid1.instance.oc1.eu-frankfurt-1.antheljtptiaquqcrjmnu7mxbjthm2jm5qzryu7xy4w27rfo56nxf4uwv6pq/20250710104111_155_0_91783_0_org.apache.catalina.startup.Bootstrap.jfr