Adicionando percentil ao resultado de saída do K6📊
Marlo Henrique
Posted on January 22, 2024
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. 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:
Posted on January 22, 2024
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.