@cloudbeat/atlas-cli 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/README.md +46 -19
  2. package/dist/api.js +20 -0
  3. package/dist/cli.js +34 -6
  4. package/dist/commands/analyze.js +118 -0
  5. package/dist/commands/capacity.js +99 -0
  6. package/dist/commands/docs.js +57 -0
  7. package/dist/commands/files.js +18 -4
  8. package/dist/commands/plan.js +100 -0
  9. package/dist/commands/record.js +11 -1
  10. package/dist/commands/results.js +13 -7
  11. package/dist/commands/schema.js +86 -0
  12. package/dist/commands/skills.js +111 -0
  13. package/dist/commands/tests.js +73 -0
  14. package/dist/docs/agent-setup.md +109 -0
  15. package/dist/docs/agent-tasks.md +169 -0
  16. package/dist/docs/ai-agents.md +90 -0
  17. package/dist/docs/auth.md +74 -0
  18. package/dist/docs/automation.md +150 -0
  19. package/dist/docs/ci.md +105 -0
  20. package/dist/docs/clusters.md +48 -0
  21. package/dist/docs/commands.md +155 -0
  22. package/dist/docs/files.md +86 -0
  23. package/dist/docs/generators.md +52 -0
  24. package/dist/docs/getting-started.md +85 -0
  25. package/dist/docs/index.json +110 -0
  26. package/dist/docs/projects.md +50 -0
  27. package/dist/docs/recorder.md +143 -0
  28. package/dist/docs/results.md +79 -0
  29. package/dist/docs/running.md +80 -0
  30. package/dist/docs/skills.md +88 -0
  31. package/dist/docs/test-plans.md +92 -0
  32. package/dist/docs/troubleshooting.md +79 -0
  33. package/dist/plan.js +250 -0
  34. package/dist/skills/AGENTS.md +70 -0
  35. package/dist/skills/atlas-analyze/SKILL.md +104 -0
  36. package/dist/skills/atlas-correlate/SKILL.md +89 -0
  37. package/dist/skills/atlas-load-test/SKILL.md +154 -0
  38. package/dist/skills/atlas-record/SKILL.md +167 -0
  39. package/dist/skills/atlas-run/SKILL.md +109 -0
  40. package/dist/skills/atlas-test-plan/SKILL.md +281 -0
  41. package/package.json +5 -3
