Как получить отчеты по сценариям из параметризованного моделирования в гатлинге?
Я пытаюсь протестировать один API, который внутренне делает разные вещи на основе входных данных:
- страна
- покупатель
- количество предметов
Я придумал следующую симуляцию:
val countries = List("US", "CAN")
val customerTypes = List("TYPE1", "TYPE2")
val basketSizes = List(1, 10, 50)
val scenarioGenerator: Seq[(String, String, Int)] = for {
country <- countries
customerType <- customerTypes
basketSize <- basketSizes
} yield (country, customerType, basketSize)
def scenarios(): Seq[PopulationBuilder] = {
var scenarioList = new ArraySeq[PopulationBuilder](countries.size * customerTypes.size * basketSizes.size)
var i = 0;
for ((country: String, customerType: String, basketSize: Int) <- scenarioGenerator) {
// fetch customer data for scenario
val customers = DataFetcher.customerRequest(country, customerType)
// fetch product data for scenario
val products = DataFetcher.productRequest(country)
// generate a scenario with given data and parameters
val scen = scenario(s"Pricing-(${country},${customerType},${basketSize})")
// feeder that creates the request object for the gatling user
.feed(new PricingFeeder(country, customers, products, basketSize))
.repeat(10) {
exec(Pricing.price)
.pause(500 milliseconds)
}
.inject(
rampUsers(10) over (10 seconds)
)
scenarioList(i) = scen
i = i + 1
}
scenarioList
}
setUp(scenarios: _*).protocols(httpProto)
Это выполняется с плагином maven (и с отслеживанием в jenkins с использованием плагина gatling), но это приводит к одному отслеживаемому случаю: Pricing
, Это бесполезно, так как даже количество предметов будет близко к линейному увеличению времени отклика.
simulation.log
содержит данные для каждого типа сценария, но из коробки отчет обрабатывает их как один тип запроса и объединяет все результаты в один график, что означает, что невозможно увидеть, вызывает ли определенная комбинация всплеск из-за расчет или ошибка данных.
Я хотел бы получить отдельные метрики для каждой из комбинаций, так что было бы действительно легко увидеть, например, что изменение кода или данных в API вызвало всплеск задержки в Pricing-(US,TYPE1,50)
сценарий.
Каков идиоматический способ достижения этого с помощью Гатлинга? Я не хочу создавать симуляции для каждого случая, так как это было бы кошмаром для управления (и мы пытаемся достичь избавления от вручную управляемых данных и заданий jenkins с помощью jmeter).
2 ответа
Во-первых, не рекомендуется запускать в одном симуляторе столько сценариев, сколько параллельных, а не последовательных, поэтому вы должны быть уверены, что это именно то, что вам нужно.
Если это так, вы можете использовать тот факт, что отчет Gatling позволяет отображать графики для каждой группы. Таким образом, вы можете обернуть все ваши запросы в группу, которая названа на основе параметров, таким образом, в подробном просмотре отчета вы сможете выбрать, какую группу показывать, например:
val singleScenario = scenario(s"Pricing-(${country},${customerType},${basketSize})")
.group(s"Pricing-(${country},${customerType},${basketSize})"){
.feed(new PricingFeeder(country, customers, products, basketSize))
.repeat(10) {
exec(Pricing.price)
.pause(500 milliseconds)
}
}
Если вам не нужно, чтобы все сценарии выполнялись параллельно, и вам нужны отдельные отчеты для отдельных сценариев, лучше всего реализовать класс моделирования в качестве параметризованного абстрактного класса и добавить отдельные классы для каждого набора параметров, как в Gatling одно моделирование равняется отчету, например.:
package com.performance.project.simulations
import io.gatling.core.Predef.Simulation
import scala.concurrent.duration._
class UsType1Simulation1 extends ParametrizedSimulation("US", "TYPE1", 1)
class UsType1Simulation10 extends ParametrizedSimulation("US", "TYPE1", 10)
class UsType1Simulation50 extends ParametrizedSimulation("US", "TYPE1", 50)
class UsType2Simulation1 extends ParametrizedSimulation("US", "TYPE2", 1)
class UsType2Simulation10 extends ParametrizedSimulation("US", "TYPE2", 10)
class UsType2Simulation50 extends ParametrizedSimulation("US", "TYPE2", 50)
class CanType1Simulation1 extends ParametrizedSimulation("CAN", "TYPE1", 1)
class CanType1Simulation10 extends ParametrizedSimulation("CAN", "TYPE1", 10)
class CanType1Simulation50 extends ParametrizedSimulation("CAN", "TYPE1", 50)
class CanType2Simulation1 extends ParametrizedSimulation("CAN", "TYPE2", 1)
class CanType2Simulation10 extends ParametrizedSimulation("CAN", "TYPE2", 10)
class CanType2Simulation50 extends ParametrizedSimulation("CAN", "TYPE2", 50)
sealed abstract class ParametrizedSimulation(country: String, customerType: String, basketSize: Int) extends Simulation{
val customers = DataFetcher.customerRequest(country, customerType)
val products = DataFetcher.productRequest(country)
val singleScenario = scenario(s"Pricing-(${country},${customerType},${basketSize})")
.feed(new PricingFeeder(country, customers, products, basketSize))
.repeat(10) {
exec(Pricing.price)
.pause(500 milliseconds)
}
.inject(
rampUsers(10) over (10 seconds)
)
setUp(singleScenario).protocols(httpProto)
}
Конечно, это имеет смысл, только если есть небольшое количество комбинаций, с сотнями из них это будет грязно.
Как мы можем смоделировать сценарии Гатлинга по регионам? например, хотите выполнить в США, тогда как мы можем это сделать?
Есть другой способ, есть простой скрипт на python, который может дать вам графики, основанные на сценарии. Это даст вам HTML-страницу (я использовал графики Боке).
https://github.com/Navdit/gatling-scenario-graphs
Пожалуйста, не стесняйтесь проверить. Прикрепление образца снимка (чтобы возбудить ваш интерес:P:))