Search code examples
gatlingscala-gatling

Gatling compilation fails for simulation with nothingFor function


I am trying to run simulation with nothingFor function under Gatling 3.4.1. However, compilation fails with the error could not find implicit value for evidence parameter of type io.gatling.core.controller.inject.InjectionProfileFactory[Product with Serializable]

Simulation

package abs

import io.gatling.core.Predef._
import io.gatling.http.Predef._
import scala.concurrent.duration._

class DefaultSimulation extends Simulation {

  ...

  val httpProtocol = http
    .baseUrl(Setting.baseUrl)
    .userAgentHeader("Gatling/3.4.1")

  setUp(
    getScenario.inject(
      nothingFor(20 seconds),
      rampConcurrentUsers(0) to(20) during(10 seconds),
      constantConcurrentUsers(20) during (600 seconds)
    ),
    setScenario.inject(
      rampConcurrentUsers(0) to(20) during(30 seconds),
      constantConcurrentUsers(20) during (600 seconds)
    )
  ).protocols(httpProtocol)
}

Compilation error

[ERROR] i.g.c.ZincCompiler$ - C:/Installation/gatling-3.4.1/user-files/simulations/DefaultSimulation.scala:50:30: could not find implicit value for evidence parameter of type io.gatling.core.controller.inject.InjectionProfileFactory[Product with Serializable]
    getScenario.inject(
                      ^
[ERROR] i.g.c.ZincCompiler$ - one error found
[ERROR] i.g.c.ZincCompiler$ - Compilation crashed
xsbt.InterfaceCompileFailed: null
        at xsbt.CachedCompiler0.handleErrors(CompilerBridge.scala:183)
        at xsbt.CachedCompiler0.run(CompilerBridge.scala:172)
        at xsbt.CachedCompiler0.run(CompilerBridge.scala:134)
        at xsbt.CompilerBridge.run(CompilerBridge.scala:39)
        at sbt.internal.inc.AnalyzingCompiler.compile(AnalyzingCompiler.scala:89)
        at sbt.internal.inc.MixedAnalyzingCompiler.$anonfun$compile$7(MixedAnalyzingCompiler.scala:185)
        at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:23)
        at sbt.internal.inc.MixedAnalyzingCompiler.timed(MixedAnalyzingCompiler.scala:240)
        at sbt.internal.inc.MixedAnalyzingCompiler.$anonfun$compile$4(MixedAnalyzingCompiler.scala:175)
        at sbt.internal.inc.MixedAnalyzingCompiler.$anonfun$compile$4$adapted(MixedAnalyzingCompiler.scala:156)
        at sbt.internal.inc.JarUtils$.withPreviousJar(JarUtils.scala:232)
        at sbt.internal.inc.MixedAnalyzingCompiler.compileScala$1(MixedAnalyzingCompiler.scala:156)
        at sbt.internal.inc.MixedAnalyzingCompiler.compile(MixedAnalyzingCompiler.scala:203)
        at sbt.internal.inc.IncrementalCompilerImpl.$anonfun$compileInternal$1(IncrementalCompilerImpl.scala:571)
        at sbt.internal.inc.IncrementalCompilerImpl.$anonfun$compileInternal$1$adapted(IncrementalCompilerImpl.scala:571)
        at sbt.internal.inc.Incremental$.$anonfun$apply$5(Incremental.scala:174)
        at sbt.internal.inc.Incremental$.$anonfun$apply$5$adapted(Incremental.scala:172)
        at sbt.internal.inc.Incremental$$anon$2.run(Incremental.scala:459)
        at sbt.internal.inc.IncrementalCommon$CycleState.next(IncrementalCommon.scala:115)
        at sbt.internal.inc.IncrementalCommon$$anon$1.next(IncrementalCommon.scala:56)
        at sbt.internal.inc.IncrementalCommon$$anon$1.next(IncrementalCommon.scala:52)
        at sbt.internal.inc.IncrementalCommon.cycle(IncrementalCommon.scala:248)
        at sbt.internal.inc.Incremental$.$anonfun$incrementalCompile$8(Incremental.scala:414)
        at sbt.internal.inc.Incremental$.withClassfileManager(Incremental.scala:499)
        at sbt.internal.inc.Incremental$.incrementalCompile(Incremental.scala:401)
        at sbt.internal.inc.Incremental$.apply(Incremental.scala:166)
        at sbt.internal.inc.IncrementalCompilerImpl.compileInternal(IncrementalCompilerImpl.scala:571)
        at sbt.internal.inc.IncrementalCompilerImpl.$anonfun$compileIncrementally$1(IncrementalCompilerImpl.scala:489)
        at sbt.internal.inc.IncrementalCompilerImpl.handleCompilationError(IncrementalCompilerImpl.scala:332)
        at sbt.internal.inc.IncrementalCompilerImpl.compileIncrementally(IncrementalCompilerImpl.scala:419)
        at sbt.internal.inc.IncrementalCompilerImpl.compile(IncrementalCompilerImpl.scala:137)
        at io.gatling.compiler.ZincCompiler$.doCompile(ZincCompiler.scala:258)
        at io.gatling.compiler.ZincCompiler$.delayedEndpoint$io$gatling$compiler$ZincCompiler$1(ZincCompiler.scala:265)
        at io.gatling.compiler.ZincCompiler$delayedInit$body.apply(ZincCompiler.scala:40)
        at scala.Function0.apply$mcV$sp(Function0.scala:39)
        at scala.Function0.apply$mcV$sp$(Function0.scala:39)
        at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:17)
        at scala.App.$anonfun$main$1$adapted(App.scala:80)
        at scala.collection.immutable.List.foreach(List.scala:431)
        at scala.App.main(App.scala:80)
        at scala.App.main$(App.scala:78)
        at io.gatling.compiler.ZincCompiler$.main(ZincCompiler.scala:40)
        at io.gatling.compiler.ZincCompiler.main(ZincCompiler.scala)

I have tried to implicitly specify imports, but compilation fails with the same exception

import io.gatling.core.Predef.{nothingFor, rampConcurrentUsers, constantConcurrentUsers, _}

This simulation compiles and works without nothingFor(20 seconds).


Solution

  • Gatling has 2 different families of injection profiles steps:

    • open, where you control users arrival rate
    • closed where you control the number of concurrent users

    You can't mix them because those are 2 completely different and incompatible behaviors.

    nothingFor belongs to the open family while rampConcurrentUsers belongs to the closed one.

    Use constantConcurrentUsers(0) during (20) instead.