Gatling
An async, JVM-based engine with an expressive DSL and the best per-node HTTP throughput of the mainstream open-source tools.
Where it shines
Gatling's non-blocking architecture drives very high request rates from modest hardware — routinely several times JMeter's per-node throughput for plain HTTP workloads. The DSL (Scala originally; Java and Kotlin now first-class) reads as a specification of user behaviour, and the standard HTML report is the strongest out-of-the-box reporting among free tools, with response-time distributions and percentile charts that need no post-processing.
// Java DSL — open-model injection profile
ScenarioBuilder browse = scenario("Browse")
.exec(http("catalogue").get("/catalogue")
.check(status().is(200), jmesPath("items[0].id").exists()))
.pause(Duration.ofSeconds(8), Duration.ofSeconds(20));
setUp(
browse.injectOpen(
rampUsersPerSec(5).to(420).during(Duration.ofMinutes(20)),
constantUsersPerSec(420).during(Duration.ofMinutes(60))
)
).protocols(http.baseUrl("https://api.example.com"))
.assertions(
global().responseTime().percentile(95.0).lt(500),
global().failedRequests().percent().lt(0.1)
);
Limitations to plan around
Protocol coverage is narrower than JMeter (HTTP, WebSockets, JMS, MQTT; little beyond); teams without JVM experience face a steeper start than with k6's JavaScript; and the free edition's distributed-testing story requires assembly (the paid platform handles it natively).
Our Gatling practice
Java DSL by default for maintainability by non-Scala teams; injection profiles defined per scenario with explicit open/closed model choice; simulation configs externalised so the same codebase runs smoke, load and stress variants; CI integration via the Maven/Gradle plugins with assertion-based gating.