From a42a4249d43ea3c11c5b0e29b3b6636b308e4efb Mon Sep 17 00:00:00 2001 From: ismiljanic Date: Tue, 2 Dec 2025 19:42:41 +0100 Subject: [PATCH 1/5] Update container names for grafana and prometheus --- docker-compose.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docker-compose.yml b/docker-compose.yml index 49834b5..3f5a7bb 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -91,6 +91,7 @@ services: - backend prometheus: + container_name: prometheus image: prom/prometheus:latest volumes: - ./monitoring/prometheus.yml:/etc/prometheus/prometheus.yml @@ -100,6 +101,7 @@ services: - backend grafana: + container_name: grafana image: grafana/grafana:latest environment: GF_SECURITY_ADMIN_USER: admin From 4df08b88dfc6957234310e7c7701527bafcb18e4 Mon Sep 17 00:00:00 2001 From: ismiljanic Date: Sun, 7 Dec 2025 18:51:50 +0100 Subject: [PATCH 2/5] Update yml files: - Add pushgateway in docker-compose.yml and update prometheus command section - Add remote_write in prometheus.yml file and pushgateway for proper Grafana metrics display --- docker-compose.yml | 9 +++++++++ monitoring/prometheus.yml | 9 ++++++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index 3f5a7bb..e9b5461 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -93,6 +93,9 @@ services: prometheus: container_name: prometheus image: prom/prometheus:latest + command: + - '--config.file=/etc/prometheus/prometheus.yml' + - '--web.enable-remote-write-receiver' volumes: - ./monitoring/prometheus.yml:/etc/prometheus/prometheus.yml ports: @@ -115,6 +118,12 @@ services: volumes: - grafana-data:/var/lib/grafana + pushgateway: + container_name: pushgateway + image: prom/pushgateway:latest + ports: + - "9091:9091" + volumes: pgdata: kafka-data: diff --git a/monitoring/prometheus.yml b/monitoring/prometheus.yml index c000335..735cf42 100644 --- a/monitoring/prometheus.yml +++ b/monitoring/prometheus.yml @@ -1,8 +1,15 @@ global: scrape_interval: 5s +remote_write: + - url: http://prometheus:9090/api/v1/write + scrape_configs: - job_name: 'springboot-app' metrics_path: '/actuator/prometheus' static_configs: - - targets: ['backend:8080'] \ No newline at end of file + - targets: ['backend:8080'] + + - job_name: 'k6' + static_configs: + - targets: ['pushgateway:9091'] From 4d3577faa844c1d777fb59c90d3366b9754b9e9e Mon Sep 17 00:00:00 2001 From: ismiljanic Date: Mon, 8 Dec 2025 18:57:08 +0100 Subject: [PATCH 3/5] Update tests to include short JSON summary on finish --- .../delete_course_by_id/load_delete_course_by_id.js | 7 +++++++ .../delete_course_by_id/spike_delete_course_by_id.js | 7 +++++++ .../delete_course_by_id/stress_delete_course_by_id.js | 7 +++++++ .../get_all_courses/load_get_all_courses.js | 7 +++++++ .../get_all_courses/spike_get_all_courses.js | 7 +++++++ .../get_all_courses/stress_get_all_courses.js | 7 +++++++ .../get_course_by_id/load_get_course_by_id.js | 7 +++++++ .../get_course_by_id/spike_get_course_by_id.js | 7 +++++++ .../get_course_by_id/stress_get_course_by_id.js | 7 +++++++ .../get_course_by_name/load_get_course_by_name.js | 7 +++++++ .../get_course_by_name/spike_get_course_by_name.js | 7 +++++++ .../get_course_by_name/stress_get_course_by_name.js | 7 +++++++ .../load_get_course_lessons_by_id.js | 7 +++++++ .../spike_get_course_lessons_by_id.js | 7 +++++++ .../stress_get_course_lessons_by_id.js | 7 +++++++ .../post_all_courses/load_post_all_courses.js | 7 +++++++ .../post_all_courses/spike_post_all_courses.js | 7 +++++++ .../post_all_courses/stress_post_all_courses.js | 7 +++++++ 18 files changed, 126 insertions(+) diff --git a/tests/performance/controllers/course_controller/delete_course_by_id/load_delete_course_by_id.js b/tests/performance/controllers/course_controller/delete_course_by_id/load_delete_course_by_id.js index 2e674ea..060d93f 100644 --- a/tests/performance/controllers/course_controller/delete_course_by_id/load_delete_course_by_id.js +++ b/tests/performance/controllers/course_controller/delete_course_by_id/load_delete_course_by_id.js @@ -16,3 +16,10 @@ export default function () { check(res, { 'DELETE load': (r) => [200, 204, 404].includes(r.status) }); sleep(Math.random() * 5 + 2) } + +export function handleSummary(data) { + const timestamp = new Date().toISOString().replace(/[:.]/g, '-'); + return { + [`./tests/performance/results/summary_load_delete_course_by_id_${timestamp}.json`]: JSON.stringify(data, null, 2), + }; +} \ No newline at end of file diff --git a/tests/performance/controllers/course_controller/delete_course_by_id/spike_delete_course_by_id.js b/tests/performance/controllers/course_controller/delete_course_by_id/spike_delete_course_by_id.js index 4ee9836..47db2f0 100644 --- a/tests/performance/controllers/course_controller/delete_course_by_id/spike_delete_course_by_id.js +++ b/tests/performance/controllers/course_controller/delete_course_by_id/spike_delete_course_by_id.js @@ -17,4 +17,11 @@ export default function () { const res = http.del(`${BASE_URL}/${courseId}`, null, { headers: defaultHeaders }); check(res, { 'DELETE spike': (r) => [200, 204, 404].includes(r.status) }); sleep(Math.random() * 5 + 2) +} + +export function handleSummary(data) { + const timestamp = new Date().toISOString().replace(/[:.]/g, '-'); + return { + [`./tests/performance/results/summary_spike_delete_course_by_id_${timestamp}.json`]: JSON.stringify(data, null, 2), + }; } \ No newline at end of file diff --git a/tests/performance/controllers/course_controller/delete_course_by_id/stress_delete_course_by_id.js b/tests/performance/controllers/course_controller/delete_course_by_id/stress_delete_course_by_id.js index 10fb7c5..7e18c8d 100644 --- a/tests/performance/controllers/course_controller/delete_course_by_id/stress_delete_course_by_id.js +++ b/tests/performance/controllers/course_controller/delete_course_by_id/stress_delete_course_by_id.js @@ -12,4 +12,11 @@ export default function () { const res = http.del(`${BASE_URL}/${courseId}`, null, { headers: defaultHeaders }); check(res, { 'DELETE stress': (r) => [200, 204, 404].includes(r.status) }); sleep(Math.random() * 5 + 2); +} + +export function handleSummary(data) { + const timestamp = new Date().toISOString().replace(/[:.]/g, '-'); + return { + [`./tests/performance/results/summary_stress_delete_course_by_id_${timestamp}.json`]: JSON.stringify(data, null, 2), + }; } \ No newline at end of file diff --git a/tests/performance/controllers/course_controller/get_all_courses/load_get_all_courses.js b/tests/performance/controllers/course_controller/get_all_courses/load_get_all_courses.js index effdcb4..10da7a0 100644 --- a/tests/performance/controllers/course_controller/get_all_courses/load_get_all_courses.js +++ b/tests/performance/controllers/course_controller/get_all_courses/load_get_all_courses.js @@ -19,3 +19,10 @@ export default function () { check(res, { 'GET /api/courses status 200': (r) => checkResponse(r, 200, 'GET /api/courses') }); sleep(Math.random() * 2 + 1); } + +export function handleSummary(data) { + const timestamp = new Date().toISOString().replace(/[:.]/g, '-'); + return { + [`./tests/performance/results/summary_load_get_all_courses_${timestamp}.json`]: JSON.stringify(data, null, 2), + }; +} \ No newline at end of file diff --git a/tests/performance/controllers/course_controller/get_all_courses/spike_get_all_courses.js b/tests/performance/controllers/course_controller/get_all_courses/spike_get_all_courses.js index 806018a..d3797d0 100644 --- a/tests/performance/controllers/course_controller/get_all_courses/spike_get_all_courses.js +++ b/tests/performance/controllers/course_controller/get_all_courses/spike_get_all_courses.js @@ -19,3 +19,10 @@ export default function () { const res = http.get(BASE_URL, { headers: defaultHeaders }); check(res, { 'GET /api/courses status 200': (r) => checkResponse(r, 200, 'GET /api/courses') }); } + +export function handleSummary(data) { + const timestamp = new Date().toISOString().replace(/[:.]/g, '-'); + return { + [`./tests/performance/results/summary_spike_get_all_courses_${timestamp}.json`]: JSON.stringify(data, null, 2), + }; +} \ No newline at end of file diff --git a/tests/performance/controllers/course_controller/get_all_courses/stress_get_all_courses.js b/tests/performance/controllers/course_controller/get_all_courses/stress_get_all_courses.js index 3fd8b9f..190a06b 100644 --- a/tests/performance/controllers/course_controller/get_all_courses/stress_get_all_courses.js +++ b/tests/performance/controllers/course_controller/get_all_courses/stress_get_all_courses.js @@ -22,3 +22,10 @@ export default function () { const res = http.get(BASE_URL, { headers: defaultHeaders }); check(res, { 'GET /api/courses status 200': (r) => checkResponse(r, 200, 'GET /api/courses') }); } + +export function handleSummary(data) { + const timestamp = new Date().toISOString().replace(/[:.]/g, '-'); + return { + [`./tests/performance/results/summary_stress_get_all_courses_${timestamp}.json`]: JSON.stringify(data, null, 2), + }; +} \ No newline at end of file diff --git a/tests/performance/controllers/course_controller/get_course_by_id/load_get_course_by_id.js b/tests/performance/controllers/course_controller/get_course_by_id/load_get_course_by_id.js index bba9cf9..185be0a 100644 --- a/tests/performance/controllers/course_controller/get_course_by_id/load_get_course_by_id.js +++ b/tests/performance/controllers/course_controller/get_course_by_id/load_get_course_by_id.js @@ -19,4 +19,11 @@ const COURSE_ID = __ENV.COURSE_ID || '1'; export default function () { const res = http.get(`${BASE_URL}/${COURSE_ID}`, { headers: defaultHeaders }); check(res, { 'GET /api/courses/{id} status 200': (r) => checkResponse(r, 200, 'GET /api/courses/{id}') }); +} + +export function handleSummary(data) { + const timestamp = new Date().toISOString().replace(/[:.]/g, '-'); + return { + [`./tests/performance/results/summary_load_get_courses_by_id_${timestamp}.json`]: JSON.stringify(data, null, 2), + }; } \ No newline at end of file diff --git a/tests/performance/controllers/course_controller/get_course_by_id/spike_get_course_by_id.js b/tests/performance/controllers/course_controller/get_course_by_id/spike_get_course_by_id.js index 4fa0e57..73a69f0 100644 --- a/tests/performance/controllers/course_controller/get_course_by_id/spike_get_course_by_id.js +++ b/tests/performance/controllers/course_controller/get_course_by_id/spike_get_course_by_id.js @@ -15,4 +15,11 @@ const COURSE_ID = __ENV.COURSE_ID || '1'; export default function () { const res = http.get(`${BASE_URL}/${COURSE_ID}`, { headers: defaultHeaders }); check(res, { 'GET /api/courses/{id} status 200': (r) => checkResponse(r, 200, 'GET /api/courses/{id}') }); +} + +export function handleSummary(data) { + const timestamp = new Date().toISOString().replace(/[:.]/g, '-'); + return { + [`./tests/performance/results/summary_spike_get_courses_by_id_${timestamp}.json`]: JSON.stringify(data, null, 2), + }; } \ No newline at end of file diff --git a/tests/performance/controllers/course_controller/get_course_by_id/stress_get_course_by_id.js b/tests/performance/controllers/course_controller/get_course_by_id/stress_get_course_by_id.js index a2baebf..ff3ebaa 100644 --- a/tests/performance/controllers/course_controller/get_course_by_id/stress_get_course_by_id.js +++ b/tests/performance/controllers/course_controller/get_course_by_id/stress_get_course_by_id.js @@ -23,4 +23,11 @@ const COURSE_ID = __ENV.COURSE_ID || '1'; export default function () { const res = http.get(`${BASE_URL}/${COURSE_ID}`, { headers: defaultHeaders }); check(res, { 'GET /api/courses/{id} status 200': (r) => checkResponse(r, 200, 'GET /api/courses/{id}') }); +} + +export function handleSummary(data) { + const timestamp = new Date().toISOString().replace(/[:.]/g, '-'); + return { + [`./tests/performance/results/summary_stress_get_courses_by_id_${timestamp}.json`]: JSON.stringify(data, null, 2), + }; } \ No newline at end of file diff --git a/tests/performance/controllers/course_controller/get_course_by_name/load_get_course_by_name.js b/tests/performance/controllers/course_controller/get_course_by_name/load_get_course_by_name.js index 240a532..c56c964 100644 --- a/tests/performance/controllers/course_controller/get_course_by_name/load_get_course_by_name.js +++ b/tests/performance/controllers/course_controller/get_course_by_name/load_get_course_by_name.js @@ -17,3 +17,10 @@ export default function () { check(res, { 'GET /api/courses/name/{name} returns 200': (r) => checkResponse(r, 200) }); sleep(0.5); } + +export function handleSummary(data) { + const timestamp = new Date().toISOString().replace(/[:.]/g, '-'); + return { + [`./tests/performance/results/summary_load_get_courses_by_name_${timestamp}.json`]: JSON.stringify(data, null, 2), + }; +} \ No newline at end of file diff --git a/tests/performance/controllers/course_controller/get_course_by_name/spike_get_course_by_name.js b/tests/performance/controllers/course_controller/get_course_by_name/spike_get_course_by_name.js index 07692d0..f0efdad 100644 --- a/tests/performance/controllers/course_controller/get_course_by_name/spike_get_course_by_name.js +++ b/tests/performance/controllers/course_controller/get_course_by_name/spike_get_course_by_name.js @@ -20,4 +20,11 @@ export default function () { const res = http.get(`${BASE_URL}/name/${courseName}`, { headers: defaultHeaders }); check(res, { 'GET /api/courses/name/{name} returns 200': (r) => checkResponse(r, 200) }); +} + +export function handleSummary(data) { + const timestamp = new Date().toISOString().replace(/[:.]/g, '-'); + return { + [`./tests/performance/results/summary_spike_get_courses_by_name_${timestamp}.json`]: JSON.stringify(data, null, 2), + }; } \ No newline at end of file diff --git a/tests/performance/controllers/course_controller/get_course_by_name/stress_get_course_by_name.js b/tests/performance/controllers/course_controller/get_course_by_name/stress_get_course_by_name.js index 04bed14..18e058f 100644 --- a/tests/performance/controllers/course_controller/get_course_by_name/stress_get_course_by_name.js +++ b/tests/performance/controllers/course_controller/get_course_by_name/stress_get_course_by_name.js @@ -23,4 +23,11 @@ export default function () { const res = http.get(`${BASE_URL}/name/${courseName}`, { headers: defaultHeaders }); check(res, { 'GET /api/courses/name/{name} returns 200': (r) => checkResponse(r, 200) }); +} + +export function handleSummary(data) { + const timestamp = new Date().toISOString().replace(/[:.]/g, '-'); + return { + [`./tests/performance/results/summary_stress_get_courses_by_name_${timestamp}.json`]: JSON.stringify(data, null, 2), + }; } \ No newline at end of file diff --git a/tests/performance/controllers/course_controller/get_course_lessons_by_id/load_get_course_lessons_by_id.js b/tests/performance/controllers/course_controller/get_course_lessons_by_id/load_get_course_lessons_by_id.js index e8eee45..9ad07d5 100644 --- a/tests/performance/controllers/course_controller/get_course_lessons_by_id/load_get_course_lessons_by_id.js +++ b/tests/performance/controllers/course_controller/get_course_lessons_by_id/load_get_course_lessons_by_id.js @@ -15,4 +15,11 @@ export default function () { const res = http.get(`${BASE_URL}/1/lessons`, { headers: defaultHeaders }); check(res, { 'GET /api/courses/1/lessons returns 200': (r) => checkResponse(r, 200) }); sleep(0.5); +} + +export function handleSummary(data) { + const timestamp = new Date().toISOString().replace(/[:.]/g, '-'); + return { + [`./tests/performance/results/summary_load_get_course_lessons_by_id_${timestamp}.json`]: JSON.stringify(data, null, 2), + }; } \ No newline at end of file diff --git a/tests/performance/controllers/course_controller/get_course_lessons_by_id/spike_get_course_lessons_by_id.js b/tests/performance/controllers/course_controller/get_course_lessons_by_id/spike_get_course_lessons_by_id.js index 697635f..21eb91b 100644 --- a/tests/performance/controllers/course_controller/get_course_lessons_by_id/spike_get_course_lessons_by_id.js +++ b/tests/performance/controllers/course_controller/get_course_lessons_by_id/spike_get_course_lessons_by_id.js @@ -18,4 +18,11 @@ export let options = { export default function () { const res = http.get(`${BASE_URL}/1/lessons`, { headers: defaultHeaders }); check(res, { 'GET /api/courses/1/lessons returns 200': (r) => checkResponse(r, 200) }); +} + +export function handleSummary(data) { + const timestamp = new Date().toISOString().replace(/[:.]/g, '-'); + return { + [`./tests/performance/results/summary_spike_get_course_lessons_by_id_${timestamp}.json`]: JSON.stringify(data, null, 2), + }; } \ No newline at end of file diff --git a/tests/performance/controllers/course_controller/get_course_lessons_by_id/stress_get_course_lessons_by_id.js b/tests/performance/controllers/course_controller/get_course_lessons_by_id/stress_get_course_lessons_by_id.js index 374ffad..20649b6 100644 --- a/tests/performance/controllers/course_controller/get_course_lessons_by_id/stress_get_course_lessons_by_id.js +++ b/tests/performance/controllers/course_controller/get_course_lessons_by_id/stress_get_course_lessons_by_id.js @@ -22,4 +22,11 @@ export default function () { const res = http.get(`${BASE_URL}/1/lessons`, { headers: defaultHeaders }); check(res, { 'GET /api/courses/1/lessons returns 200': (r) => checkResponse(r, 200) }); +} + +export function handleSummary(data) { + const timestamp = new Date().toISOString().replace(/[:.]/g, '-'); + return { + [`./tests/performance/results/summary_stress_get_course_lessons_by_id_${timestamp}.json`]: JSON.stringify(data, null, 2), + }; } \ No newline at end of file diff --git a/tests/performance/controllers/course_controller/post_all_courses/load_post_all_courses.js b/tests/performance/controllers/course_controller/post_all_courses/load_post_all_courses.js index a0892cf..6a03427 100644 --- a/tests/performance/controllers/course_controller/post_all_courses/load_post_all_courses.js +++ b/tests/performance/controllers/course_controller/post_all_courses/load_post_all_courses.js @@ -18,4 +18,11 @@ export default function () { const res = http.post(BASE_URL, { headers: defaultHeaders }); check(res, { 'POST /api/courses status 200': (r) => checkResponse(r, 200, 'POST /api/courses') }); sleep(Math.random() * 2 + 1); +} + +export function handleSummary(data) { + const timestamp = new Date().toISOString().replace(/[:.]/g, '-'); + return { + [`./tests/performance/results/summary_load_post_all_courses_${timestamp}.json`]: JSON.stringify(data, null, 2), + }; } \ No newline at end of file diff --git a/tests/performance/controllers/course_controller/post_all_courses/spike_post_all_courses.js b/tests/performance/controllers/course_controller/post_all_courses/spike_post_all_courses.js index d9b5d4f..c22512b 100644 --- a/tests/performance/controllers/course_controller/post_all_courses/spike_post_all_courses.js +++ b/tests/performance/controllers/course_controller/post_all_courses/spike_post_all_courses.js @@ -31,4 +31,11 @@ export default function () { 'POST /api/courses → status 201': (r) => checkResponse(r, 201, 'POST /api/courses'), }); +} + +export function handleSummary(data) { + const timestamp = new Date().toISOString().replace(/[:.]/g, '-'); + return { + [`./tests/performance/results/summary_spike_post_all_courses_${timestamp}.json`]: JSON.stringify(data, null, 2), + }; } \ No newline at end of file diff --git a/tests/performance/controllers/course_controller/post_all_courses/stress_post_all_courses.js b/tests/performance/controllers/course_controller/post_all_courses/stress_post_all_courses.js index 19efa26..0388eed 100644 --- a/tests/performance/controllers/course_controller/post_all_courses/stress_post_all_courses.js +++ b/tests/performance/controllers/course_controller/post_all_courses/stress_post_all_courses.js @@ -39,4 +39,11 @@ export default function () { checkResponse(r, [200, 201], 'POST /api/courses'), }); sleep(Math.random() * 5 + 2); +} + +export function handleSummary(data) { + const timestamp = new Date().toISOString().replace(/[:.]/g, '-'); + return { + [`./tests/performance/results/summary_stress_post_all_courses_${timestamp}.json`]: JSON.stringify(data, null, 2), + }; } \ No newline at end of file From 2a4ffcdf22ca5bcf6728061d8a5c99e9d1de5333 Mon Sep 17 00:00:00 2001 From: ismiljanic Date: Mon, 8 Dec 2025 18:58:02 +0100 Subject: [PATCH 4/5] Add initial performance summaries --- ...rses_by_name_2025-12-08T17-45-06-298Z.json | 212 ++++++++++++++++++ ..._all_courses_2025-12-08T17-52-37-938Z.json | 210 +++++++++++++++++ 2 files changed, 422 insertions(+) create mode 100644 tests/performance/results/summary_load_get_courses_by_name_2025-12-08T17-45-06-298Z.json create mode 100644 tests/performance/results/summary_stress_get_all_courses_2025-12-08T17-52-37-938Z.json diff --git a/tests/performance/results/summary_load_get_courses_by_name_2025-12-08T17-45-06-298Z.json b/tests/performance/results/summary_load_get_courses_by_name_2025-12-08T17-45-06-298Z.json new file mode 100644 index 0000000..a2a1243 --- /dev/null +++ b/tests/performance/results/summary_load_get_courses_by_name_2025-12-08T17-45-06-298Z.json @@ -0,0 +1,212 @@ +{ + "options": { + "summaryTrendStats": [ + "avg", + "min", + "med", + "max", + "p(90)", + "p(95)" + ], + "summaryTimeUnit": "", + "noColor": false + }, + "state": { + "isStdOutTTY": true, + "isStdErrTTY": true, + "testRunDurationMs": 50271.384 + }, + "metrics": { + "http_req_tls_handshaking": { + "type": "trend", + "contains": "time", + "values": { + "avg": 0, + "min": 0, + "med": 0, + "max": 0, + "p(90)": 0, + "p(95)": 0 + } + }, + "http_req_receiving": { + "type": "trend", + "contains": "time", + "values": { + "avg": 0.2379822510822513, + "min": 0.007, + "med": 0.076, + "max": 16.035, + "p(90)": 0.20810000000000003, + "p(95)": 0.3476499999999997 + } + }, + "data_sent": { + "type": "counter", + "contains": "data", + "values": { + "count": 2605680, + "rate": 51832.27101923432 + } + }, + "http_req_waiting": { + "type": "trend", + "contains": "time", + "values": { + "max": 118.755, + "p(90)": 57.7513, + "p(95)": 64.247, + "avg": 40.99053030303033, + "min": 9.778, + "med": 40.321 + } + }, + "checks": { + "contains": "default", + "values": { + "rate": 1, + "passes": 2310, + "fails": 0 + }, + "type": "rate" + }, + "iterations": { + "type": "counter", + "contains": "default", + "values": { + "rate": 45.950594875207734, + "count": 2310 + } + }, + "http_reqs": { + "type": "counter", + "contains": "default", + "values": { + "count": 2310, + "rate": 45.950594875207734 + } + }, + "iteration_duration": { + "type": "trend", + "contains": "time", + "values": { + "p(95)": 566.4199189, + "avg": 542.7420781367962, + "min": 510.738083, + "med": 541.99, + "max": 618.941333, + "p(90)": 559.6669331 + } + }, + "http_req_failed": { + "contains": "default", + "values": { + "rate": 0, + "passes": 0, + "fails": 2310 + }, + "type": "rate" + }, + "http_req_blocked": { + "contains": "time", + "values": { + "avg": 0.028522077922078178, + "min": 0.001, + "med": 0.006, + "max": 3.266, + "p(90)": 0.015, + "p(95)": 0.025 + }, + "type": "trend" + }, + "http_req_sending": { + "values": { + "max": 8.574, + "p(90)": 0.05110000000000005, + "p(95)": 0.0775499999999999, + "avg": 0.04051471861471894, + "min": 0.004, + "med": 0.019 + }, + "type": "trend", + "contains": "time" + }, + "http_req_duration": { + "type": "trend", + "contains": "time", + "values": { + "avg": 41.269027272727314, + "min": 9.816, + "med": 40.524, + "max": 118.789, + "p(90)": 58.074400000000004, + "p(95)": 64.67054999999999 + } + }, + "data_received": { + "type": "counter", + "contains": "data", + "values": { + "count": 1275120, + "rate": 25364.72837111467 + } + }, + "vus_max": { + "contains": "default", + "values": { + "value": 50, + "min": 50, + "max": 50 + }, + "type": "gauge" + }, + "vus": { + "type": "gauge", + "contains": "default", + "values": { + "value": 12, + "min": 1, + "max": 49 + } + }, + "http_req_connecting": { + "type": "trend", + "contains": "time", + "values": { + "min": 0, + "med": 0, + "max": 2.895, + "p(90)": 0, + "p(95)": 0, + "avg": 0.016248484848484852 + } + }, + "http_req_duration{expected_response:true}": { + "type": "trend", + "contains": "time", + "values": { + "avg": 41.269027272727314, + "min": 9.816, + "med": 40.524, + "max": 118.789, + "p(90)": 58.074400000000004, + "p(95)": 64.67054999999999 + } + } + }, + "root_group": { + "name": "", + "path": "", + "id": "d41d8cd98f00b204e9800998ecf8427e", + "groups": [], + "checks": [ + { + "id": "4900f98b03ff58bb73677daf299fc44a", + "passes": 2310, + "fails": 0, + "name": "GET /api/courses/name/{name} returns 200", + "path": "::GET /api/courses/name/{name} returns 200" + } + ] + } +} \ No newline at end of file diff --git a/tests/performance/results/summary_stress_get_all_courses_2025-12-08T17-52-37-938Z.json b/tests/performance/results/summary_stress_get_all_courses_2025-12-08T17-52-37-938Z.json new file mode 100644 index 0000000..715d20a --- /dev/null +++ b/tests/performance/results/summary_stress_get_all_courses_2025-12-08T17-52-37-938Z.json @@ -0,0 +1,210 @@ +{ + "root_group": { + "id": "d41d8cd98f00b204e9800998ecf8427e", + "groups": [], + "checks": [ + { + "id": "f02acc4eeef4e7a41d7801aaf3fd8a9d", + "passes": 0, + "fails": 2616135, + "name": "GET /api/courses status 200", + "path": "::GET /api/courses status 200" + } + ], + "name": "", + "path": "" + }, + "options": { + "summaryTimeUnit": "", + "noColor": false, + "summaryTrendStats": [ + "avg", + "min", + "med", + "max", + "p(90)", + "p(95)" + ] + }, + "state": { + "isStdOutTTY": true, + "isStdErrTTY": true, + "testRunDurationMs": 85001.406 + }, + "metrics": { + "vus_max": { + "type": "gauge", + "contains": "default", + "values": { + "value": 2000, + "min": 2000, + "max": 2000 + } + }, + "iterations": { + "contains": "default", + "values": { + "count": 2616135, + "rate": 30777.54972664805 + }, + "type": "counter" + }, + "http_req_sending": { + "values": { + "avg": 0.05843801600354774, + "min": 0.001, + "med": 0.003, + "max": 133.096, + "p(90)": 0.008, + "p(95)": 0.016 + }, + "type": "trend", + "contains": "time" + }, + "data_received": { + "contains": "data", + "values": { + "count": 1444585301, + "rate": 16994840.073586546 + }, + "type": "counter" + }, + "checks": { + "type": "rate", + "contains": "default", + "values": { + "rate": 0, + "passes": 0, + "fails": 2616135 + } + }, + "iteration_duration": { + "type": "trend", + "contains": "time", + "values": { + "avg": 26.15504649736695, + "min": 0.198542, + "med": 21.873667, + "max": 461.378875, + "p(90)": 53.584950000000006, + "p(95)": 64.65959559999999 + } + }, + "http_req_duration": { + "type": "trend", + "contains": "time", + "values": { + "avg": 18.474802442916353, + "min": 0.18, + "med": 13.522, + "max": 460.526, + "p(90)": 40.894, + "p(95)": 51.54 + }, + "thresholds": { + "p(95)<1000": { + "ok": true + } + } + }, + "http_req_tls_handshaking": { + "type": "trend", + "contains": "time", + "values": { + "med": 0, + "max": 0, + "p(90)": 0, + "p(95)": 0, + "avg": 0, + "min": 0 + } + }, + "http_reqs": { + "contains": "default", + "values": { + "count": 2616135, + "rate": 30777.54972664805 + }, + "type": "counter" + }, + "http_req_blocked": { + "type": "trend", + "contains": "time", + "values": { + "p(95)": 0.003, + "avg": 0.1207288645241876, + "min": 0, + "med": 0.001, + "max": 124.99, + "p(90)": 0.002 + } + }, + "http_req_connecting": { + "type": "trend", + "contains": "time", + "values": { + "avg": 0.11568039264028825, + "min": 0, + "med": 0, + "max": 124.938, + "p(90)": 0, + "p(95)": 0 + } + }, + "http_req_receiving": { + "type": "trend", + "contains": "time", + "values": { + "avg": 0.10442196255082742, + "min": 0.003, + "med": 0.007, + "max": 167.395, + "p(90)": 0.017, + "p(95)": 0.034 + } + }, + "data_sent": { + "values": { + "rate": 33824527.14958621, + "count": 2875132365 + }, + "type": "counter", + "contains": "data" + }, + "http_req_waiting": { + "type": "trend", + "contains": "time", + "values": { + "avg": 18.31194246436071, + "min": 0.171, + "med": 13.431, + "max": 460.468, + "p(90)": 40.676, + "p(95)": 51.21 + } + }, + "http_req_failed": { + "type": "rate", + "contains": "default", + "values": { + "passes": 2616135, + "fails": 0, + "rate": 1 + }, + "thresholds": { + "rate<0.2": { + "ok": false + } + } + }, + "vus": { + "contains": "default", + "values": { + "value": 18, + "min": 18, + "max": 1997 + }, + "type": "gauge" + } + } +} \ No newline at end of file From 58586bcd3ad39aba736910142c3bc250112b7ec6 Mon Sep 17 00:00:00 2001 From: ismiljanic Date: Mon, 8 Dec 2025 19:06:36 +0100 Subject: [PATCH 5/5] Update microservice-moderation submodule to latest commit --- microservice-moderation | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/microservice-moderation b/microservice-moderation index 2ff6319..e354deb 160000 --- a/microservice-moderation +++ b/microservice-moderation @@ -1 +1 @@ -Subproject commit 2ff63199ace1728bd19cea3c47174c8a2e51fcb5 +Subproject commit e354deb44a2771cc3d0a97da408e77502499978b