Testes de Performance com Artillery e DataDog
Fala pessoal, esse fim de semana criei um repositório de exemplo utilizando o Artillery e resolver postar aqui um pouco mais detalhadamente sobre esse projeto e sua integração com o DataDog.
Ferramentas Utilizadas
DataDog: serviço de monitoramento de aplicativos, no escopo desse post utlizaremos apenas a parte de métricas.
Artillery: solução para testes de performance feita em javascript e de fácil utilização, você pode escrever os testes usando o formato yaml ou json.
Algumas definições primeiro:
Antes de entramos no projeto, vale a pena esclarecer as diferenças entre alguns tipos de teste de performance.
- Teste de Carga— verificar a habilidade da aplicação sobre um determinado volume de requisições. A ideia é conseguir identificar os gargalos.
- Teste de Stress — testa a aplicação em cenários extremos de carga para ver como ela se comporta, aqui conseguimos identificar em qual ponto a aplicação quebra, ou seja, qual o limite da aplicação.
- Teste de Resistência —nesse tipo de teste conseguimos testar o ponto de degradação do sistema, entender como ele se comporta dado uma carga por um longo período de tempo.
- Teste de Escalabilidade — aqui verificamos as habilidades de escala de uma apliação conforme aumenta a carga. Esse teste te ajudará a ter a configuração adequada na sua aplicação para suportar altas cargas utilizando o scale-up automático.
Um pouco sobre planejamento:
Apesar do foco desse post ser mostrar a integração do Artillery com DataDog, é importante lembrar a importância de se planejar os testes de performance, se você apenas criar e executar uma série de scripts sem ter a orientação de qual é o objetivo e quais métricas serão acompanhadas, você não conseguirá extrair os benefícios desse tipo de teste. Por isso é importante primeiro planejar e depois executar.
Algumas dicas de informações que são importantes antes de se executar um teste de performance:
- Objetivo: qual o seu objetivo com esse teste
- Escopo: o que está dentro do escopo de teste (por exemplo, se sua aplicação consome um serviço terceiro, esse serviço faz parte do escopo do teste?)
- Arquitetura da Aplicação: servidores, banco de dados, firewall, load balance, etc. Esse ponto ajuda muito na execução dos testes e no mapeamento dos bugs: você precisa saber quais elementos estão sob teste e as configurações dos mesmos.
- Ambiente: configuração do ambiente de testes
- Cenários de Teste: descrição de quais cenários serão testados (por exemplo: criar uma transação de cartão de crédito)
- Ciclos de Execução: quantos usuários você vai utilizar na sua execução baseline, como será o aumento de usuários versus tempo de execução dos testes
- Métricas: CPU, memória, tempo de resposta, quantidade de erros 4XX, 5XX, etc
Finalmente Artillery & DataDog:
No repositório seguinte você encontra um exemplo do Artillery:
Para o teste estou usando o endpoint https://google-search3.p.rapidapi.com/api/v1/search da API do Google, utilizando 10 Virtual Users em 60 segundos de teste.
Estrutura do Projeto:
Para clonar o projeto:
git clone git@github.com:samycici/artillery-sample.git
Você vai encontrar a seguinte estrutura:
artillery-sample
├── package.json
├── README.md
├── spec_search.yaml
├── test_baseline_config.yaml
└── utils
└── helpers.js
Onde:
- package.json: você encontra as dependências necessárias para esse projeto;
- README.md: está descrita toda a documentação de como executar o projeto;
- spec_search.yaml: o caso de teste que será executado;
- test_baseline_config.yaml: as configurações para o teste de performance como tempo de teste, quantidade de usuários, target, etc;
- utils/helpers.js: um helper para gerar uma string que será utilizada no teste;
Executando:
Antes de executar esse projeto você precisa criar duas variáveis de ambiente com as keys que você precisará pra execução:
- a DD_API_KEY para mandar os resultados do teste para o DataDog;
- a RAPID_API_KEY que é sua key do google para autenticar na API.
DD_API_KEY:
Para criar sua API Key do DataDog, basta ir no menu Integrations > API > API Keys e criar uma nova API Key.
Feito isso basta executar no seu terminal:
export DD_API_KEY=<data-dog-api-key>
RAPID_API_KEY:
Para criar sua API Key no Rapid basta acessar essa url e fazer o Sign up utilizando sua conta do Google e se inscrever para o plano free.
Depois disso basta executar:
export RAPID_API_KEY=<google-api-key>
Instalando as dependências e executando os testes:
Para instalar as dependências necessárias basta executar:
npm install
E para executar os testes:
npm run test
Depois que os testes terminarem você consegue criar sua dashboard no DataDog utilizando as métricas geradas pelo teste indo em Dashboards > Novo Dashboard > New Timeboard > Add Graph > Timeseries e selecionar as métricas do Artillery.
Depois disso você terá uma dashboard como essa:
Se a sua aplicação já utiliza o DataDog para monitorar as aplicações você pode adicionar nessa mesma dashboard os gráficos de CPU, memória, log de erros e todas as outras métricas que o DataDog disponibiliza sobre a sua aplicação.
Conclusão:
Essa integração do Artillery + DataDog ajuda a visualizar as métricas do seu teste de performance em um único lugar e encontrar os possíveis gargalos monitorando os recursos da sua aplicação.
Referências:
Thanks pro Ramses Sacol que me apresentou essa integração ano passado :)