@@ -0,0 +1,86 @@
1
+ # Test Files
2
+
3
+ A project holds your test plan and every data file it reads. Upload them
4
+ whenever they change — this is independent of running a test, and files stay in
5
+ the project until you replace or delete them.
6
+
7
+ ## Uploading
8
+
9
+ From the **Files** tab, upload the `.jmx` and its data files. From the CLI:
10
+
11
+ ```bash
12
+ atlas files upload -p SHOP ./checkout.jmx ./data/users.csv ./data/products.csv
13
+ ```
14
+
15
+ Uploading a file whose name already exists **replaces** it.
16
+
17
+ ## How files are laid out
18
+
19
+ **All of a project's files live together in one flat folder.** There are no
20
+ subdirectories: whatever you upload lands side by side, and when a test runs,
21
+ the test plan and its data files sit in the same directory on every load
22
+ generator.
23
+
24
+ So reference data files from your plan by a plain relative path:
25
+
26
+ ```
27
+ ./users.csv ✅ recommended
28
+ users.csv ✅ also works
29
+ ```
30
+
31
+ Not by an absolute path, and not through a folder:
32
+
33
+ ```
34
+ C:\Users\me\Data\users.csv ❌ a Windows path cannot be found on a Linux generator
35
+ /home/me/data/users.csv ❌ absolute paths won't exist there either
36
+ ./data/users.csv ❌ the folder structure is not preserved
37
+ ```
38
+
39
+ If a data file path can't be resolved, every thread in that thread group throws
40
+ before issuing a single request. There are no failed samples, so the summary
41
+ shows `0.00%` errors and the dashboard simply **omits that thread group** while
42
+ the others look healthy.
43
+
44
+ If a thread group is missing from your results, this is the first thing to check.
45
+
46
+ ## How data files are divided
47
+
48
+ When a test runs on several machines, Atlas **divides** your data files between
49
+ them rather than giving every machine the whole file. With 1,000 rows across 5
50
+ generators, each gets roughly 200 rows, and no two machines use the same row.
51
+
52
+ This is what you usually want: a load test where 5 machines all replay the same
53
+ 200 users isn't testing what you think it is.
54
+
55
+ **Header rows are handled for you.** If your plan's CSV Data Set Config says the
56
+ file has a header, that header is copied to every machine's slice and only the
57
+ data rows are divided.
58
+
59
+ Files are divided byte for byte — column order, quoting, embedded commas and
60
+ newlines all survive exactly as uploaded.
61
+
62
+ To switch dividing off and send whole files to every machine, use `--no-split`
63
+ (CLI) or clear the split option on the Run Test tab.
64
+
65
+ `.csv` and `.txt` files are divided. `.jmx` and everything else is copied whole
66
+ to every machine.
67
+
68
+ ## Downloading and deleting
69
+
70
+ ```bash
71
+ atlas files list -p SHOP
72
+ atlas files download -p SHOP checkout.jmx
73
+ atlas files rm -p SHOP old-data.csv
74
+ ```
75
+
76
+ In the web interface, the Files tab has a download and a delete action per file.
77
+
78
+ ## Before your first run
79
+
80
+ - Every file the plan references must actually be uploaded. Upload the plan and
81
+ its data files together.
82
+ - Disable GUI listeners left switched on in the plan — **View Results Tree**,
83
+ **Aggregate Report**, **Simple Data Writer**. They eat memory during a headless
84
+ run, and Atlas collects results separately.
85
+
86
+ Full details in [Test Plan Requirements](/reference/test-plans).
@@ -0,0 +1,52 @@
1
+ # Load Generators
2
+
3
+ A **load generator** is a machine that runs JMeter and produces load. Atlas
4
+ copies your test plan to each one and starts them together.
5
+
6
+ Most teams share a pool that is already set up — in that case you can skip this
7
+ section entirely and just pick machines when you [run a test](/guide/running-tests).
8
+
9
+ Read on if you need to add machines of your own.
10
+
11
+ ## Two kinds
12
+
13
+ | | |
14
+ |---|---|
15
+ | **Servers** | Fixed machines that exist whether or not a test is running. Cloud VMs Atlas can power on and off, or your own hardware. |
16
+ | **Clusters** | Elastic capacity. Units are created when a test starts and destroyed when it ends. |
17
+
18
+ Both appear under **Fleet** in the sidebar, on separate tabs.
19
+
20
+ ## Why run your own?
21
+
22
+ The usual reason is that your application isn't reachable from the internet.
23
+ A load generator inside your own network can reach it, and only needs an
24
+ **outbound** connection to Atlas — no inbound access, no firewall changes, no
25
+ VPN.
26
+
27
+ The other reason is geography: generating load from where your users actually
28
+ are gives you a more honest number.
29
+
30
+ ## Power state
31
+
32
+ Machines Atlas can control are **powered on when a test needs them and switched
33
+ off when it ends**, so you don't pay for idle capacity. This is why a switched-off
34
+ machine can still be selected on the Run Test tab.
35
+
36
+ Machines Atlas can't power — your own hardware — are assumed to be always on and
37
+ are never powered off.
38
+
39
+ ## Status
40
+
41
+ The Fleet page shows two independent things per machine:
42
+
43
+ - whether the **machine** is on or off
44
+ - whether its **connection** to Atlas is live
45
+
46
+ A machine can be on but not connected, which usually means the agent isn't
47
+ running. See [Troubleshooting](/reference/troubleshooting).
48
+
49
+ ## Next
50
+
51
+ - [Adding a Machine](/generators/adding)
52
+ - [Clusters](/generators/clusters)
@@ -0,0 +1,85 @@
1
+ # Getting Started
2
+
3
+ This walks through one complete test: uploading a plan, running it, and reading
4
+ the result. It should take a few minutes.
5
+
6
+ ## Sign in
7
+
8
+ Open your Atlas instance and go to **/app** — for a typical installation that
9
+ is [atlas.cloudbeat.io/app](https://atlas.cloudbeat.io/app). Sign in with
10
+ your email address and password.
11
+
12
+ If you have access to more than one account, you'll be asked which to work in.
13
+ You can switch later from the account selector in the sidebar.
14
+
15
+ ## Open a project
16
+
17
+ A **project** holds your test plan, its data files, and the history of every run.
18
+ Pick one from **Projects** in the sidebar, or ask your administrator to create
19
+ one if the list is empty.
20
+
21
+ The project page has three tabs:
22
+
23
+ | Tab | What it holds |
24
+ |---|---|
25
+ | **Results** | Every run of this project, newest first |
26
+ | **Files** | The test plan and data files |
27
+ | **Run Test** | Start a new run |
28
+
29
+ ## Upload your test plan
30
+
31
+ Go to **Files** and upload your `.jmx` along with every data file it reads.
32
+
33
+ Test plans written in JMeter on Windows usually reference data files by a full
34
+ `C:\...\data.csv` path, which does not exist on a load generator. Open each
35
+ **CSV Data Set Config** and reduce the filename to `./data.csv`.
36
+
37
+ If a path can't be found at run time, every thread in that thread group stops
38
+ before sending a single request — the test appears to run, but that group
39
+ reports nothing at all. See [Test Plan Requirements](/reference/test-plans).
40
+
41
+ ## Run it
42
+
43
+ Go to **Run Test**, choose where to run:
44
+
45
+ - **Servers** — pick individual load generators. Machines that are switched off
46
+ can still be selected; they are powered on for you.
47
+ - **Cluster** — run on a cluster and say how many units you want.
48
+
49
+ If the project holds more than one `.jmx`, pick which one to run. Then press
50
+ **Run**.
51
+
52
+ You do not need to deploy or prepare anything first. Atlas reserves the
53
+ machines, copies your files, and starts JMeter.
54
+
55
+ ## Watch it run
56
+
57
+ The page switches to a live view showing each stage — powering on, deploying,
58
+ then running — with a **Stop** button.
59
+
60
+ Once results start arriving, open the dashboard for the run from the **Results**
61
+ tab. You'll see:
62
+
63
+ - **Active users**, **response time** and **error rate** on one chart
64
+ - Headline numbers: duration, peak users, requests per second, average response
65
+ time, error rate
66
+ - A per-request table you can sort and drill into
67
+
68
+ The dashboard updates itself while the test runs. See
69
+ [Reading Results](/guide/results) for what each number means.
70
+
71
+ ## Stop it, or let it finish
72
+
73
+ A test ends on its own when the plan says so — a thread group's duration or loop
74
+ count running out. Press **Stop** to end it early.
75
+
76
+ When a run finishes, the load generators are released and any that Atlas powered
77
+ on are switched off again.
78
+
79
+ ## Next steps
80
+
81
+ - [Running a Test](/guide/running-tests) — all the options, and how data files
82
+ are divided between machines
83
+ - [Reading Results](/guide/results) — the dashboard in detail
84
+ - [CLI](/cli/install) — do all of this from a terminal or a CI pipeline
85
+ - [Recorder](/recorder/) — generate a test plan by clicking through your app
@@ -0,0 +1,110 @@
1
+ [
2
+ {
3
+ "topic": "getting-started",
4
+ "title": "Getting Started",
5
+ "summary": "This walks through one complete test: uploading a plan, running it, and reading the result. It should take a few minutes.",
6
+ "source": "guide/getting-started.md"
7
+ },
8
+ {
9
+ "topic": "projects",
10
+ "title": "Projects",
11
+ "summary": "A project is the unit everything else hangs off. It holds:",
12
+ "source": "guide/projects.md"
13
+ },
14
+ {
15
+ "topic": "files",
16
+ "title": "Test Files",
17
+ "summary": "A project holds your test plan and every data file it reads. Upload them whenever they change — this is independent of running a test, and files stay in the project until you replace or delete them.",
18
+ "source": "guide/test-files.md"
19
+ },
20
+ {
21
+ "topic": "running",
22
+ "title": "Running a Test",
23
+ "summary": "Open a project, go to **Run Test**, choose where to run, and press **Run**.",
24
+ "source": "guide/running-tests.md"
25
+ },
26
+ {
27
+ "topic": "results",
28
+ "title": "Reading Results",
29
+ "summary": "Every run has a dashboard. Open it from a project's **Results** tab, or from the test list at `/<project>`.",
30
+ "source": "guide/results.md"
31
+ },
32
+ {
33
+ "topic": "ai-agents",
34
+ "title": "Atlas for AI Agents",
35
+ "summary": "**Describe the test. Let the agent build it.**",
36
+ "source": "agents/index.md"
37
+ },
38
+ {
39
+ "topic": "agent-setup",
40
+ "title": "Setting It Up",
41
+ "summary": "Two commands to install, one to sign in. The guidance is bundled with the CLI, so there is nothing to download separately and nothing to keep in sync by hand.",
42
+ "source": "agents/setup.md"
43
+ },
44
+ {
45
+ "topic": "agent-tasks",
46
+ "title": "What an Agent Can Do",
47
+ "summary": "The whole lifecycle, from an empty project to a report you can send someone. Each section below is a real thing to ask for, what the agent does about it, and what it should ask you along the way.",
48
+ "source": "agents/capabilities.md"
49
+ },
50
+ {
51
+ "topic": "skills",
52
+ "title": "The Skills",
53
+ "summary": "`atlas skills install` writes six skills plus a vendor-neutral `AGENTS.md`. Each skill is a short document covering one part of load testing: what to do, in what order, and which mistakes to avoid.",
54
+ "source": "agents/skills.md"
55
+ },
56
+ {
57
+ "topic": "automation",
58
+ "title": "Building Your Own Integration",
59
+ "summary": "The same surfaces the bundled skills use are there for your own scripts, bots and agents. No SDK, no separate API client: the CLI is the integration point, and everything it does is scriptable.",
60
+ "source": "agents/automation.md"
61
+ },
62
+ {
63
+ "topic": "generators",
64
+ "title": "Load Generators",
65
+ "summary": "A **load generator** is a machine that runs JMeter and produces load. Atlas copies your test plan to each one and starts them together.",
66
+ "source": "generators/index.md"
67
+ },
68
+ {
69
+ "topic": "clusters",
70
+ "title": "Clusters",
71
+ "summary": "A **cluster** is elastic capacity: instead of fixed machines that sit there between tests, units are created when a test starts and destroyed when it ends.",
72
+ "source": "generators/clusters.md"
73
+ },
74
+ {
75
+ "topic": "recorder",
76
+ "title": "Recording a Scenario",
77
+ "summary": "If you don't have a JMeter test plan yet, the recorder makes one by watching you use your application. You click through a flow in a real browser — log in, search, check out — and it writes a `.jmx` you can run as a load test.",
78
+ "source": "recorder/index.md"
79
+ },
80
+ {
81
+ "topic": "commands",
82
+ "title": "Commands",
83
+ "summary": "Every command takes `--json`, and `-p, --project <name>` where a project applies. Run `atlas <command> --help` for the full list of options. A failure under `--json` prints the error as JSON on standard error.",
84
+ "source": "cli/commands.md"
85
+ },
86
+ {
87
+ "topic": "auth",
88
+ "title": "Signing In",
89
+ "summary": "You'll be prompted for your password. The session lasts **8 hours**.",
90
+ "source": "cli/authentication.md"
91
+ },
92
+ {
93
+ "topic": "ci",
94
+ "title": "Running in CI",
95
+ "summary": "The point of running Atlas from CI is to catch a performance regression the same way you catch a failing unit test — automatically, on the build that caused it.",
96
+ "source": "cli/ci.md"
97
+ },
98
+ {
99
+ "topic": "test-plans",
100
+ "title": "Test Plan Requirements",
101
+ "summary": "Atlas runs standard JMeter test plans, but a plan written on a desktop needs a few changes before it runs correctly on a fleet of Linux load generators. These are the things that actually catch people out.",
102
+ "source": "reference/test-plans.md"
103
+ },
104
+ {
105
+ "topic": "troubleshooting",
106
+ "title": "Troubleshooting",
107
+ "summary": "The usual cause is a **data file path that can't be resolved**. Every thread in that group fails before sending a request, so there are no errors to report — the group simply isn't there.",
108
+ "source": "reference/troubleshooting.md"
109
+ }
110
+ ]
@@ -0,0 +1,50 @@
1
+ # Projects
2
+
3
+ A project is the unit everything else hangs off. It holds:
4
+
5
+ - one or more **test plans** (`.jmx`)
6
+ - the **data files** those plans read
7
+ - the **history** of every run, with its results
8
+
9
+ Projects are also how access is granted: you see the projects you have been
10
+ given access to, and nothing else.
11
+
12
+ ## The project page
13
+
14
+ ### Results
15
+
16
+ Every run of this project, newest first. Each row shows when it started, how
17
+ long it ran, and the peak number of concurrent users it reached. Click a run to
18
+ open its dashboard.
19
+
20
+ You can give a run a **name** — click the name cell and type. This is worth
21
+ doing when you run variations against each other, since `SHOP-20260818-194201`
22
+ tells you when a run happened but not what it was for. "Baseline, 500 users" is
23
+ easier to find three weeks later.
24
+
25
+ ### Files
26
+
27
+ Upload, download and delete the project's files. See
28
+ [Test Files](/guide/test-files).
29
+
30
+ ### Run Test
31
+
32
+ Start a run. See [Running a Test](/guide/running-tests).
33
+
34
+ ## Choosing which plan runs
35
+
36
+ A project can hold several test plans. One of them is the project's **default** —
37
+ the one used when you don't say otherwise.
38
+
39
+ When a project holds more than one `.jmx`, the Run Test tab shows a dropdown to
40
+ pick between them, and remembers your last choice for that project. From the
41
+ CLI, pass `--jmx`:
42
+
43
+ ```bash
44
+ atlas run -p SHOP --jmx checkout-peak.jmx --servers 5
45
+ ```
46
+
47
+ ## Creating a project
48
+
49
+ Projects are created by administrators. If you need one, ask — you'll need to
50
+ say which account it belongs to, since that determines who can see it.
@@ -0,0 +1,143 @@
1
+ # Recording a Scenario
2
+
3
+ If you don't have a JMeter test plan yet, the recorder makes one by watching you
4
+ use your application. You click through a flow in a real browser — log in,
5
+ search, check out — and it writes a `.jmx` you can run as a load test.
6
+
7
+ ## Install
8
+
9
+ ```sh
10
+ npm install -g @cloudbeat/atlas-recorder
11
+ ```
12
+
13
+ This downloads a private browser build (a few hundred MB) used for capture. It
14
+ won't touch the browsers you already have. Requires Node.js 18 or newer.
15
+
16
+ It's a separate package from the CLI because CI machines run tests but never
17
+ record them.
18
+
19
+ ## Record
20
+
21
+ ```sh
22
+ atlas-rec record https://example.com -o checkout.jmx -n "Checkout"
23
+ ```
24
+
25
+ Or through the CLI, which can upload the result straight into a project:
26
+
27
+ ```sh
28
+ atlas record https://example.com -o checkout.jmx --upload -p SHOP
29
+ ```
30
+
31
+ A browser window opens with a small control panel in the corner. Click through
32
+ your flow, then press **Stop**.
33
+
34
+ Your recording is saved when you press Stop, when you close the window, and on
35
+ Ctrl+C — closing the window by mistake won't lose it.
36
+
37
+ ## What you get
38
+
39
+ Each thing you do — a click, a form submit, a page change — becomes a labelled
40
+ **transaction**, with the requests it triggered grouped underneath. A report then
41
+ tells you "Checkout took 3.2s" rather than just listing URLs.
42
+
43
+ While recording you can:
44
+
45
+ - **rename** a transaction so the report reads in your language, not the app's URLs
46
+ - **➕ New** to start a new transaction before you click, when one page holds two
47
+ steps worth measuring separately
48
+ - expand a transaction and **exclude** or **delete** individual requests
49
+ - **⏸ Pause** while you set something up you don't want recorded
50
+
51
+ ## What's kept, and what isn't
52
+
53
+ **Kept:** the requests your application makes — pages, API calls, form posts.
54
+
55
+ **Skipped:** images, stylesheets, fonts and known analytics traffic. These
56
+ inflate a load test without telling you anything about your application. Include
57
+ one from the control panel if you need it.
58
+
59
+ ## Dynamic values are handled
60
+
61
+ If a request sends something it was given earlier — a CSRF token, a session ID,
62
+ an item ID from a search result — the recorder finds where that value came from
63
+ and pulls it out of the live response at run time instead of replaying the
64
+ recorded one. Without this, a recorded plan usually fails on the second run,
65
+ when the token has changed.
66
+
67
+ Each of these gets a check attached, so if the value ever stops coming back the
68
+ sample fails loudly rather than quietly posting a stale token.
69
+
70
+ ## Adding to an existing plan
71
+
72
+ Point `-o` at a plan that already exists and the new recording is **added** to it
73
+ as another thread group, leaving what's there untouched. A `.bak` copy is written
74
+ first.
75
+
76
+ ```sh
77
+ atlas-rec record https://example.com -o suite.jmx -n "Checkout"
78
+ atlas-rec record https://example.com -o suite.jmx -n "Search"
79
+ ```
80
+
81
+ ## Recording behind a login
82
+
83
+ **Reuse a signed-in session** — saved when you stop, reloaded next time:
84
+
85
+ ```sh
86
+ atlas-rec record https://app.example.com -o app.jmx --profile ./session.json
87
+ ```
88
+
89
+ **Bring cookies from your own browser** — export them and pass `--cookies`:
90
+
91
+ ```sh
92
+ atlas-rec record https://app.example.com/home -o app.jmx --cookies ./cookies.json
93
+ ```
94
+
95
+ ## Options
96
+
97
+ | Option | Meaning |
98
+ |---|---|
99
+ | `-o, --out <file>` | Where to write. An existing plan is added to; otherwise created |
100
+ | `-n, --name <name>` | Name for the scenario |
101
+ | `-t, --threads <n>` | Number of users — only when creating a new plan |
102
+ | `-l, --loops <n>` | Iterations per user — only when creating a new plan |
103
+ | `--profile <file>` | Save and reuse a signed-in session |
104
+ | `--cookies <file>` | Start already signed in, using exported cookies |
105
+ | `--correlations <file>` | Pin named parameters to a value of your choosing |
106
+ | `--no-correlate` | Replay recorded values as-is |
107
+ | `--no-timestamps` | Keep recorded timestamps instead of using the current time |
108
+
109
+ ## Check the plan before running it at scale
110
+
111
+ The recorder captures a single pass through your app. Anything that only appears
112
+ sometimes — a cookie banner, an A/B variant, a retry — is recorded only if it
113
+ happened while you clicked.
114
+
115
+ When a step redirects, the redirect is followed *and* the destination is recorded
116
+ on its own, so that step can hit the destination twice per iteration. Delete the
117
+ duplicate from the control panel, or from the plan afterwards, if it would skew
118
+ your numbers.
119
+
120
+ **Think-time pauses** are recorded but switched off, so the plan runs flat out
121
+ until you decide otherwise. Enable the `Settings - Sleeps` block in the plan and
122
+ set the durations you want.
123
+
124
+ ## Driven by an agent, or a script
125
+
126
+ A recording does not have to be clicked by a person. The same session can be
127
+ controlled command by command — `snapshot` to see the page, `click`, `fill`,
128
+ `tx new` to name the step that follows — which is how an AI assistant records a
129
+ flow for you, and how a script can automate one.
130
+
131
+ The browser stays visible throughout and your own clicks are recorded too, so
132
+ you can take over for a login and hand it back.
133
+
134
+ ```sh
135
+ atlas-rec start https://shop.example.com -o flow.jmx -n "Checkout"
136
+ atlas-rec snapshot
137
+ atlas-rec tx new "Search"
138
+ atlas-rec click --role button --name "Search"
139
+ atlas-rec stop
140
+ ```
141
+
142
+ See [Your Own Integration](/agents/automation) for the full set, and
143
+ [Atlas for AI Agents](/agents/) to let an assistant do it.
@@ -0,0 +1,79 @@
1
+ # Reading Results
2
+
3
+ Every run has a dashboard. Open it from a project's **Results** tab, or from the
4
+ test list at `/<project>`.
5
+
6
+ The dashboard refreshes itself while a test is running, so you can leave it open
7
+ from start to finish.
8
+
9
+ ## Headline numbers
10
+
11
+ | | |
12
+ |---|---|
13
+ | **Status** | Whether the test is still running |
14
+ | **Test Started** | When it began |
15
+ | **Duration** | How long it has been running, or ran for |
16
+ | **Max Users** | The peak number of concurrent users, added up across every machine |
17
+ | **Req/sec** | Throughput |
18
+ | **Avg Response Time** | Average across the whole test |
19
+ | **Error Rate** | Failed requests as a percentage of all requests, across the whole test |
20
+
21
+ Each load generator reports its own thread count, and Atlas adds them up. If you
22
+ ran a 100-thread plan on 5 machines, expect roughly 500 — if it shows 100,
23
+ something stopped four of your generators from producing load.
24
+
25
+ Average response time and error rate are **whole-test** figures, not the last
26
+ few seconds, so they won't jump around as the test finishes.
27
+
28
+ ## The chart
29
+
30
+ Three series on one timeline:
31
+
32
+ - **Active Users** (green, right axis) — concurrency over time
33
+ - **Avg. Response Time** (blue, left axis) — how the system responded as load grew
34
+ - **Error Rate %** (red) — when things started failing
35
+
36
+ Read together, these tell you where your system's limit is: the point where
37
+ response time climbs and errors begin while users are still increasing.
38
+
39
+ ## The aggregation report
40
+
41
+ One row per request, grouped by thread group, with count, response times
42
+ (average, median, percentiles, min/max), throughput and error percentage.
43
+
44
+ Every column sorts. Rows are colour-coded:
45
+
46
+ | | |
47
+ |---|---|
48
+ | **TOTAL** | The whole test |
49
+ | **Thread group** | One per thread group in your plan |
50
+ | **Transaction** | A named step, if your plan uses Transaction Controllers |
51
+ | **Request** | An individual HTTP request |
52
+
53
+ The same sampler name in two different thread groups stays two separate rows,
54
+ attributed to the right group — so a shared "login" step used by several groups
55
+ doesn't get merged into one misleading number.
56
+
57
+ ### Drilling in
58
+
59
+ - **Click an Error %** — opens a panel listing the actual errors for that
60
+ request: response codes and messages, with the full request and response for
61
+ each distinct failure.
62
+ - **Click a Label** — opens the same chart filtered to that one request, so you
63
+ can see whether a single endpoint degraded while the rest stayed healthy.
64
+ There's an error-type dropdown to isolate one specific failure.
65
+
66
+ ## Exporting
67
+
68
+ **↓ Export Excel** downloads the run as a spreadsheet with the chart and the full
69
+ table, colour-coded to match. Useful for attaching to a report.
70
+
71
+ ## Dark mode
72
+
73
+ Add `?theme=dark` to any dashboard URL.
74
+
75
+ ## Comparing runs
76
+
77
+ There is no side-by-side comparison view yet. Name your runs (in the Results
78
+ tab) so you can tell variations apart, and export to Excel to compare them
79
+ outside Atlas.
@@ -0,0 +1,80 @@
1
+ # Running a Test
2
+
3
+ ## From the web interface
4
+
5
+ Open a project, go to **Run Test**, choose where to run, and press **Run**.
6
+
7
+ There is no separate deploy step. Atlas reserves the machines, powers on any
8
+ that are switched off, copies the files, and starts JMeter.
9
+
10
+ ## Choosing where it runs
11
+
12
+ | | |
13
+ |---|---|
14
+ | **Servers** | Pick individual load generators by name. Switched-off machines can still be selected — they are powered on for you. |
15
+ | **Cluster** | Run on a cluster and say how many units you want. Units are created for the test and destroyed afterwards. |
16
+
17
+ The number of machines multiplies your load: a plan with 100 threads run on 5
18
+ generators applies 500 concurrent users to your system.
19
+
20
+ Atlas does not divide your thread count across machines — each one runs the plan
21
+ as written. Five generators running a 100-thread plan is 500 users, not 100.
22
+
23
+ ## From the CLI
24
+
25
+ ```bash
26
+ atlas run -p SHOP --jmx checkout.jmx --servers 5 --wait
27
+ ```
28
+
29
+ | | |
30
+ |---|---|
31
+ | `--servers 5` | use any 5 available load generators |
32
+ | `--server gen-01 --server gen-02` | pick specific ones by name |
33
+ | `--cluster my-cluster --units 10` | run on 10 units in a cluster |
34
+ | `--jmx <filename>` | which uploaded plan to run (needed only if the project holds more than one) |
35
+ | `--args "<jmeter args>"` | extra JMeter arguments |
36
+ | `--no-split` | send whole data files to every machine |
37
+ | `--wait` | follow the run and print the report when it finishes |
38
+ | `--timeout 30m` | how long `--wait` waits before giving up (default `2h`) |
39
+
40
+ ## While it runs
41
+
42
+ The Run Test tab becomes a live view showing each stage — powering on,
43
+ deploying, running — with a **Stop** button.
44
+
45
+ **Watch** in the sidebar shows live per-machine statistics while a test is in
46
+ progress, which is the quickest way to confirm every generator is actually
47
+ producing load.
48
+
49
+ From the CLI:
50
+
51
+ ```bash
52
+ atlas status SHOP-20260818-194201
53
+ ```
54
+
55
+ ## If a machine is busy
56
+
57
+ A load generator can only run one test at a time. If you ask for machines that
58
+ are already in use, your run is **queued** and starts when they free up. You
59
+ don't need to retry.
60
+
61
+ ## Stopping a test
62
+
63
+ Press **Stop**, or:
64
+
65
+ ```bash
66
+ atlas stop SHOP-20260818-194201
67
+ ```
68
+
69
+ Atlas asks JMeter to shut down cleanly so the final results are recorded, and
70
+ only reports the machine as stopped once the process has actually ended.
71
+
72
+ If a machine can't be reached when you stop a test, Atlas tells you rather than
73
+ pretending it worked, and the run stays open. Retry once the machine is
74
+ reachable — this prevents a test carrying on unnoticed in the background.
75
+
76
+ ## When a test ends
77
+
78
+ A test ends by itself when the plan says so — a thread group's duration or loop
79
+ count running out. When it does, the machines are released and any that Atlas
80
+ powered on are switched off.