JDK Flight Recorder

Java Flight Recorder (JFR) es una herramienta multipropósito para recopilar varios datos para ejecutar aplicaciones Java y su JVM. JMS se basa en él y permite a los administradores de conjuntos solicitar grabaciones JFR en todas las aplicaciones detectadas por JMS.

La carga de acceder a las máquinas que ejecutan las aplicaciones, utilizando varias herramientas para iniciar las grabaciones de JFR, recopilar las grabaciones de JFR y acceder a las grabaciones desde un solo lugar se reduce mediante JMS. Dado que Java Flight Recorder puede observar y recopilar muchas métricas útiles proporcionadas por JVM, como el uso de memoria, la recopilación de elementos no utilizados, el uso de threads, excepciones, etc., los clientes pueden realizar un seguimiento sencillo del comportamiento de sus aplicaciones.

Consola de OCI Cloud

  1. Conéctese a la consola de OCI como administrador.
  2. Abra el menú de navegación, haga clic en Observability & Management y, a continuación, haga clic en Fleets en Java Management.
  3. Seleccione su flota.
  4. Haga clic en Instancias gestionadas y, a continuación, en la instancia gestionada en la que se está ejecutando la aplicación.
  5. Haga clic en Aplicaciones y seleccione la aplicación en la que se debe iniciar la grabación de JFR.
  6. Haga clic en Acciones y seleccione Ejecutar grabadora de vuelo de JDK.
  7. Haga clic en Iniciar.
  8. Una vez finalizada la solicitud de trabajo, haga clic en la solicitud de trabajo y, en los detalles, navegue a los archivos JFR ubicados en el bloque del conjunto.

CLI de OCI

  1. Cree una plantilla de carga útil de destino con el siguiente comando:
    oci jms fleet request-jfr-recordings --generate-param-json-input
        targets
  2. Encuentre detalles sobre su aplicación, por ejemplo, con:
    oci jms application-installation-usage-summary summarize-application-installation-usage
          --display-name-contains $APP_NAME --fleet-id $FLEET_OCID
  3. Edite el archivo json de carga útil, por ejemplo:
    [
      {
        "applicationInstallationKey": "$APP_INSTALL_KEY",
        "applicationKey": "$APP_KEY",
        "jreKey": "$APP_JRE_KEY",
        "managedInstanceId": "$MANAGED_INSTANCE_OCID"
      }
    ]
  4. Ejecute el siguiente comando:
    oci jms fleet request-jfr-recordings --fleet-id $FLEET_OCID
          --jfc-profile-name default.jfc --targets file://targets.json

Ejemplo

Dado que Java Flight Recording puede recopilar tantas métricas interesantes, es difícil señalar solo un buen ejemplo. A partir de los ejemplos de funciones de análisis de rendimiento y criptografía, puede ver un buen uso en áreas de seguridad o rendimiento. En el siguiente ejemplo, le mostraremos un ejemplo de uso de JMS para crear grabaciones JFR en el servidor de aplicaciones Tomcat con perfil personalizado de 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

Note:

  • La utilidad de línea de comandos jfr forma parte de los paquetes de JDK más recientes.
  • Es posible que la utilidad de línea de comandos base64 no esté presente en la plataforma Windows.

Una vez que se completa la solicitud de trabajo, JFR se carga en el bloque asociado a su conjunto:

# 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