JDK Flight Recorder

Java Flight Recorder (JFR) 是一種多用途工具,可收集執行 Java 應用程式與其 JVM 的各種資料。JMS 建置在其中,讓機組管理員可以要求 JMS 所發現之所有應用程式的 JFR 記錄。

使用各種工具啟動 JFR 錄製、收集 JFR 錄製內容以及從一個位置存取錄製內容的機器,會透過 JMS 降低存取應用程式的負擔。由於 Java Flight Recorder 可以觀察並收集 JVM 所提供的許多實用度量,例如記憶體使用狀況、資源回收、繫線使用狀況、異常狀況等,因此客戶可以輕鬆追蹤其應用程式的行為。

OCI 雲端主控台

  1. 以管理員身分登入 OCI 主控台。
  2. 開啟導覽功能表,按一下可觀測性與管理,然後按一下 Java 管理下的機組
  3. 選取您的機組。
  4. 按一下受管理執行處理,然後按一下執行應用程式的受管理執行處理。
  5. 按一下應用程式,然後選取要啟動 JFR 記錄的應用程式。
  6. 按一下動作,然後選取執行 JDK Flight Recorder
  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 在 Tomcat 應用程式伺服器上使用 JFR 自訂設定檔建立 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