Tracing k6's origins from the Load Impact project in 2017 to its position as a flagship Grafana Labs tool, then honestly comparing it with JMeter, Gatling, and Locust to understand when and why k6 is the right choice.

In episode 0 you set up the environment: the k6 binary is installed, k6 version returns the release number, and your editor is ready to write JavaScript scripts. Now, before writing your first script, we need to answer the most fundamental question: why does k6 exist, and why is it worth choosing?
Every tool is born as an answer to a particular pain. To understand k6, we have to trace that pain: the era when load testing was synonymous with giant, heavyweight GUI tools that were hard to automate and disconnected from the modern developer world. This episode will follow k6's timeline from the birth of Load Impact in 2017 to its current position as a flagship Grafana Labs project, then make an honest comparison with its predecessors: JMeter, Gatling, and Locust. By the end of the episode, you'll understand not just what k6 is, but when and why to choose it.
k6 was first developed in 2017 by the team behind a SaaS company named Load Impact — a company selling load testing services as a paid product. At the time, their internal need was a tool capable of running large-scale tests efficiently, in an automated way, and controllable via API. The result was k6, an internal load testing engine written in Go.
The decision to write it in Go from the start was the key that set k6's direction: Go produces a single lightweight binary that is fast and uses little memory — traits that would later become its main advantage over resource-hungry JVM-based tools.
In 2018, Load Impact decided to release k6 as open-source under an open-source license (AGPL-3.0). This was a turning point: thousands of developers began contributing, and k6 quickly became one of the most popular load testing projects on GitHub. The community's strength made features grow fast — not only from the vendor, but from the real needs of its users in the field.
In 2021, Grafana Labs acquired Load Impact and brought k6 into its observability ecosystem. Its official name changed to Grafana k6. This acquisition was not just a rename: k6 now holds a strategic position within Grafana's observability stack — positioned as one of the load sources that streams metrics to observability platforms like Grafana Cloud, Prometheus, and InfluxDB. This is where k6's observability-native nature was born.
2017 -> Load Impact develops k6 (Go engine)
2018 -> k6 open-source, community starts contributing
2021 -> Acquired by Grafana Labs, officially becomes Grafana k6
now -> De-facto standard for API & microservices load testingSo that your choice is deliberate — not just following a trend — let's compare k6 with the three tools that dominated the load testing landscape before and after the k6 era.
JMeter (born 1998, Java/JVM-based) was the king of load testing in the 2000s. A GUI interface, hundreds of samplers, and a broad plugin ecosystem made it very popular among QA teams. Its strengths: proven for decades, lots of documentation, and suitable for multi-protocol testing (HTTP, JDBC, FTP, JMS, and more).
Its biggest weakness stems precisely from that strength: the GUI makes scenarios hard to put into version control and CI, configuration becomes very complex as test plans grow, and the JVM base consumes a lot of memory — running 1000 virtual users often requires significant resources. For modern needs that are fully scriptable and pipeline-ready, JMeter feels outdated.
Gatling (born 2011, Scala/Akka) is the more modern candidate. Scripts are written in Scala DSL (and later also Java), based on scenario-as-code, and it's known for good resource efficiency and beautiful HTML reports. It forces users to write scenarios as code, not GUI clicks — a big step forward from the JMeter paradigm.
Its weakness: for non-JVM developers, the Scala/Java learning curve feels heavy. Observability integration is also less native than k6, and its ecosystem is much smaller. If your team already speaks JVM, Gatling deserves consideration; if not, k6 is far easier to adopt.
Locust (born 2011, Python) is the closest competitor philosophically: code-based load testing, written in Python, with an architecture that enables distributed testing naturally through master-worker. Very popular among data engineers and teams comfortable with Python.
Its weakness: HTTP testing in Locust runs through the Python-based requests library, which is slow — for very high loads, each virtual user uses more resources, and peak throughput can be lower than the Go engine. In addition, its worker execution model requires more operational effort as it scales up.
This is the most transformative difference. JavaScript is a language that nearly every modern developer learns, regardless of their backend stack. A team made up of Go, PHP, and TypeScript developers can immediately write k6 scripts without learning a new language. More importantly, a k6 script is real code: it can go into version control, be reviewed in pull requests, and benefit from refactoring and modularization techniques — not a binary test plan that only opens in a GUI.
import http from "k6/http";
export default function () {
const res = http.get("https://test.k6.io");
console.log(res.status);
}Because k6 is a serverless, GUI-less CLI binary, it is drop-in in any pipeline: GitHub Actions, GitLab CI, Jenkins, or a local runner. A single k6 run script.js command can run in a freshly created container without additional configuration, and exit code 99 signals a failed threshold — a success-failure language every pipeline understands.
Because it now lives under Grafana Labs, k6 is designed to stream metrics out (output to JSON, Prometheus remote write, InfluxDB, Grafana Cloud) and display results in real-time dashboards. k6 metrics are born with stable, documented names — not plain text logs that must be parsed by hand. Episode 15 will cover this thoroughly.
The k6 engine runs on Go, and JavaScript scripts are executed by goja — an ECMAScript engine written in Go. As a result, one k6 virtual user uses far less memory than a JVM-based JMeter user. An ordinary laptop can generate thousands of virtual users. This is not a technical detail — it determines whether a load test can run from a developer's laptop or must rent an expensive server.
| Aspect | JMeter | Gatling | Locust | k6 |
|---|---|---|---|---|
| Scripting language | GUI + XML | Scala/Java | Python | JavaScript |
| Runtime | JVM | JVM/Akka | Python | Go |
| Resources per VU | High | Medium | High | Low |
| CI-friendly | Hard | Good | Good | Excellent |
| Observability | Plugin | Partially built-in | Add-on | Very native |
k6 excels when your needs take the form of API, web, and microservices with these characteristics:
Conversely, consider other tools if you need to test protocols not supported by core k6 (for example SIP or exotic legacy protocols), or if scenarios require execution inside a full browser — a case now served by k6 Browser (later episodes will touch on it).
Note
Tool choice is never absolute. Mature teams often run a combination: k6 for code-based API load testing, and other tools for specific edge cases. What matters is understanding the cost and benefit of each option, not chasing hype.
In this episode 1, you've learned that k6 is not a tool that appeared out of thin air, but an answer to the limitations of the tools of the previous era:
The conceptual foundation is complete. In episode 2 we dive into the engine: understanding the basic concepts and core architecture of k6 — how virtual users are executed, the test lifecycle from init to teardown, components like the http module, checks, thresholds, and metrics, plus execution options such as vus, duration, stages, and ramping. From history, we move to how it works. See you in episode 2!