Нагрузочное тестирование с помощью grafana k6
Давайте познакомимся с таким инструментом как grafana k6. С помощью него вы можете производительность ваших приложений и тестирование хаоса (Это метод, используемый для проверки устойчивости программных систем путем внесения непредвиденных сбоев или сбоев. Целью хаотического тестирования является выявление слабых мест и повышение устойчивости приложения)
Основной фичей инструмента является то, что вы можете писать довольно сложные сценарии тестирования используя javascript. k6 легко запускается из командной строки и хорошо интегрируется в CI/CD пайплайны, а также эмулирует работу виртуальных пользователей.
Ниже пример моего кейса. Надо было протестировать как себя ведет балансировщик. Поскольку балансер еще работает не в боевом режиме, надо отправить на IP адрес балансера заголовок с нужным хостом и игнорированием https. В примере мы в течении 30s плавно повышаем нагрузку до 1000 виртуальных пользователей, держим 30 секунд и далее в течении 20 секунд уменьшаем нагрузку до 0.
import http from "k6/http";
import { check, sleep } from "k6";
// Test configuration
export const options = {
thresholds: {
// Assert that 99% of requests finish within 3000ms.
http_req_duration: ["p(99) < 3000"],
},
stages: [
{ duration: "10s", target: 1000 },
{ duration: "30s", target: 1000 },
{ duration: "20s", target: 0 },
],
// ignore ssl valudation
insecureSkipTLSVerify: true,
};
// Simulated user behavior
export default function () {
const url = "https://my.loadbalancer.ip.address"; // Set load balancer host
// set header hosts
const headers = {
Host: "example.com",
};
let res = http.get(url, { headers });
check(res, { "status was 200": (r) => r.status == 200 });
sleep(1);
}
В результате вы получите супер подробный отчет по производительности.
На самом деле это довольно базовый сценарий, но сила k6 в возможности наращивать и усложнять логику, ограниченную только вашей фантазией. Примеры использования вы найдете в официальной документации https://grafana.com/docs/k6/next/get-started/running-k6/