Graphql test serveral stages and every stage have multiple request

three stages:
stage1:{ duration: ‘1m’, vus: 100 }
stage:2{ duration: ‘1m’, vus: 200 }
stage3: { duration: ‘1m’, vus: 300 }
and every stage have multiple post requests use graphql query
footballquery1 = query football{...}
footballquery2= query football2{...}
racingquery1=query racingquery{...}
racingquery2=query racingquery2{...}

footballquery1 and footballquery2 are same categories
racingquery1 and racingquery2 are same categories

stage1,stage2,stage3 just different vus, but they must do those four post graphqlqueries: footballquery1 , footballquery2, racingquery1, racingquery4

i want to ouput those
stage1 average response time | rate of response time < 6s | error rate(404/500) | request/sec
football
racing

stage2 average response time | rate of response time < 6s | error rate(404/500) | request/sec
football
racing

stage3 average response time | rate of response time < 6s | error rate(404/500) | request/sec
football
racing

I’m a k6 newer and I read k6 tutorials, still can’t solve this problem, please help me, thanks a lot

Hi @solaris !

Welcome to the community forums! :wave:

I think the most proper way of solving your need is using End-of-test summary.

However, you achieve something similar to your needs by using the thresholds and tags.

So the following script:

import http from "k6/http";
import { sleep } from "k6";
import { tagWithCurrentStageIndex } from 'https://jslib.k6.io/k6-utils/1.3.0/index.js';

export let options = {
    stages: [
        { target: 5, duration: "5s"},
        { target: 5, duration: "5s"},
        { target: 15, duration: "5s"},
    ],
    thresholds: {
      'http_req_duration{stage:0,sport:football}': ['avg < 200'],
      'http_req_duration{stage:0,sport:racing}': ['avg < 200'],
      'http_reqs{stage:0,sport:football}': ['count>0'],
      'http_reqs{stage:0,sport:racing}': ['count>0'],
      'http_reqs{stage:1,sport:football}': ['count>0'],
      'http_reqs{stage:1,sport:racing}': ['count>0'],
      'http_reqs{stage:2,sport:football}': ['count>0'],
      'http_reqs{stage:2,sport:racing}': ['count>0'],
    }    
};

export default function() {
   tagWithCurrentStageIndex();

   
   http.get("https://test.k6.io/", {
      tags: {sport: "football"}
   })

   http.get("https://test.k6.io/", {
      tags: {sport: "racing"}
   })

   http.get("https://test.k6.io/", {
      tags: {sport: "racing"}
   })
    
   sleep(1);
}

can produce output like:

Let me know if that answers,
Cheers!

thanks for your answer a lot.
I just add some custom metrics, group my post request and config my thresholds
is “post” method add tags to my graphql query post like “get” method.

 group("football", () => {
    const footballResponse = http.post(
      API_BASE_URL,
      JSON.stringify(footballSubgraphqlQuery),
      { headers, tags: { sport: "football"} },
    );
    footballLessThan6sRate.add(footballResponse.timings.duration < 3600);
    footballErrorRate.add(
      footballResponse.status === 500 || footballResponse.status === 404
    );
    footballRequestPerSecond.add(1/60)
  });

Yes, it should, like any other HTTP request.