Минимальный пример нагрузочного теста на публичный API PetStore Swagger с отправкой метрик из k6 в Prometheus и просмотром в Grafana.
В метрики также добавляются пользовательские теги запуска, чтобы можно было разделять прогоны в Grafana:
release_tagrun_datetest_suitenode_id
tests/petstore.js— сценарийk6с фиксированным общим10 RPS(по5 RPSна каждый GET):GET /pet/findByStatus?status=availableGET /store/inventory
docker-compose.yml— поднимаетPrometheusиGrafanaprometheus/prometheus.yml— базовый конфигPrometheusgrafana/provisioning/...— автоматическое подключение datasource и стартового dashboardgrafana/dashboards/k6-overview.json— адаптированная версия dashboard21825под Prometheus
- установленный
Docker/Docker Desktop - установленный
k6
Если k6 еще не установлен:
brew install k6- Поднять
PrometheusиGrafana:
docker compose up -d- Запустить тест и отправлять метрики в
Prometheus:
RELEASE_TAG=release-1.2.3 \
RUN_DATE=11.04 \
TEST_SUITE=petstore-smoke \
NODE_ID=node-1 \
K6_PROMETHEUS_RW_TREND_STATS=count,min,max,avg,med,p(25),p(50),p(75),p(80),p(85),p(90),p(95),p(99) \
k6 run \
--out experimental-prometheus-rw=http://localhost:9090/api/v1/write \
tests/petstore.js- Открыть интерфейсы:
- Prometheus:
http://localhost:9090 - Grafana:
http://localhost:3000 - логин / пароль Grafana:
admin / admin
После старта контейнеров и запуска теста будет автоматически доступен dashboard k6 Load Testing Results Simple filters (Prometheus).
Вверху dashboard появятся фильтры:
ReleaseRun DateSuiteNode
Это значения из тегов k6, которые приходят в Prometheus как labels.
Дополнительно доступны фильтры, повторяющие оригинальный dashboard 21825:
MeasurementscenarioURLname
Важно: для этого dashboard нужен расширенный K6_PROMETHEUS_RW_TREND_STATS, иначе панели с avg, med, p95, p99 и другими percentiles будут пустыми.
Если нужно дополнительно смотреть метрики руками в Explore:
sum(rate(k6_http_reqs_total{release_tag="release-1.2.3",run_date="11.04"}[1m]))
sum(k6_vus{release_tag="release-1.2.3",run_date="11.04"})
k6_http_req_failed_rate
- Публичный
petstore.swagger.io— это демо-сервис, он может отвечать нестабильно. - Если нужен полностью детерминированный пример, следующий шаг — поднять локальный mock PetStore и гонять
k6в него. - Если
RUN_DATEне передать явно, скрипт сам проставит значение в форматеMM.DD. - Базовый URL можно переопределить:
PETSTORE_BASE_URL=https://petstore.swagger.io/v2 \
RELEASE_TAG=release-1.2.3 \
RUN_DATE=11.04 \
TEST_SUITE=petstore-smoke \
NODE_ID=node-1 \
K6_PROMETHEUS_RW_TREND_STATS=count,min,max,avg,med,p(25),p(50),p(75),p(80),p(85),p(90),p(95),p(99) \
k6 run --out experimental-prometheus-rw=http://localhost:9090/api/v1/write tests/petstore.jsДля распределенного запуска добавлены 2 сервиса k6 (k6-node-1, k6-node-2) с разными NODE_ID и сегментами выполнения:
k6-node-1->--execution-segment 0:1/2k6-node-2->--execution-segment 1/2:1
Сейчас тест настроен на фиксированный общий 10 RPS (два сценария по 5 RPS).
При запуске в 2 контейнера через execution segments нагрузка делится между нодами (в среднем около 5 RPS на ноду).
Запуск:
docker compose up -d prometheus grafana
docker compose --profile load up --abort-on-container-exit k6-node-1 k6-node-2После прогона в Grafana можно фильтровать метрики по переменной Node (node_id) и смотреть вклад каждой ноды отдельно.