Teste de Performance, com o locust.io usando Docker
Recentemente para o lançamento de uma nova API, precisei fazer um teste de carga, mas nunca tinha feito um antes. Comecei a olhar e me deparei com o Locust.io (https://locust.io/).
Sou muito adepto do Docker, e comecei a ver como fazer o teste de carga usando a plataforma, para poder fazer os testes iniciais da minha própria máquina, de forma rápida e viável.
Cheguei aos scripts abaixo, claro suprimindo o domínio e os dois subdomínios que fiz o teste, por serem algo do trabalho.
locustfile.py
from locust import HttpLocust, TaskSet, task
from locust.log import setup_logging
import requestsclass PublicTaskSet(TaskSet):
@task(1)
def alternativa(self):
self.client.get()class PrivateTaskSet(TaskSet):
@task(1)
def recommendation(self):
self.client.get(‘/subdomain_2’, headers = {‘Authorization’: ‘Bearer 1b36a0531234bf250529d5f’})
class WebsiteTasks(TaskSet):
tasks = {
PublicTaskSet: 20,
PrivateTaskSet: 10,
}class BasicTasks(HttpLocust):
task_set = WebsiteTasks
min_wait = 5000
max_wait = 10000
docker-compose.yml
version: “3”
services:
locust-master:
image: swernst/locusts
volumes:
— ./scripts:/scripts
ports:
— “8089:8089”locust-worker:
image: swernst/locusts
command: “ — master-host=locust-master”
volumes:
— ./scripts:/scripts
locust.config.json
{
“target”: “https://api-domain",
“locusts”: [“BasicTasks”]
}
Faça as alterações necessárias aos domínios e subdomínios que for usar. Maiores informações estão na documentação do projeto.
Executar:
docker-compose up — scale locust-worker=1
O meu arquivo "locustfile.py" e "locust.config.json" estão dentro do diretório "/scripts" que utilizo no volume para poder alterar o código dentro container.
Isso agiliza o teste se precisar alterar a URL ou token, etc … alterações no meu código refletem dentro do container.
A interface é bem amigável e proporciona um teste rápido para verificar o andamento dos requests por segundo e do response time da API.
O teste inicial eu comecei a fazer da minha própria máquina, porém o teste de fato não foi feito dela, visto que a quantidade de request definidos como threshold para essa API, o meu hardware não aguentaria abrir tantas threads simultâneas, então foi usado esse mesmo projeto/script em uma farm de servidores.
Deixo aqui os meus agradecimentos aos idealizadores do projeto.
Me surpreendi com o resultado e com a simplicidade com que pode ser útil.