Quando você começa a pensar sobre profiling das aplicações Java, muitas ferramentas vem à mente - mas você acha que profiling poderiam ser tão fácil quanto adicionar declarações de logging? Este é o objetivo do projeto Perf4j:
O Perf4J é para o System.currentTimeMillis() o mesmo que log4j é para o System.out.println()
Com este objetivo em mente, o Perf4J fornece uma impressionante lista de funcionalidades:
- Um mecanismo simples de stop watch para declarações de tempo.
- Uma ferramenta de linha de comando para parser de arquivos de log que gera estatísticas agregadas e gráficos de performance.
- Fácil integração com os mais frameworks mais comuns de logging: log4j, java.util.logging, Apache Commons Logging e SLF4J.
- Appenders Log4j customizados para gerar estatísticas e gráficos em uma aplicação em execução (em breve handlers java.util.logging customizados).
- A habilidade para expor estatísticas de performance como atributos JMX, e enviar notificações quando as estatísticas excedem determinados limites.
- Um servlet para expor os gráficos de performance em uma aplicação web.
- Uma annotation @Profiled e um conjunto de aspectos customizados que permite declarações de tempo não intrusivas quando combinado com um framework AOP tal como AspectJ ou Spring AOP.
- Uma arquitetura extensível.
A InfoQ conversou com Alex Devine, um dos líderes do projeto Perf4j, que explicou como surgiu o Perf4j:
Percebendo que o problema de rastreio de performance e gerenciamento afetaria muito a cada projeto em nossa empresa (e, na verdade, quase todo servidor baseado, aplicações distribuídas), nós decidimos construir e produzir uma biblioteca de performance padrão, que depois tornou-se Perf4J.
"Há alguns problemas de performance delicados que o Perf4j pode ajudar a resolver":
O Perf4J é bem adequado para detectar problemas de performance baixa em aplicações orientadas a serviços e altamente distribuidas. Por exemplo, na Homeway um único acesso de uma de nossos resultados das páginas de busca em uma chamada do servidor de front-end, que faz chamadas ao banco de dados além de chamar o serviço de buscar e um servidor sobre HTTP. O serviço de busca por si só agrega resultados de vários nós. Se a performance do ambiente de produção cair, é muito mais fácil rapidamente apontar o componente problemático usando o Perf4j.
Isso nos leva à próxima questão "O Perf4j pode ser usado em um ambiente de produção?"
O Perf4j foi definitivamente desenhado para ser usado em ambiente de produção. De fato, frequentemente tudo parece uma maravilha no ambiente de teste só para se arrastar miseravelmente em produção; ter o monitoramente configurado ANTES de um grande problema de performance é crucial para rastrear o problema.
Para overheade de performance, Alex acrescentou:
O overhead é parecido com logging, já que iniciar e parar um StopWatch essencialmente a mesma coisa que você faria se você chamasse System.currentTimeMillis() antes e depois do código a ser monitorado e então colocasse isso no log. Assim, de forma similar, o overhead depende dos appenders que você anexou. O design do AsyncCoalescingStatisticsAppender é o que empurra a mensagem de log em uma fila que é esvaziada pelos appenders em uma thread separada, então quando os appenders de downstream tem muito trabalho, isso não afeta a execução da thread principal. Além disso, se você está usando a annotation @Profile com interlaçamento de load-time, você pode determinar quais métodos você quer que sejam monitorados em runtime. Em cada caso há absolutamente zero de overhead para os métodos que você não monitora.
E o que vem em seguida:
Nós queremos habilitar profiling de runtime mesmo se o código a ser monitorado não possua StopWatches ou annotations @Profiled. Isso é, eu quero permitir aos desenvolvedores especificar métodos específicos para serem monitorados no arquivo aop.xml ou na configuração de uma aplicação Spring. Isso permitiria a você, por exemplo, monitorar bibliotecas de terceiros que não conhecem o Perf4J e isso remove completamente todas as declarações de profiling do código fonte.
O Perf4j pode ser baixado de http://perf4j.org.