DEV Community

Cover image for Adicionando percentil ao resultado de saída do K6📊
Marlo Henrique
Marlo Henrique

Posted on

Adicionando percentil ao resultado de saída do K6📊

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
Enter fullscreen mode Exit fullscreen mode

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. 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);
}
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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)"]
}
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

É 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:

Image of Timescale

Timescale – the developer's data platform for modern apps, built on PostgreSQL

Timescale Cloud is PostgreSQL optimized for speed, scale, and performance. Over 3 million IoT, AI, crypto, and dev tool apps are powered by Timescale. Try it free today! No credit card required.

Try free

Top comments (0)

Billboard image

The Next Generation Developer Platform

Coherence is the first Platform-as-a-Service you can control. Unlike "black-box" platforms that are opinionated about the infra you can deploy, Coherence is powered by CNC, the open-source IaC framework, which offers limitless customization.

Learn more

👋 Kindness is contagious

Discover a treasure trove of wisdom within this insightful piece, highly respected in the nurturing DEV Community enviroment. Developers, whether novice or expert, are encouraged to participate and add to our shared knowledge basin.

A simple "thank you" can illuminate someone's day. Express your appreciation in the comments section!

On DEV, sharing ideas smoothens our journey and strengthens our community ties. Learn something useful? Offering a quick thanks to the author is deeply appreciated.

Okay