Executando testes de performance com Grafana Cloud K6
Tags: testing, performance, go, cloud
Published: 2023-09-10 19:14:45

Ao abordarmos a realização de testes de performance, é essencial considerar a execução desses testes em ambientes de nuvem, utilizando serviços renomados, como AWS CodeBuild, Azure DevOps e outros serviços SaaS oferecidos pelos principais serviços de cloud. Entre os principais benefícios que podem ser destacados nesse contexto, incluem-se:

- Escalabilidade.
- Flexibilidade geográfica.
- Redução de custos.
- Confiança nos resultados.

O conceito de **_Performance Testing as a Service_** tem ganhado popularidade. Essas são plataformas dedicadas principalmente a fornecer serviços para a realização de testes de performance, simplificando a execução em várias zonas, com cargas de trabalho intensas e disponibilizando um conjunto abrangente de ferramentas para monitorar a execução e os resultados obtidos.

Neste artigo, exploraremos o Grafana Cloud K6 e discutiremos por que você deve conhecer essa poderosa ferramenta.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7w4oxgjaj13g8e89qxh0.png)

## Adeus K6 Cloud. Bem vindo Grafana Cloud K6✨

O k6 Cloud é um produto SaaS criado pela equipe do K6 para ser o companheiro perfeito. Ele trouxe facilidade de uso, bem como gerenciamento de equipe e recursos de continuos testing para seus projetos de teste de performance.

> A partir do lançamento do Grafana Cloud K6, não estão sendo aceitas novas inscrições no K6 Cloud. Os usuários existentes do K6 Cloud continuarão a utilizá-lo sem interrupções. Além disso, está sendo planejada a migração do K6 Cloud para o Grafana Cloud K6 em uma data posterior. 

O Grafana Cloud K6 é uma solução que visa da suporte a grande maioria dos recursos oferecidos pela k6 cloud, enquanto  se beneficia dos recursos da plataforma Grafana Cloud para Visualização de dados e Observability.

Com a aquisição pela Grafana labs do K6 em meados de 2021, iniciou-se um processo de unificação de serviços.

## Benefícios do Grafana Cloud K6🏆

Um dos principais benefícios a serem destacados ao optar pelo Grafana K6 Cloud é a oferta de um plano gratuito para os usuários.

Ao criar uma conta, os usuários têm acesso a um plano free que inclui horas de execução de VUs (Usuários Virtuais) K6 mensais, sem nenhum custo. Além disso, o plano gratuito oferece outros benefícios relacionados aos serviços do Grafana Cloud. 

Essa disponibilidade de recursos gratuitos torna o Grafana K6 Cloud uma opção acessível e atraente para aqueles que desejam iniciar ou aprimorar seus testes de performance.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/89k9dsdtob03r4mtwpwq.png)

Além disso, outra vantagem notável é possibilidade de executar testes de carga na nuvem com até 1 milhão de usuários virtuais simultâneos ou 5 milhões de solicitações/segundo, com a possibilidade de distribuição em 21 localizações geográficas para os planos Cloud Pro e Cloud Advanced.

No entanto, o aspecto que mais se destaca, é a capacidade de ter testes de desempenho e observabilidade integrados em uma única plataforma. 

A capacidade de incorporar as visualizações do K6 aos seus painéis já existentes no Grafana e correlacionar os resultados dos testes de desempenho com métricas, logs e rastreamentos do servidor é verdadeiramente a cereja do bolo. 

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/522jn22p7t5hwbesny4z.png)

Isso proporciona uma abordagem completa e holística para analisar o desempenho do seu sistema, permitindo que você identifique rapidamente as principais causas de problemas e tome medidas corretivas de forma eficiente. 

## Execução via Grafana K6 Cloud💻

