Matt
Matt

Reputation: 1043

K6 Load Testing - I am completely baffled by the stats that are printed at the end

Here is my very simple K6 script that I am running:

import {group } from "k6";
import { Trend} from "k6/metrics";
let response = null;
let loginTime = new Trend('login_time');
import http from "k6/http";

export let options = {
  stages: [
        {iterations: 1}
  ]
};

export default function(){

  group("Log In", function(){
    let url = "myurl";
    let headers = {
          headers: {
            "accept": "*/*",
            "accept-encoding": "gzip, deflate, br",
            "connection": "keep-alive"
          }
    };
    
    response = http.get(url,headers);

    loginTime.add(response.timings.duration);
    console.log("The duration for this request was:" + response.timings.duration);
})
};

The script just sends one request and runs for one interation and I save the duration of this request to a Trend called 'login_time'.

The stats that K6 prints at the end are as follows:

data_received..............: 29 kB  9.0 kB/s
    data_sent..................: 3.4 kB 1.1 kB/s
    group_duration.............: avg=3.15s      min=3.15s      med=3.15s      max=3.15s      p(90)=3.15s      p(95)=3.15s
    http_req_blocked...........: avg=414.88ms   min=2µs        med=291.79ms   max=1.31s      p(90)=976.28ms   p(95)=1.14s
    http_req_connecting........: avg=17.55ms    min=0s         med=25.97ms    max=31.96ms    p(90)=31.1ms     p(95)=31.53ms
    http_req_duration..........: avg=216.66ms   min=29.72ms    med=231.06ms   max=478.72ms   p(90)=407.62ms   p(95)=443.17ms
    http_req_receiving.........: avg=407.68µs   min=119.9µs    med=205.8µs    max=1.33ms     p(90)=892.84µs   p(95)=1.11ms
    http_req_sending...........: avg=74.86µs    min=12.4µs     med=76.8µs     max=170.2µs    p(90)=142.79µs   p(95)=156.49µs
    http_req_tls_handshaking...: avg=102.44ms   min=0s         med=73.61ms    max=315.35ms   p(90)=238.5ms    p(95)=276.93ms
    http_req_waiting...........: avg=216.18ms   min=29.59ms    med=230.68ms   max=477.3ms    p(90)=406.68ms   p(95)=441.99ms
    http_reqs..................: 5      1.563597/s
    iteration_duration.........: avg=3.15s      min=3.15s      med=3.15s      max=3.15s      p(90)=3.15s      p(95)=3.15s
    iterations.................: 1      0.312719/s
    login_time.................: avg=478.721924 min=478.721924 med=478.721924 max=478.721924 p(90)=478.721924 p(95)=478.721924
    vus........................: 1      min=1 max=1
    vus_max....................: 1      min=1 max=1

As you can see all the stats for my custom Trend 'login_time' show the same number 478.721924.

'login_time' is recording the 'response.timings.duration' - duration here is supposed to be 'http_req_duration'.

So I would expect the stats on the 'http_req_duration' row to be exactly the same as the 'login_time' stats i.e. all show 478.721924.

Instead the stats on the 'http_req_duration' row are completely different and all show different numbers even though only 1 iteration was ran so they should all be the same. (Only the 'max' values shows 478.72).

As only 1 iteration was ran - the data in each column for each row should be the same.

So my question is, can I trust any of these numbers and if so which ones?

Also, I want to report how long login took - is this just the http_req_duration value or do I have to include other values like http_req_blocked....or is that just waiting for K6 getting ready to send the request?

Upvotes: 0

Views: 2348

Answers (1)

It looks like you are doing multiple requests, probably because you have redirects, common in login scenarios.

This is why http_req_* metrics have multiple values because http_reqs(the number of requests done) is 5. So you have 5 sets of the http_req_*.

http_req_duration is the sum of all others so this is most probably what you want, and you can read about the others in the documentation, but in general, if you need them you will know ;).

But res.timings has only the last response timings, so you might need to time it with Date as in

var start = Date.now();
// do something
var took = Date.now() - start;

Or you can use a group around the request and its duration.

Upvotes: 1

Related Questions