JDK 飞行记录器
Java Flight Recorder (JFR) 是一种多用途工具,用于收集用于运行 Java 应用程序及其 JVM 的各种数据。JMS 基于此构建,组管理员可以在 JMS 搜索的所有应用程序上请求 JFR 记录。
使用 JMS 减轻了访问运行应用程序的计算机、使用各种工具启动 JFR 记录、收集 JFR 记录以及从一个位置访问记录的负担。由于 Java Flight Recorder 可以观察和收集 JVM 提供的许多有用的度量,例如内存使用情况、垃圾收集、线程使用情况、异常错误等,因此客户可以轻松跟踪其应用程序的行为。
OCI 云控制台
- 以管理员身份登录 OCI 控制台。
- 打开导航菜单,单击可观察性和管理,然后单击 Java 管理下的组。
- 选择您的组。
- 单击托管实例,然后单击运行应用程序的托管实例。
- 单击 Applications(应用程序),然后选择应在其上启动 JFR 记录的应用程序。
- 单击操作,然后选择运行 JDK 飞行记录器。
- 单击启动。
- 工作请求完成后,单击工作请求,并在详细信息中导航到位于组存储桶中的 JFR 文件。
OCI CLI
- 使用以下命令创建目标有效负载模板:
oci jms fleet request-jfr-recordings --generate-param-json-input targets
- 查找有关应用程序的详细信息,例如:
oci jms application-installation-usage-summary summarize-application-installation-usage --display-name-contains $APP_NAME --fleet-id $FLEET_OCID
- 编辑有效负载 json 文件,例如:
[ { "applicationInstallationKey": "$APP_INSTALL_KEY", "applicationKey": "$APP_KEY", "jreKey": "$APP_JRE_KEY", "managedInstanceId": "$MANAGED_INSTANCE_OCID" } ]
- 执行以下命令:
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