JDK Flight Recorder
JFR(Java Flight Recorder)은 Java 애플리케이션 및 JVM 실행을 위한 다양한 데이터를 수집하기 위한 다목적 도구입니다. JMS는 맨 위에 구축되며 플리트 관리자가 JMS에서 검색된 모든 애플리케이션에서 JFR 레코딩을 요청할 수 있습니다.
다양한 도구를 사용하여 JFR 레코딩을 시작하고, JFR 레코딩을 수집하고, 한 곳에서 레코딩에 액세스하는 것은 JMS를 사용하여 감소합니다. Java Flight Recorder는 JVM이 제공하는 메모리 사용량, 불필요한 정보 수집, 스레드 사용량, 예외 등과 같은 많은 유용한 측정항목을 관찰하고 수집할 수 있으므로 고객은 애플리케이션의 동작을 쉽게 추적할 수 있습니다.
OCI 클라우드 콘솔
- OCI 콘솔에 관리자로 사인인합니다.
- 탐색 메뉴를 열고 관찰 가능성 및 관리를 누른 다음 Java 관리에서 플리트를 누릅니다.
- 플리트를 선택합니다.
- 관리 인스턴스를 누른 다음 애플리케이션이 실행 중인 관리 인스턴스를 누릅니다.
- 애플리케이션을 누르고 JFR 레코딩을 시작할 애플리케이션을 선택합니다.
- 작업을 누르고 JDK Flight Recorder 실행을 선택합니다.
- 시작을 누릅니다.
- 작업 요청이 완료되면 작업 요청을 누르고 세부정보에서 플리트의 버킷에 있는 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은 많은 흥미로운 측정 지표를 수집할 수 있으므로 한 가지 좋은 예만을 지적하기는 어렵습니다. 암호화 및 성능 분석 기능의 예에서는 보안 또는 성능 영역에서 유용하게 사용할 수 있습니다. 다음 예에서는 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