Ativando traces usando LTTng
- 3 minutes read - 612 wordsNeste post vamos descobrir como podemos instrumentar aplicações Erlang/Elixir dinamicamente.
Trace dinâmicos
Um trace dinâmico é um conjunto de bibliotecas nas quais permitem instrumentar partes do sistema em tempo de execução, com o objetivo de extrair métricas de performance, ajudando na resolução de problemas.
Geralmente estes traces possibilitam uma visão fim-a-fim envolvendo a aplicação e chamadas de sistema.
Trace BEAM
Existem três modos de utilizar traces dinâmicos no BEAM. Sendo dependente do Sistema Operacional:
- DTrace (NetBSD, OpenBSD, FreeBSD, Mac OSX)
- Systemtap (DTrace para Linux)
- LTTng (Linux)
Para ter acesso a traces precisamos recompilar a BEAM VM para utilizar um dos módulos de trace suportados. Toda a BEAM VM foi instrumentada usando dyntrace mas esta instrumentação somente é ativada quando recompilamos utilizando o parâmetro: –with-dynamic-trace.
Neste post, vamos utilizar o LTTng em um Ubuntu 18.10.
O que é LTTng?
LTTng é um framework (documentação, bibliotecas, utilitáros e visualizadores) de trace para Linux. A intenção é entender a interação de diversos componentes do sistema durante uma sessão de trace.
É um projeto usado em todas as distribuições Linux e já possui vários anos de desenvolvimento e otimização.
Podemos capturar um trace de diversas formas
- localmente: escreve os traces no sistema de arquivos local
- remotamente: envia os traces para um relay
- live mode: os traces não são escritos localmente mas sim visualizados remotamente
- snapshot: os traces são escritos em arquivos locais ou enviados remotamente mediante a uma solicitação de snapshot.
A documentação explica todas as funcionalidades e modos de utilização.
Como ativar e usar
Em LTTng and Erlang/OTP existe uma documentação oficial de como podemos ativar. Vamos seguir esta documentação.
Instalar as dependências:
sudo apt-get install lttng-tools liblttng-ust-dev
Usando o kerl para compilar uma versão OTP com o trace habilitado.
1 export
2KERL_CONFIGURE_OPTIONS="--with-dynamic-trace=lttng"
3
4kerl build git https://github.com/erlang/otp.git OTP-22.0.7 22.0.7-lttng
5
6kerl install 22.0.7-lttng ~/kerl/22.0.7-lttng
Na linha 1, o parâmetro necessário para a ativação dos traces é passado usando a variável de ambiente KERL_CONFIGURE_OPTIONS. O comando de build é chamado na linha 3 e para instalar a versão compilada usamos o comando na linha 5.
kerl é uma das melhores formas de compilar e testar novas versões de Erlang.
Agora já temos tudo pronto. Vamos ativar a shell com a nova versão do Erlang/OTP com suporte ao LTTng e fazer alguns testes. Em uma nova shell:
1 $ source ~/kerl/22.0.7-lttng/activate $
2erl Erlang/OTP 22 [erts-10.4.4] [source] [64-bit] [smp:4:4] [ds:4:4:10]
3[async-threads:1] [hipe] [lttng]
4
5Eshell V10.4.4 (abort with ^G) 1>
Repare que ativamos o suporte ao LTTng com sucesso pois a opção [lttng] apareceu na shell.
Exemplos usando LTTng e BEAM
Todos os eventos pertencem a dois domains:
- Dynamic Tracepoints: podem ser configurados e ativados ou desativados durante a execução da BEAM VM. Usamos a função erlang:trace/3 para controlar o que iremos fazer o trace
- BEAM Tracepoints: não podem ser controlados. Estes eventos são emitidos independentemente.
Exemplo básico
O melhor exemplo é o documentado aqui Example of process tracing:
A visualização do trace pode ser feita usando a ferramenta Tracecompass. Mas ainda não consegui criar bonitos dashboards para mostrar aqui.
Quais os cenários que posso utilizar?
Tirando o fato que é necessário fazer a recompilação da BEAM VM, podemos ter uma versão dos pacotes compilados com a flag ativada with-dynamic-trace e somente usados durante os testes de performance e carga do sistema. Caso esteja usando Linux em qualquer distribuição não é complicado criar pacotes customizados com a flag habilitada.
Durante o desenvolvimento ou investigação de algum bug bem específico os traces podem ser utilizados ao invés das técnicas convencionais (por exemplo: logs).
Creio que poucos desenvolvedores sabem que podem utilizar estes recursos. BEAM VM entrega este recurso já pronto, sem a necessidade de instrumentar a aplicação.