### Pré-requisitos📑
- [K6 instalado](https://k6.io/docs/get-started/installation/)
- [Conta free Grafana Cloud](https://grafana.com/auth/sign-up/create-user?pg=k6-cloud&plcmt=free&cta=create-free-account&redirectPath=k6)

### Script utilizando📃
Nesta etapa prática faremos modificações em um script de teste de performance, que requer a adição de configuração para a execução via Grafana Cloud K6.

O exemplo de script que será utilizado é o seguinte:

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

export const options = {
    stages: [
        { duration: '10s', target: 10 }, 
        { duration: '10s', target: 10 },
        { duration: '10s', target: 0 } 
    ],
    thresholds: {
        checks: ['rate > 0.95'],
        http_req_duration: ['p(95) < 200']
    }
}

export default function(){

    const BASE_URL = 'https://test-api.k6.io/public/crocodiles';
    const res = http.get(BASE_URL)
    
    check(res,{
        'status 200': (r) => r.status === 200
    });
    sleep(1);
}
```
### Obtendo token de acesso🔐

Uma vez autenticado na Grafana Cloud, acesse **Start Testing** para K6:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ei8rkee11jgp6bd7fzei.png)

Você será redirecionado para a página de testes de performance do seu usuário. Um projeto padrão é automaticamente criado para sua conta, porém você tem a flexibilidade de criar outros projetos de acordo com suas necessidades.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ar9qnjw0t6w3unzc35kw.png)
> O id do projeto pode ser encontrado quando você clicar no nome do projeto.

O token necessário para execução via Grafana Cloud K6 pode ser obtido na opção **Settings**:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/g4v4e9dp8ky8hpbuhkvr.png)

### Executando nosso script😃

Antes de executar o seu script, é necessário autenticar-se no Grafana Cloud K6. Para fazer isso, copie o token gerado na etapa anterior, e em qualquer CLI da sua escolha, utilize o seguinte comando:

```
k6 login cloud --token <TOKEN>
```

> Nesse tutorial, estamos utilizando o git bash.

Além disso, é necessário adicionar ao escopo de configuração algumas propriedades que façam referência ao projeto que será executado. Vamos modificar o bloco options do nosso script da seguinte forma:

```
export const options = {
    stages: [
        { duration: '10s', target: 10 }, 
        { duration: '10s', target: 10 },
        { duration: '10s', target: 0 } 
    ],
    thresholds: {
        checks: ['rate > 0.95'],
        http_req_duration: ['p(95) < 200']
    },
    ext: {
        loadimpact: {
            projectID: '3633734',
            name: 'Exemplo de execução',
        }
    }
}
```
Por fim, podemos executar nosso script via cloud utilizando o seguinte comando: 

```
k6 cloud script.js
```

No console você recebera uma saída semelhante a seguinte:

```

          /\      |‾‾| /‾‾/   /‾‾/
     /\  /  \     |  |/  /   /  /
    /  \/    \    |     (   /   ‾‾\
   /          \   |  |\  \ |  (‾)  |
  / __________ \  |__| \__\ \_____/ .io

  execution: cloud
     script: script.js
     output: https://marlo2222.grafana.net/a/k6-app/runs/1922864

  scenarios: (100.00%) 1 scenario, 10 max VUs, 1m0s max duration (incl. graceful stop):
           * default: Up to 10 looping VUs for 30s over 3 stages (gracefulRampDown: 30s, gracefulStop: 30s)

     test status: Finished

Run    [======================================] Finished

Run    [======================================] Finished

```

> Observe que a **execution** é destacada como via cloud, e um link de acesso ao **output** de execução está disponível, nele os dados de execução estarão disponíveis.

Acessando o relatório de execução, podemos ter acesso as métricas coletadas pela execução:

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nmgt6qndrqzuqv7qtxft.png)

### Execução local, com métricas em cloud😲

Uma outra possibilidade que a Grafana Cloud K6 nos proporciona, é a capacidade de executar nosso script localmente e enviar as métricas resultantes para o nosso projeto na nuvem no Grafana Cloud.

Para realizar isso, basta executar o seguinte comando na sua CLI:

```
k6 run --out cloud script.js
```

Como saída você terá todos as métricas que o K6 já disponibiliza no output da CLI:

```

          /\      |‾‾| /‾‾/   /‾‾/
     /\  /  \     |  |/  /   /  /
    /  \/    \    |     (   /   ‾‾\
   /          \   |  |\  \ |  (‾)  |
  / __________ \  |__| \__\ \_____/ .io

  execution: local
     script: script.js
     output: cloud (https://marlo2222.grafana.net/a/k6-app/runs/1922875)

  scenarios: (100.00%) 1 scenario, 10 max VUs, 1m0s max duration (incl. graceful stop):
           * default: Up to 10 looping VUs for 30s over 3 stages (gracefulRampDown: 30s, gracefulStop: 30s)


     ✓ status 200

   ✓ checks.........................: 100.00% ✓ 168       ✗ 0
     data_received..................: 235 kB  7.8 kB/s
     data_sent......................: 52 kB   1.7 kB/s
     http_req_blocked...............: avg=7.05ms   min=0s       med=0s       max=281.88ms p(90)=0s       p(95)=0s
     http_req_connecting............: avg=3.43ms   min=0s       med=0s       max=134.81ms p(90)=0s       p(95)=0s
   ✓ http_req_duration..............: avg=121.31ms min=109.75ms med=120.41ms max=227.33ms p(90)=129.66ms p(95)=136.04ms
       { expected_response:true }...: avg=121.31ms min=109.75ms med=120.41ms max=227.33ms p(90)=129.66ms p(95)=136.04ms
     http_req_failed................: 0.00%   ✓ 0         ✗ 336
     http_req_receiving.............: avg=21.66µs  min=0s       med=0s       max=1.01ms   p(90)=34.35µs  p(95)=66.59µs
     http_req_sending...............: avg=10.65µs  min=0s       med=0s       max=766.1µs  p(90)=0s       p(95)=63.72µs
     http_req_tls_handshaking.......: avg=3.44ms   min=0s       med=0s       max=134.52ms p(90)=0s       p(95)=0s
     http_req_waiting...............: avg=121.27ms min=109.6ms  med=120.34ms max=227.33ms p(90)=129.66ms p(95)=135.95ms
     http_reqs......................: 336     11.164001/s
     iteration_duration.............: avg=1.26s    min=1.23s    med=1.24s    max=1.55s    p(90)=1.28s    p(95)=1.46s
     iterations.....................: 168     5.582/s
     vus............................: 2       min=1       max=10
     vus_max........................: 10      min=10      max=10


running (0m30.1s), 00/10 VUs, 168 complete and 0 interrupted iterations
default ✓ [======================================] 00/10 VUs  30s

```
Mas ao acessar seu link de output da execução ou o próprio projeto na grafana cloud, você terá acesso as métricas coletadas:


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qc4z0n5f9pkiuzgnbzek.png)

> Observe que a execução local para o mesmo cenário apresentou menor vazão(RPS) de requisições bem como um maior response time para o p(95), sendo quase 6 vezes maior. 

## Conclusão💖

Como evidenciamos anteriormente, o processo de integração entre K6 e Grafana Cloud K6 é descomplicado e traz consigo inúmeras vantagens, sendo a maior confiabilidade nas métricas obtidas uma das mais significativas.😄

Vale ressaltar, também, o período de uso gratuito mensal, no qual as horas disponibilizadas podem ser de extrema utilidade em provas de conceito, permitindo validar a confiabilidade dos dados coletados e demonstrar os benefícios de adotar um ambiente de Performance Testing as a Service.📚

Gostou do conteúdo e quer saber mais sobre testes de performance com K6? Então não deixe de conferir meu curso na Udemy:

- [Teste de performance com K6](https://www.udemy.com/course/teste-de-performance-com-k6/?referralCode=95CCD8BC9F22A2A96BDA) ✨