JDK Flight Recorder

JFR(Java Flight Recorder)은 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은 많은 흥미로운 측정 지표를 수집할 수 있으므로 한 가지 좋은 예만을 지적하기는 어렵습니다. 암호화 및 성능 분석 기능의 예에서는 보안 또는 성능 영역에서 유용하게 사용할 수 있습니다. 다음 예에서는 JFR 사용자 정의된 프로파일이 있는 Tomcat 애플리케이션 서버에서 JFR 레코딩을 생성하기 위해 JMS를 사용하는 예를 보여 줍니다.
#!/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 번들의 일부입니다.
  • base64 명령행 유틸리티가 Windows 플랫폼에 존재하지 않을 수 있습니다.

작업 요청이 완료되면 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