When To Use LoadStrike
Use LoadStrike when your real performance question is about a workflow across systems, not just one endpoint. It is most useful when completion happens downstream.
Matching docs
Search across docs titles, summaries, groups, and section headings.
Use Up and Down Arrow to move through results, then press Enter to open the active page.
No indexed docs matched that search. Try a broader term or open the docs hub.
What this page helps you do
What this page helps you do
Use LoadStrike when your real performance question is about a workflow across systems, not just one endpoint. It is most useful when completion happens downstream.
Who this is for
Engineers deciding how to frame the workload before they choose transports, thresholds, or reports.
Prerequisites
- A workflow where business completion matters more than the first request alone
By the end
A clearer definition of what the transaction should mean for this workload.
Use this page when
Use this page when the team needs to agree on the workload model before debating transport, threshold, or reporting details.
Visual guide
Guide
Best Fit
LoadStrike is a strong fit when a plain request-step scenario is not enough and business latency depends on more than one hop. That includes APIs that publish to Kafka, services that fan out to workers, browser journeys that trigger async processing, or any path where success is only visible later.
Team Fit
It is built for engineering, QA, platform, and SRE teams that want code-first tests, aligned SDK behavior, and one runtime and reporting model across distributed system boundaries.
When Simpler Tools Are Enough
If the workload is purely request-response and the only question is endpoint throughput or latency, an endpoint-focused tool can still be a reasonable choice. LoadStrike becomes more valuable when the system only feels complete after a correlated downstream result arrives.
Concept and scenario samples
Use these examples to connect the concept on this page back to the scenario and reporting model that the runtime actually exposes.
If you run these examples locally, add a valid runner key before execution starts. Set it with WithRunnerKey("...") or the config key LoadStrike:RunnerKey.
When LoadStrike Fits
using LoadStrike;
var httpClient = new HttpClient
{
BaseAddress = new Uri("https://api.example.com")
};
var scenario = LoadStrikeScenario.Create("read-order", async context =>
{
var orderId = $"ord-{context.InvocationNumber}";
var step = await LoadStrikeStep.Run<string>("GET /orders/{id}", context, async () =>
{
using var response = await httpClient.GetAsync($"/orders/{orderId}");
return response.IsSuccessStatusCode
? LoadStrikeResponse.Ok<string>(statusCode: ((int)response.StatusCode).ToString())
: LoadStrikeResponse.Fail<string>(
statusCode: ((int)response.StatusCode).ToString(),
message: "Order lookup failed");
});
return step.AsReply();
})
.WithLoadSimulations(
LoadStrikeSimulation.Inject(10, TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(20))
);
LoadStrikeRunner.RegisterScenarios(scenario)
.WithRunnerKey("rkl_your_local_runner_key")
.Run();
package main
import (
"io"
"net/http"
"strconv"
loadstrike "loadstrike.com/sdk/go"
)
func main() {
scenario := loadstrike.CreateScenario("read-order", func(ctx loadstrike.LoadStrikeScenarioContext) loadstrike.LoadStrikeReply {
return loadstrike.LoadStrikeStep.Run("GET /orders/{id}", ctx, func(loadstrike.LoadStrikeScenarioContext) loadstrike.LoadStrikeReply {
request, err := http.NewRequest(http.MethodGet, "https://api.example.com/orders/ord-1001", nil)
if err != nil {
return loadstrike.LoadStrikeResponse.Fail("request_build_failed", int64(0), err.Error())
}
response, err := http.DefaultClient.Do(request)
if err != nil {
return loadstrike.LoadStrikeResponse.Fail("http_request_failed", int64(0), err.Error())
}
defer response.Body.Close()
_, _ = io.Copy(io.Discard, response.Body)
if response.StatusCode < 400 {
return loadstrike.LoadStrikeResponse.Ok(strconv.Itoa(response.StatusCode), int64(0), "ok")
}
return loadstrike.LoadStrikeResponse.Fail(strconv.Itoa(response.StatusCode), int64(0), "Order lookup failed")
})
}).
WithLoadSimulations(loadstrike.LoadStrikeSimulation.Inject(10, loadstrike.DurationFromSeconds(1), loadstrike.DurationFromSeconds(20)))
loadstrike.RegisterScenarios(scenario).
WithRunnerKey("rkl_your_local_runner_key").
Run()
}
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import com.loadstrike.runtime.LoadStrikeRuntime.LoadStrikeResponse;
import com.loadstrike.runtime.LoadStrikeRuntime.LoadStrikeRunner;
import com.loadstrike.runtime.LoadStrikeRuntime.LoadStrikeScenario;
import com.loadstrike.runtime.LoadStrikeRuntime.LoadStrikeSimulation;
import com.loadstrike.runtime.LoadStrikeRuntime.LoadStrikeStep;
var client = HttpClient.newHttpClient();
var scenario = LoadStrikeScenario
.create("read-order", context -> LoadStrikeStep.run("GET /orders/{id}", context, () -> {
String orderId = "ord-" + context.invocationNumber;
var request = HttpRequest.newBuilder(URI.create("https://api.example.com/orders/" + orderId))
.GET()
.build();
var response = client.sendAsync(request, HttpResponse.BodyHandlers.ofString()).join();
return response.statusCode() < 400
? LoadStrikeResponse.ok(Integer.toString(response.statusCode()))
: LoadStrikeResponse.fail(Integer.toString(response.statusCode()), "Order lookup failed");
}).asReply())
.withLoadSimulations(LoadStrikeSimulation.inject(10, 1d, 20d));
LoadStrikeRunner
.registerScenarios(scenario)
.withRunnerKey("rkl_your_local_runner_key")
.run();
import requests
from loadstrike_sdk import (
LoadStrikeResponse,
LoadStrikeRunner,
LoadStrikeScenario,
LoadStrikeSimulation,
LoadStrikeStep,
)
def read_order(context):
def run_step():
order_id = f"ord-{context.invocation_number}"
response = requests.get(f"https://api.example.com/orders/{order_id}", timeout=15)
if response.ok:
return LoadStrikeResponse.ok(str(response.status_code))
return LoadStrikeResponse.fail(str(response.status_code), "Order lookup failed")
return LoadStrikeStep.run("GET /orders/{id}", context, run_step).as_reply()
scenario = (
LoadStrikeScenario.create("read-order", read_order)
.with_load_simulations(LoadStrikeSimulation.inject(10, 1, 20))
)
LoadStrikeRunner.register_scenarios(scenario) \
.with_runner_key("rkl_your_local_runner_key") \
.run()
import {
LoadStrikeResponse,
LoadStrikeRunner,
LoadStrikeScenario,
LoadStrikeSimulation,
LoadStrikeStep
} from "@loadstrike/loadstrike-sdk";
const scenario = LoadStrikeScenario
.create("read-order", async (context) => {
return LoadStrikeStep.run("GET /orders/{id}", context, async () => {
const orderId = `ord-${context.invocationNumber}`;
const response = await fetch(`https://api.example.com/orders/${orderId}`);
return response.ok
? LoadStrikeResponse.ok(String(response.status))
: LoadStrikeResponse.fail(String(response.status), "Order lookup failed");
});
})
.withLoadSimulations(LoadStrikeSimulation.inject(10, 1, 20));
await LoadStrikeRunner
.registerScenarios(scenario)
.withRunnerKey("rkl_your_local_runner_key")
.run();
const {
LoadStrikeResponse,
LoadStrikeRunner,
LoadStrikeScenario,
LoadStrikeSimulation,
LoadStrikeStep
} = require("@loadstrike/loadstrike-sdk");
(async () => {
const scenario = LoadStrikeScenario
.create("read-order", async (context) => {
return LoadStrikeStep.run("GET /orders/{id}", context, async () => {
const orderId = `ord-${context.invocationNumber}`;
const response = await fetch(`https://api.example.com/orders/${orderId}`);
return response.ok
? LoadStrikeResponse.ok(String(response.status))
: LoadStrikeResponse.fail(String(response.status), "Order lookup failed");
});
})
.withLoadSimulations(LoadStrikeSimulation.inject(10, 1, 20));
await LoadStrikeRunner
.registerScenarios(scenario)
.withRunnerKey("rkl_your_local_runner_key")
.run();
})();
Good fit signals
Start with a simple request-step scenario when you only need to validate the first runnable path.
Move into tracked source and destination definitions when the workflow spans APIs, queues, services, or browser steps.
Choose LoadStrike when the important metric is whether the transaction finishes, not only whether ingress accepted the call.