Ao integrar o agente Apache SkyWalking em uma aplicação Spring Boot, alguns problemas podem surgir. Este artigo detalha as dificuldades comuns encontradas e suas respectivas soluções.
Problema 1: Erros de injeção de código do agente
Ao iniciar um projeto Spring Boot empacotado como um arquivo JAR, usando a seguinte linha de comando:
java -javaagent:/caminho/para/agente/skywalking-agent.jar -jar seu-projeto.jar SW_AGENT_NAME=nome-do-servico
Verifique o arquivo de log skywalking-api.log na pasta logs do agente. Mensagens de aviso indicando que a instrumentação de classses falhou devido à ausência de classes de testemunha são comuns:
WARN 2021-02-03 15:36:44:520 main AbstractClassEnhancePluginDefine : enhance class com.exemplo.controller.MeuController by plugin org.apache.skywalking.apm.plugin.spring.mvc.v3.define.ControllerInstrumentation is not working. Because witness class org.springframework.web.servlet.view.xslt.AbstractXsltView is not existed.
WARN 2021-02-03 15:36:44:523 main AbstractClassEnhancePluginDefine : enhance class com.exemplo.controller.MeuController by plugin org.apache.skywalking.apm.plugin.spring.mvc.v4.define.ControllerInstrumentation is not working. Because witness class org.springframework.cache.interceptor.DefaultKeyGenerator is not existed.
... (outros avisos semelhantes) ...
Solução:
Esses avisos geralmente ocorrem porque o agente SkyWalking não consegue encontrar dependências de bibliotecas específicas do Spring MVC que ele tenta instrumentar. Para resolver isso:
- Copie todos os arquivos JAR da pasta
optional-pluginsdo agente para a pastaplugins. - Verifique se as dependências do seu projeto Spring Boot são compatíveis com os plugins do agente SkyWalking. Se um determinado JAR de plugin estiver faltando, adicione a dependência corrrespondente ao seu projeto ou copie o JAR ausente da distribuição do agente para a pasta
plugins.
Problema 2: Exceção de violação de acesso (Access Violation) na JVM
Em alguns casos, a aplicação pode travar com um erro fatal da JVM, indicando uma violação de acesso, como:
#
# A fatal error has been detected by the Java Runtime Environment:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x0000000000000002, pid=948, tid=7460
#
# JRE version: Java(TM) SE Runtime Environment (8.0_05-b13) (build 1.8.0_05-b13)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.5-b02 mixed mode windows-amd64 compressed oops)
# Problematic frame:
# C 0x0000000000000002
#
... (detalhes do thread e registradores) ...
Solução:
Esse tipo de erro, especialmente com versões mais antigas do JDK 8 (como 1.8.0_05), pode ser um bug conhecido ou uma incompatibilidade. Tentar ajustar o tamanho da memória da JVM ou outros parâmetros de inicialização pode não resolver o problema. Uma solução eficaz é:
- Atualizar a versão do seu JDK. No exemplo dado, a atualização do JDK 8 de
1.8.0_05para1.8.0_281resolveu a falha.