Entendendo as métricas do K6 - Parte 1
Tags: k6, go, testing, performance
Published: 2023-10-12 00:02:17

Um dos principais objetivos quando realizamos um teste de performance é obter indicadores e métricas que permitam avaliarmos o desempenho de nossa aplicação.

No entanto, muito além de obter as métricas, precisamos entender as métricas geradas e reportadas pela CLI ou outra ferramenta de visualização.

Nesse artigo entenderemos na pratica o  significado de cada uma das métricas default geradas pelo K6.

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

## Tipo de métricas coletadas📋
O K6 realiza a coleta de métricas em diferentes camadas, sempre respeitando as chamadas métricas integradas padrões, que por default sempre são coletadas pela ferramenta, e agregando novas métricas conforme pontos como: protocolo utilizado, camada da aplicação analisada.

Importante sempre salientar que todas as métricas coletadas pelo k6, se enquadram em 4 tipo de métricas:  
- Contadores/Counters: somam valores.
- Medidores/Gauges: rastreiam os valores menores, maiores e mais recentes.
- Taxas/Rates: rastreiam a frequência com que um valor diferente de zero ocorre.
- Tendência: calcula estatísticas para vários valores como: média, moda ou percentil.

```

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

  execution: local
     script: .\parte_1.js
     output: -

  scenarios: (100.00%) 1 scenario, 5 max VUs, 40s max duration (incl. graceful stop):
           * default: 5 looping VUs for 10s (gracefulStop: 30s)


     data_received........: 0 B 0 B/s
     data_sent............: 0 B 0 B/s
     iteration_duration...: avg=1s min=1s med=1s max=1.01s p(90)=1s p(95)=1.01s
     iterations...........: 50  4.961148/s
     vus..................: 5   min=5      max=5
     vus_max..............: 5   min=5      max=5
```

## Métricas integradas padrão📊
Independente do protocolo que seja utilizado para o teste, o K6 sempre coletara as seguintes métricas padrões: 

<table>
  <tr>
    <th>Métrica</th>
    <th>Tipo</th>
    <th>Descrição</th>
  </tr>

  <tr>
    <td>vus_max</td>
    <td>Medidor</td>
    <td>Número máximo possível de usuários virtuais</td>
  </tr>
 <tr>
    <td>iteration</td>
    <td>Contador</td>
    <td>O número agregado de vezes que as VUs executaram o script JS</td>
  </tr>
<tr>
    <td>iteration_duration</td>
    <td>Tendência</td>
    <td>O tempo para completar uma iteração completa, incluindo o tempo gasto nas etapas de configuração e desmontagem</td>
  </tr>
<tr>
    <td>dropped_iterations</td>
    <td>Contador</td>
    <td>O número de iterações que não foram iniciadas devido à falta de VUs ou falta de tempo</td>
  </tr>
<tr>
    <td>data_received</td>
    <td>Contador</td>
    <td>A quantidade de dados recebidos durante as iterações</td>
  </tr>
<tr>
    <td>data_sent</td>
    <td>Contador</td>
    <td>A quantidade de dados enviados</td>
  </tr>
<tr>
    <td>checks</td>
    <td>Contador</td>
    <td>A taxa de verificações bem-sucedidas</td>
  </tr>
</table>

Entre as métrica citadas acima, uma das principais duvidas costuma ser em relação as **iteraçãos**. 

Basicamente, uma iteração corresponde a cada execução do seu script, e sempre é executada por um usuário virtual(VU). Uma iteração pode produzir resultados diferentes e levar um tempo diferente dependendo do desempenho do script que foi criado.

Observe o script abaixo:

```
import {sleep} from 'k6';

export const options = {
    vus:5,
    duration: '10s',
    preAllocatedVUs: 5,
}

export default function(){
    const BASE_URL = 'https://test-api.k6.io/public/crocodiles';
    sleep(1);
}
```
Quando examinamos a fase de configuração, podemos observar que nosso script tem uma duração máxima de 10 segundos e é executado por 5 VUs. 

Ao controlar o intervalo entre as execuções de cada VU com um intervalo de sleep de 1 segundo e assegurar que todas as VUs estejam devidamente alocadas e disponíveis, podemos chegar a um resultado simplificado:

<table>
  <tr>
    <th>momento</th>
    <th>vus</th>
    <th>tempo</th>
    <th>iterações</th>
  </tr>
  <tr>
    <td>0</td>
    <td>0</td>
    <td>0s</td>
    <td>0</td>
  </tr>
<tr>
    <td>1</td>
    <td>5</td>
    <td>1s</td>
    <td>5</td>
  </tr><tr>
    <td>2</td>
    <td>5</td>
    <td>2s</td>
    <td>10</td>
  </tr><tr>
    <td>3</td>
    <td>5</td>
    <td>3s</td>
    <td>15</td>
  </tr><tr>
    <td>4</td>
    <td>5</td>
    <td>4s</td>
    <td>20</td>
  </tr><tr>
    <td>5</td>
    <td>5</td>
    <td>5s</td>
    <td>25</td>
  </tr><tr>
    <td>6</td>
    <td>5</td>
    <td>6s</td>
    <td>30</td>
  </tr><tr>
    <td>7</td>
    <td>5</td>
    <td>7s</td>
    <td>35</td>
  </tr><tr>
    <td>8</td>
    <td>5</td>
    <td>8s</td>
    <td>40</td>
  </tr><tr>
    <td>9</td>
    <td>5</td>
    <td>9s</td>
    <td>45</td>
  </tr><tr>
    <td>10</td>
    <td>5</td>
    <td>10s</td>
    <td>50</td>
  </tr>
</table>

Vale destacar um ponto sobre as iterações, Você pode controlar a quantidade de requisições que serão realizadas na fase de execução utilizando a propriedade **_iterations_** no escopo de configuração. Por exemplo, se deseja que seu teste seja encerrado após 25 iterações, você pode definir a propriedade iterations: 25.

## Conclusão💖

Como podemos observar o K6 já nos fornece uma serie de métricas default extremamente relevantes para o cotidiano.

Está é uma serie de publicações buscando trazer para vocês as principais métricas do K6. Na sequência, abordaremos as métricas HTTP que são geradas pelo k6. 

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) ✨