@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.
- package/README.md +46 -19
- package/dist/api.js +20 -0
- package/dist/cli.js +34 -6
- package/dist/commands/analyze.js +118 -0
- package/dist/commands/capacity.js +99 -0
- package/dist/commands/docs.js +57 -0
- package/dist/commands/files.js +18 -4
- package/dist/commands/plan.js +100 -0
- package/dist/commands/record.js +11 -1
- package/dist/commands/results.js +13 -7
- package/dist/commands/schema.js +86 -0
- package/dist/commands/skills.js +111 -0
- package/dist/commands/tests.js +73 -0
- package/dist/docs/agent-setup.md +109 -0
- package/dist/docs/agent-tasks.md +169 -0
- package/dist/docs/ai-agents.md +90 -0
- package/dist/docs/auth.md +74 -0
- package/dist/docs/automation.md +150 -0
- package/dist/docs/ci.md +105 -0
- package/dist/docs/clusters.md +48 -0
- package/dist/docs/commands.md +155 -0
- package/dist/docs/files.md +86 -0
- package/dist/docs/generators.md +52 -0
- package/dist/docs/getting-started.md +85 -0
- package/dist/docs/index.json +110 -0
- package/dist/docs/projects.md +50 -0
- package/dist/docs/recorder.md +143 -0
- package/dist/docs/results.md +79 -0
- package/dist/docs/running.md +80 -0
- package/dist/docs/skills.md +88 -0
- package/dist/docs/test-plans.md +92 -0
- package/dist/docs/troubleshooting.md +79 -0
- package/dist/plan.js +250 -0
- package/dist/skills/AGENTS.md +70 -0
- package/dist/skills/atlas-analyze/SKILL.md +104 -0
- package/dist/skills/atlas-correlate/SKILL.md +89 -0
- package/dist/skills/atlas-load-test/SKILL.md +154 -0
- package/dist/skills/atlas-record/SKILL.md +167 -0
- package/dist/skills/atlas-run/SKILL.md +109 -0
- package/dist/skills/atlas-test-plan/SKILL.md +281 -0
- 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.
|