Grafana k6 - usando JS para testes de carga

mrmorales

Paulo Guilherme

Posted on August 22, 2022

Grafana k6 - usando JS para testes de carga

Atualmente uma das melhores maneiras de testar e simular o comportamento da sua API em mar aberto é com testes de carga.

Várias ferramentas estão disponíveis na nossa comunidade JMeter, Katalon, Postman são algumas das principais.

Vamos falar de uma ferramenta especial nesse artigo, ela é fácil, open source e muito simples de configurar.

Se até pro espaço nosso querido JavaScript já foi... Claro que vamos ter ele por aqui quando o assunto é teste de carga.

- Ladies and gentlemen i present you k6!


k6

logotipo k6

k6 é uma ferramenta open source desenvolvido pelo time do Grafana Labs, focada em realização de testes de carga orientado a objetivos.

Usando o k6, você pode testar a confiabilidade e o desempenho de seus sistemas e detectar regressões e problemas de desempenho mais cedo.

How it works

k6 trabalha com o conceito de usuários virtuais (VUs) que executam scripts. Eles são essencialmente loops while(true) paralelos.

Os scripts devem conter, no mínimo, uma função padrão exportada - isso define o ponto de entrada para suas VUs, semelhante à função main() em várias linguagens.

Para cada bateria de teste é necessário especificar quantos VUs serão utilizados além dos scripts que executaram as chamadas e suas regras.

  • scripts - escritos em JavaScript devem exportar uma função default que servirá como main para a bateria de testes.

  • VUs - ou virtual users são usuários gerados pelo k6 em tempo de execução que farão requisicões HTTP em looping durante todo o tempo da bateria de testes.

Key features

  • CLI com APIs amigáveis ​​ao desenvolvedor.
  • JavaScript ES2015/ES6 - com suporte para módulos locais e remotos
  • Checks e Thresholds - para testes de carga orientados para objetivos e fáceis de automatizar

Hands on

hackerman

Uma das características principais do k6 é que ele possui uma alta integração com diversos serviços de cloud e observability do mercado.

Para esse artigo vamos utilizar alguma delas, são elas:

  • Grafana Dashboards
  • Influx DB
  • Docker

recomendo fortemente a leitura da documentação oficial do k6 que além de muito abrangente é recheada de exemplos de demonstrações de utilização.

Let's code

arquitetura

A imagem acima demonstra como vamos estruturar nosso projeto, com a ajuda do Docker vamos preparar um ambiente que nos fornecerá toda a infraestrutura necessária e também recursos para a visualização dos resultados em tempo real.

Todo o código desenvolvido para esse artigo foi publicado em meu GitHub e poderá ser acessado nesse repositório.

O que vamos testar?

Durante esse artigo vamos fazer uma bateria de testes usando a API pública The Star Wars API como backend e simularemos alguns cenários usando o k6 e acompanharemos via dashboard todas as requisições realizadas e suas métricas publicadas.

app.js

import http from 'k6/http'
import { check, sleep } from 'k6'

/** 
 * etapas do nosso teste:
 * os primeiros 30 segundos teremos um aumento de 0 a 20 usuarios acessando a api
 * em seguida um periodo de 1m e 30s com o pico de 20 usuarios fazendo requisicoes em loop infinito
 * depois gradativamente os usuarios vao deixar de acessar a api de 20 até chegarem a 0 em 20 segundos
 * **/
export const options = {
    stages: [
        { duration: '30s', target: 20 },
        { duration: '1m30s', target: 20 },
        { duration: '20s', target: 0 },
    ],
}

export default function () {
    const id = Math.floor(Math.random() * 10) + 1
    const url = `http://swapi.dev/api/people/${id}`

    console.log(`calling [${url}]`)
    const response = http.get(url) //requisicao

    check(response, { "status is 200": (r) => r.status === 200 }) //validacao se ocorreu tudo certo
    sleep(1) //intervalo entre as chamadas
}
Enter fullscreen mode Exit fullscreen mode

nesse cenário estamos fazendo pouquíssimas requisições (em média é realizada aproximadamente 200 requisições em 2m 20s) mas em um cenário com mais de 200 VUs conseguimos chegar a 150 req/segundo e um total de aproximadamente 2000 em 5 minutos.

Fica o convite para fazer um teste mais parrudo e ver como o k6 se sai. 😎

para os demais arquivos de configuração do dashboard sugiro utilizar as métricas mais convenientes para o cenário especifico, nesse artigo acabei expondo todas.


Run

docker compose up -d influxdb grafana
Enter fullscreen mode Exit fullscreen mode

Vamos primeiro subir os contêineres que utilizaremos para a visualização dos resultados.

docker compose run k6
Enter fullscreen mode Exit fullscreen mode

Executando o run vamos começar a visualizar as primeiras chamadas sendo realizadas para a API.

gif its happening

Podemos visualizar em runtime a execução na url http://localhost:3000/d/k6/k6-load-testing-results

resultados do teste


Conclusão

Com certeza k6 é uma excelente ferramenta para testes de performance uma ótima opção para substituir o JMeter por exemplo.

Com uma série de integrações disponíveis e a facilidade de escrever cenários, regras e validações a etapa de testes de carga que normalmente é custosa e demorada consegue ser muito mais rápida e iterativa com o time.

Não pense que a utilização de JavaScript faz o k6 ter uma performance inferior aos demais, sua performance é excelente e ficará limitada apenas a hardware e conexão disponíveis com a opção até mesmo de ser executado em clusteres.

Com a possibilidade de escrevermos scripts com limites e regras de aceitação, além da possibilidade de gerarmos lógicas e manipulação de variáveis durante os testes fica bem difícil não querer experimentar um pouco dessa ferramenta.

Recomendo fortemente a utilização do k6 para testes de carga, stress e performance e recomendo também a leitura da documentação oficial.

💖 💪 🙅 🚩
mrmorales
Paulo Guilherme

Posted on August 22, 2022

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related