Gravador do JDK Flight

O Java Flight Recorder (JFR) é uma ferramenta de vários propósitos para coletar vários dados para executar aplicativos Java e sua JVM. O JMS se baseia nele e permite que os administradores de frota solicitem gravações de JFR em todos os aplicativos descobertos pelo JMS.

O ônus de acessar as máquinas que executam os aplicativos, usando várias ferramentas para iniciar gravações JFR, coletar as gravações JFR e acessar as gravações de um só lugar é reduzido usando JMS. Como o Java Flight Recorder pode observar e coletar muitas métricas úteis fornecidas pela JVM, como uso de memória, coleta de lixo, uso de threads, exceções e assim por diante, os clientes podem rastrear facilmente o comportamento de seus aplicativos.

Console do OCI Cloud

  1. Acesse a Console do OCI como administrador.
  2. Abra o menu de navegação, clique em Observabilidade e Gerenciamento e, em seguida, clique em Frota em Java Management.
  3. Selecione sua frota.
  4. Clique em Instâncias gerenciadas e, em seguida, clique na instância gerenciada na qual o aplicativo está em execução.
  5. Clique em Aplicativos e selecione o aplicativo no qual o registro de JFR deve ser iniciado.
  6. Clique em Ações e selecione Executar Gravador do JDK Flight.
  7. Clique em Iniciar.
  8. Quando a solicitação de serviço for concluída, clique na solicitação de serviço e, em detalhes, navegue até os arquivos JFR localizados no bucket da sua frota.

CLI do OCI

  1. Crie o modelo de payload de destinos usando o seguinte comando:
    oci jms fleet request-jfr-recordings --generate-param-json-input
        targets
  2. Encontre detalhes sobre seu aplicativo, por exemplo, com:
    oci jms application-installation-usage-summary summarize-application-installation-usage
          --display-name-contains $APP_NAME --fleet-id $FLEET_OCID
  3. Edite o arquivo json de payload, por exemplo:
    [
      {
        "applicationInstallationKey": "$APP_INSTALL_KEY",
        "applicationKey": "$APP_KEY",
        "jreKey": "$APP_JRE_KEY",
        "managedInstanceId": "$MANAGED_INSTANCE_OCID"
      }
    ]
  4. Execute o seguinte comando:
    oci jms fleet request-jfr-recordings --fleet-id $FLEET_OCID
          --jfc-profile-name default.jfc --targets file://targets.json

Exemplo

Como o Java Flight Recording pode coletar tantas métricas interessantes, é difícil apontar apenas um bom exemplo. A partir dos exemplos de recursos de análise de criptografia e desempenho, você pode ver um bom uso em áreas de segurança ou desempenho. No exemplo a seguir, mostraremos um exemplo de uso do JMS para criar gravações JFR no servidor de aplicativos Tomcat com perfil personalizado 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

Observação:

  • O utilitário de linha de comando jfr faz parte de pacotes JDK mais recentes.
  • O utilitário de linha de comando base64 pode não estar presente na plataforma Windows.

Depois que a solicitação de serviço for concluída, o JFR será submetido a upload para o bucket associado à sua frota:

# 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