Adicionando percentil ao resultado de saída do K6📊
Tags: k6, testing, grafana, performance
Published: 2024-01-22 23:48:52

Quando decidimos realizar testes de performance para avaliar o desempenho de nossa aplicação, um dos pontos a ser definidos quando estamos a fase de definição de métricas e criação de limites são os percentis a serem avaliados.

Um percentil é uma medida estatística que indica a posição relativa de um valor, dentro de um conjunto de dados ordenados.

Por exemplo, se o tempo de resposta de uma API para o percentil de 80% é de 50 segundos, significa que 80% das requisições tiveram um tempo igual ou menor a 50 segundos.

Nesse artigo, aprenderemos como podemos adicionar mais percentis ao resultado de saída do K6.

## Resultados de saida do K6🖨️

Ao analisarmos os percentis apresentados pelo K6 na saída do console, notamos que a ferramenta exibe resultados apenas para os percentis de 90% e 95%.

```
data_received..................: 8.0 kB 2.1 kB/s
     data_sent......................: 708 B  187 B/s
     http_req_blocked...............: avg=123.42ms min=0s      med=0s       max=370.26ms p(90)=296.21ms p(95)=333.23ms
     http_req_connecting............: avg=32.73ms  min=0s      med=0s       max=98.21ms  p(90)=78.57ms  p(95)=88.39ms
     http_req_duration..............: avg=132.55ms min=106.9ms med=116.76ms max=173.97ms p(90)=162.53ms p(95)=168.25ms
       { expected_response:true }...: avg=132.55ms min=106.9ms med=116.76ms max=173.97ms p(90)=162.53ms p(95)=168.25ms
     http_req_failed................: 0.00%  ✓ 0        ✗ 3
     http_req_receiving.............: avg=0s       min=0s      med=0s       max=0s       p(90)=0s       p(95)=0s
     http_req_sending...............: avg=0s       min=0s      med=0s       max=0s       p(90)=0s       p(95)=0s
     http_req_tls_handshaking.......: avg=49.21ms  min=0s      med=0s       max=147.64ms p(90)=118.11ms p(95)=132.87ms
     http_req_waiting...............: avg=132.55ms min=106.9ms med=116.76ms max=173.97ms p(90)=162.53ms p(95)=168.25ms
     http_reqs......................: 3      0.790669/s
     iteration_duration.............: avg=1.26s    min=1.11s   med=1.17s    max=1.49s    p(90)=1.43s    p(95)=1.46s
     iterations.....................: 3      0.790669/s
     vus............................: 1      min=1      max=1
     vus_max........................: 1      min=1      max=1
```
Em algumas métricas, a avaliação de percentis mais elevados ou mais baixos pode ser necessária, como exemplificado no artigo [Entendendo as métricas do K6 - Parte 3](https://dev.to/marlo2222/entendendo-as-metricas-do-k6-parte-3-m1g). No contexto das métricas _web do Core Web Vitals_, por exemplo, o critério de avaliação adotado foi o percentil de 75%.

# Adicionando novos percentis🧮

A inclusão de novos percentis é realizada por meio da adição da flag summaryTrendStats, proporcionando a personalização das informações de saída, tanto através da linha de comando (CLI) quanto configurando no escopo de options do nosso script.

A título de demonstração, utilizaremos o seguinte script:: 

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

export const options = {
    vus: 1,
    duration: '3s',
}

export default function(){
    const BASE_URL = 'https://test-api.k6.io/public/crocodiles/';

    const res = http.get(BASE_URL);

    sleep(1);
}
```


Para incorporar novos percentis aos resultados de saída por meio da CLI, basta adicionar a flag _--summary-trend-stats_, seguida das métricas desejadas para exibição no resultado final. No comando a seguir, solicitaremos que o k6 gere métricas para média (med), mínimo (min), máximo (max), além dos percentis de 70%, 80%, 90% e 99.99%.

`k6 run --summary-trend-stats="min,med,max,p(70),p(80),p(90), p(99.99)" teste.js`

```
 http_req_blocked...............: min=0s       med=0s       max=298.58ms p(70)=119.43ms p(80)=179.15ms p(90)=238.87ms p(99.99)=298.52ms
     http_req_connecting............: min=0s       med=0s       max=103.81ms p(70)=41.52ms  p(80)=62.28ms  p(90)=83.04ms  p(99.99)=103.79ms
     http_req_duration..............: min=108.17ms med=190.32ms max=234.47ms p(70)=207.98ms p(80)=216.81ms p(90)=225.64ms p(99.99)=234.46ms
       { expected_response:true }...: min=108.17ms med=190.32ms max=234.47ms p(70)=207.98ms p(80)=216.81ms p(90)=225.64ms p(99.99)=234.46ms
     http_req_failed................: 0.00%  ✓ 0        ✗ 3
     http_req_receiving.............: min=0s       med=0s       max=2.07ms   p(70)=830.39µs p(80)=1.24ms   p(90)=1.66ms   p(99.99)=2.07ms
     http_req_sending...............: min=0s       med=0s       max=0s       p(70)=0s       p(80)=0s       p(90)=0s       p(99.99)=0s
     http_req_tls_handshaking.......: min=0s       med=0s       max=125.19ms p(70)=50.07ms  p(80)=75.11ms  p(90)=100.15ms p(99.99)=125.16ms
     http_req_waiting...............: min=108.17ms med=188.25ms max=234.47ms p(70)=206.73ms p(80)=215.98ms p(90)=225.22ms p(99.99)=234.46ms
     http_reqs......................: 3      0.778617/s
     iteration_duration.............: min=1.2s     med=1.23s    max=1.41s    p(70)=1.3s     p(80)=1.34s    p(90)=1.37s    p(99.99)=1.41s
```

Quanto à inclusão dos mesmos percentis no resultado através da adição de uma configuração ao escopo de options do seu script, é necessario incorporar a propriedade summaryTrendStats. Ao modificar nosso script de exemplo, a fase de configuração ficará da seguinte maneira:

```
export const options = {
    vus: 1,
    duration: '3s',
summaryTrendStats: ["med","min", "max", "p(70)", "p(80)", "p(90)" "p(99.99)"]
}
```

> Durante a execução, ao incorporar a configuração nas opções do seu script, é possível realizar a execução sem a necessidade de flags adicionais na CLI, bastando utilizar o comando `k6 run teste.js`.

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

  execution: local
     script: percentis.js
     output: -

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


     data_received..................: 8.0 kB 2.2 kB/s
     data_sent......................: 708 B  195 B/s
     http_req_blocked...............: min=0s       med=0s       max=262.21ms p(70)=104.88ms p(80)=157.32ms p(90)=209.77ms p(99.99)=262.16ms
     http_req_connecting............: min=0s       med=0s       max=102.59ms p(70)=41.03ms  p(80)=61.55ms  p(90)=82.07ms  p(99.99)=102.57ms
     http_req_duration..............: min=112.49ms med=117.03ms max=120.7ms  p(70)=118.5ms  p(80)=119.23ms p(90)=119.96ms p(99.99)=120.7ms
       { expected_response:true }...: min=112.49ms med=117.03ms max=120.7ms  p(70)=118.5ms  p(80)=119.23ms p(90)=119.96ms p(99.99)=120.7ms
     http_req_failed................: 0.00%  ✓ 0       ✗ 3
     http_req_receiving.............: min=0s       med=245.4µs  max=3.2ms    p(70)=1.42ms   p(80)=2.02ms   p(90)=2.61ms   p(99.99)=3.2ms
     http_req_sending...............: min=0s       med=0s       max=0s       p(70)=0s       p(80)=0s       p(90)=0s       p(99.99)=0s
     http_req_tls_handshaking.......: min=0s       med=0s       max=152.1ms  p(70)=60.84ms  p(80)=91.26ms  p(90)=121.68ms p(99.99)=152.07ms
     http_req_waiting...............: min=112.25ms med=117.03ms max=117.49ms p(70)=117.21ms p(80)=117.31ms p(90)=117.4ms  p(99.99)=117.49ms
     http_reqs......................: 3      0.82531/s
     iteration_duration.............: min=1.11s    med=1.13s    max=1.38s    p(70)=1.23s    p(80)=1.28s    p(90)=1.33s    p(99.99)=1.38s
     iterations.....................: 3      0.82531/s
     vus............................: 1      min=1     max=1
     vus_max........................: 1      min=1     max=1
```
É importante ressaltar que ao utilizar a flag _--summary-trend-stats_ ou configurar o _summaryTrendStats_, a saída resultante exibirá exclusivamente as estatísticas especificadas por você. Por exemplo, ao executar `k6 run --summary-trend stats="min"`, serão apresentadas apenas as estatísticas mínimas para todas as métricas do seu teste.

## Conclusão💖
Conforme visto, os resultados de saída e as estatísticas associadas a cada métrica no K6 podem ser facilmente configurados de acordo com os critérios que o usuário deseja avaliar. Essa flexibilidade permite uma adaptação personalizada, possibilitando uma análise mais precisa e alinhada às necessidades específicas do usuário

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