K6: Нагрузочное тестирование сайтов
Для нагрузочного тестирования сайтов существует популярное и удобное решение от Grafana - k6 . Покажу, как это выглядит на практике.
K6 много чего умеет. Он вообще очень развитый и продвинутый инструмент, где тесты можно писать в том числе на JavaScript. Продукт позиционирует себя как Tests as code. Его легко поднять и начать тестирование, используя готовые примеры. Показываю на практике.
Поднимаем связку Grafana + Influxdb:
git clone https://github.com/grafana/k6 && cd k6
Там готовый docker-compose.yml. В принципе, можно ничего не менять, конфиг простой, без необходимости указания переменных. Запускаем связку:
docker compose up -d influxdb grafana
Можно сходить, проверить графану по стандартному урлу и порту: http://server-ip:3000/login. Учётка стандартная - admin / admin. В графане уже должен быть настроен в Data sources myinfluxdb с урлом из соседнего контейнера.
Теперь нужно выбрать Dashboard. Их очень много разных для k6, выбирайте любой. Наиболее функциональный и удобный вот этот, за счёт того, что там есть группировка по тэгам, группам, урлам. Идём в Dashboards ⇨ Import ⇨ ID 13719 .
Всё готово для запуска тестов. В репозитории, в директории examples очень много примеров. Эта директория мапится в контейнер с k6 в docker-compose. Тест можно запустить вот так:
docker compose run k6 run /scripts/stages.js
Данные сразу потекут в Influxdb, так что их сразу можно наблюдать в Grafana. Тест не обязательно запускать на этой же машине. Можно из любого другого места, а передать данные через отдельный параметр. Примерно так:
k6 run --out influxdb=http://1.2.3.4:8086 stages.js
Вот пример простого конфига для теста в 10 потоков в течении 30 секунд:
import http from 'k6/http'; import { sleep } from 'k6'; export let options = { vus: 10, duration: '30s', }; export default function () { http.get('https://test.k6.io'); sleep(1); }
Соответственно, конфиг легко расширяется дополнительными урлами, тестами, выполняемыми действиями. У продукта хорошая документация и много готовых примеров. Знать JavaScript не обязательно.