Skip to content

Build1 publisher3 min readPublished

Role-based journeys turned up a 429 before they produced a usable p95

Extending a PowerShell endpoint suite with roles, sessions and think time exposed authentication, contract, cleanup and rate-limit defects first. The nine journey sessions still share three accounts, one per role.

The Engineer · Build desk

What happened

  • The author extended an endpoint-level load suite with roles, sessions, think time, separate read and write journeys, and explicit cleanup rules.
  • Before the new journeys produced performance numbers worth discussing, they exposed authentication, API-contract, cleanup and rate-limit problems.
  • The read journeys split by role: a regular user verifies the session, loads an issue list and opens an issue; an agent also reads comments and activity; an administrator also requests admin overviews and health information.
  • The write journey creates an issue, updates it, adds a comment, verifies the result and removes the generated data, and because it changes state it needs stronger safety controls than the read-only path.

Compiled by The EngineerSomething wrong?How this is made

Why it matters

  • constraint With every regular-user session signing in as the same account, the suite's achievable concurrency is set by the per-account rate limit, so scaling the mix means provisioning test identities before touching thread counts.
  • decision Anyone reusing this runner has to decide which clock their SLO is written against, because the recorded duration includes client deserialization and network time that no server-side histogram will show.
  • capability Sequencing validity ahead of timing makes a load suite double as a permissions and cleanup test, catching a class of defect that endpoint percentiles cannot express.
  • constraint Without a telemetry-derived target the suite can compare one run against another, but it cannot say whether the system meets expected load. Balcarek's piece sets that requirement.

The runner takes one credential pair per role, so the five regular-user sessions all sign in as the same regular user [9]. A sixth regular-user login came back 429, and the final low-load comparison was trimmed to a 5:3:1 mix of regular-user, agent and administrator sessions [7][6]. That leaves nine sessions running on three accounts [20]. The limiter counted six sign-ins on one identity [21].

Each virtual session owns one .NET HttpClient and cookie handler, reuses that client for the whole journey, and records request duration after the full response body has been read [10]. The author says that keeps the browser-style cookie flow close to the existing automation, and that client and network time are part of the measured latency [12]. Percentiles use the nearest-rank calculation [11]. So a p95 from this suite transfers to another setup only if the generator sits on a comparable network path and reads comparable response bodies, and only if the other side computes its percentiles the same way. Against a server-side histogram these figures include time the server never spent. The runner extends an existing PowerShell performance suite, and the author says it was not selected as a claim that PowerShell measures better than k6 or another load-testing tool [13].

A load test that checks roles can find functional bugs. Every session signs in separately, verifies the role the server returns, waits between actions, and starts during a ramp-up period rather than at the same instant [8]. Think time here means deliberately waiting between actions instead of firing requests as fast as the client can [19]. A journey that asserts who it is and what it may see fails on a broken contract before it reports any number. The earlier version of the suite answered how defined endpoints behave under controlled, repeatable load. The question it left open was how people actually use the system [18].

I would copy the order of operations. The author proves a journey is functionally and technically valid, checks that it stays stable when sessions run in parallel, interprets latency, throughput and error rate only after that, and reaches for system and resource metrics when investigating causes [15]. The author's central result is that a journey must be valid before its latency can mean anything [4].

The author describes the implemented slice as narrow: it adds a reviewable journey model, with no telemetry-derived workload target and no continuous resource correlation across every relevant system layer [16]. Daniel Balcarek's article, the piece that prompted the rewrite, argues that load should reflect how people use the system and that the target load should come from an explicit requirement or telemetry [17]. The suite's own documentation is clear that the mix describes sessions, not people, and is not a simulation of nine independent identities [9].

What to watch

  • Per-role credential pools replacing the shared logins would show where the server's own concurrency limit sits, not the account's.
  • A published run with the write journey and the read journeys in parallel would test whether the cleanup rules hold under contention.
  • Stepped load reintroduced on top of the journey model would show whether the 429 ceiling moves with the ramp rate.
Loading claim ledger
Loading source directory links
Loading share composer
Loading topic controls
Loading related stories