Expanded Built-In Sinks
Use the expanded sink set when LoadStrike run data should flow into observability platforms, databases, message streams, StatsD collectors, JSONL files, or a generic webhook destination.
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 the expanded sink set when LoadStrike run data should flow into observability platforms, databases, message streams, StatsD collectors, JSONL files, or a generic webhook destination.
Who this is for
Teams exporting final run data and realtime metrics into supported observability backends.
Prerequisites
- A run result or sink destination you want to wire into the wider observability stack
By the end
A sink-specific setup path that stays tied to the same LoadStrike report model.
Use this page when
Use this page when the local report is not the only destination and you need to wire realtime or final export into a supported sink.
Visual guide
Sample Report Data Rows
Scope Scenario Result Count RPS LatencyP50Ms LatencyP80Ms LatencyP85Ms LatencyP90Ms LatencyP95Ms LatencyP99Ms
Scenario reports-demo OK 675 15.0 21.4 30.2 33.0 36.8 48.6 72.1
LatencyTable Scenario Result Count LatencyP50Ms LatencyP95Ms
LatencyTable reports-demo OK 675 21.4 48.6
LatencyTable reports-demo FAIL 12 35.9 79.2
StatusCode Result Percent
200 OK 97.48
500 FAIL 2.52
FailedStatus Scope Scenario Step StatusCode Count Percent
FailedStatus Scenario reports-demo 500 12 1.75
Reporting
Realtime reporting
Choose Portal Reporting when users should review runs in the customer portal, pick the built-in sink page that matches the backend your team already runs, or open Custom Reporting when you need to implement your own destination. Each tab opens a dedicated page with the settings, behavior, and lifecycle details for that reporting path.
Guide
What The Expanded Set Covers
The expanded built-in sink set includes Prometheus remote write, Amazon CloudWatch, Dynatrace, Elasticsearch, OpenSearch, Kafka, StatsD, DogStatsD, New Relic, Netdata-compatible StatsD, JSONL file streaming, and generic webhook destinations. They sit alongside the existing InfluxDB, TimescaleDB, Grafana Loki, Datadog, Splunk HEC, OTEL Collector, portal reporting, and custom sink options.
Shared Export Model
Every built-in sink receives the same LoadStrike reporting model: realtime scenario stats, projected metrics, final run summaries, final metric snapshots, threshold results, report-file metadata, sink error metadata, and detailed report rows when the run produces them. Choose the destination based on where your team already reviews performance evidence.
Destination Families
Use Prometheus remote write, CloudWatch, Dynatrace, New Relic, StatsD, DogStatsD, or Netdata when metric workflows are the priority. Use Elasticsearch, OpenSearch, JSONL, or webhook sinks when searchable event envelopes are more useful. Use Kafka when the organization wants LoadStrike reporting events on an internal stream for downstream processing.
Configuration
Configure sinks directly in code or bind missing values from LoadStrike:ReportingSinks:* infra-config sections. HTTP-style sinks use endpoint URL, timeout, headers, and static tags. Kafka needs a topic and either a host-provided publisher or runtime configuration. JSONL needs a file path. StatsD-style sinks need the destination line sender or compatible host setup.
Failure Behavior
Sink initialization, realtime export, final export, stop, and dispose are isolated from scenario execution. Persistent sink failures are recorded in the run result and can disable that sink for the current run, while the load test itself continues.
Plan Gate
Expanded built-in reporting sinks are available on Enterprise. The same runner key validates the scenario, the selected sinks, portal reporting, and any transport features used by the run.
Expanded sink setup
Use these samples when LoadStrike reporting events should leave the local report pipeline and feed the observability, stream, file, or webhook destination your team already operates.
If you run these examples locally, add a valid runner key before execution starts. Set it with WithRunnerKey("...") or the config key LoadStrike:RunnerKey.
HTML reports also include the top-right Light/Dark theme toggle. Light is the default report theme.
Expanded Built-In Sinks
using LoadStrike;
var scenario = LoadStrikeScenario.Empty("orders-expanded-sinks")
.WithLoadSimulations(LoadStrikeSimulation.Inject(20, TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(120)));
var prometheus = new PrometheusRemoteWriteReportingSink(new PrometheusRemoteWriteReportingSinkOptions
{
BaseUrl = "https://prometheus.example.com",
BearerToken = "prometheus-token"
});
var kafka = new KafkaReportingSink(new KafkaReportingSinkOptions
{
Topic = "loadstrike-reporting",
PublishAsync = (topic, payload, cancellationToken) => Task.CompletedTask
});
var jsonl = new JsonlFileReportingSink(new JsonlFileReportingSinkOptions
{
FilePath = "./reports/loadstrike-events.jsonl"
});
var webhook = new GenericWebhookReportingSink(new GenericWebhookReportingSinkOptions
{
Url = "https://hooks.example.com/loadstrike",
Secret = "webhook-secret"
});
LoadStrikeRunner.RegisterScenarios(scenario)
.WithReportingInterval(TimeSpan.FromSeconds(5))
.WithReportingSinks(prometheus, kafka, jsonl, webhook)
.WithRunnerKey("rkl_your_enterprise_runner_key")
.Run();
package main
import loadstrike "loadstrike.com/sdk/go"
func main() {
scenario := loadstrike.EmptyScenario("orders-expanded-sinks").
WithLoadSimulations(loadstrike.LoadStrikeSimulation.Inject(20, loadstrike.DurationFromSeconds(1), loadstrike.DurationFromSeconds(120)))
context := loadstrike.RegisterScenarios(scenario).
WithReportingInterval(loadstrike.DurationFromSeconds(5)).
WithReportingSinks(
loadstrike.PrometheusRemoteWriteReportingSink{
Options: loadstrike.HTTPReportingSinkOptions{EndpointURL: "https://prometheus.example.com/api/v1/write"},
},
loadstrike.KafkaReportingSink{
Options: loadstrike.KafkaReportingSinkOptions{
Topic: "loadstrike-reporting",
Publish: func(topic string, payload string) error {
return nil
},
},
},
loadstrike.JsonlFileReportingSink{
Options: loadstrike.JsonlFileReportingSinkOptions{Path: "./reports/loadstrike-events.jsonl"},
},
loadstrike.GenericWebhookReportingSink{
Options: loadstrike.HTTPReportingSinkOptions{EndpointURL: "https://hooks.example.com/loadstrike"},
},
).
WithRunnerKey("rkl_your_enterprise_runner_key")
_ = context
}
import java.nio.file.Path;
import com.loadstrike.runtime.LoadStrikeRuntime.LoadStrikeRunner;
import com.loadstrike.runtime.LoadStrikeRuntime.LoadStrikeScenario;
import com.loadstrike.runtime.LoadStrikeRuntime.LoadStrikeSimulation;
import com.loadstrike.runtime.LoadStrikeSinks.GenericWebhookReportingSink;
import com.loadstrike.runtime.LoadStrikeSinks.JsonlFileReportingSink;
import com.loadstrike.runtime.LoadStrikeSinks.KafkaReportingSink;
import com.loadstrike.runtime.LoadStrikeSinks.PrometheusRemoteWriteReportingSink;
var scenario = LoadStrikeScenario.empty("orders-expanded-sinks")
.withLoadSimulations(LoadStrikeSimulation.inject(20, 1d, 120d));
LoadStrikeRunner.registerScenarios(scenario)
.withReportingInterval(5d)
.withReportingSinks(
new PrometheusRemoteWriteReportingSink(),
new KafkaReportingSink("loadstrike-reporting", (topic, payload) -> {}),
new JsonlFileReportingSink(Path.of("./reports/loadstrike-events.jsonl")),
new GenericWebhookReportingSink())
.withRunnerKey("rkl_your_enterprise_runner_key")
.run();
from loadstrike_sdk import (
GenericWebhookReportingSink,
JsonlFileReportingSink,
KafkaReportingSink,
LoadStrikeRunner,
LoadStrikeScenario,
LoadStrikeSimulation,
PrometheusRemoteWriteReportingSink,
)
scenario = (
LoadStrikeScenario.empty("orders-expanded-sinks")
.with_load_simulations(LoadStrikeSimulation.inject(20, 1, 120))
)
prometheus = PrometheusRemoteWriteReportingSink(
base_url="https://prometheus.example.com",
headers={"Authorization": "Bearer prometheus-token"},
)
kafka = KafkaReportingSink(
topic="loadstrike-reporting",
publish_async=lambda topic, payload: None,
)
jsonl = JsonlFileReportingSink(file_path="./reports/loadstrike-events.jsonl")
webhook = GenericWebhookReportingSink(
base_url="https://hooks.example.com",
endpoint_path="/loadstrike",
headers={"Authorization": "LoadStrike webhook-secret"},
)
LoadStrikeRunner.register_scenarios(scenario) \
.with_reporting_interval(5) \
.with_reporting_sinks(prometheus, kafka, jsonl, webhook) \
.with_runner_key("rkl_your_enterprise_runner_key") \
.run()
import {
GenericWebhookReportingSink,
JsonlFileReportingSink,
KafkaReportingSink,
LoadStrikeRunner,
LoadStrikeScenario,
LoadStrikeSimulation,
PrometheusRemoteWriteReportingSink
} from "@loadstrike/loadstrike-sdk";
const scenario = LoadStrikeScenario
.empty("orders-expanded-sinks")
.withLoadSimulations(LoadStrikeSimulation.inject(20, 1, 120));
const prometheus = new PrometheusRemoteWriteReportingSink({
BaseUrl: "https://prometheus.example.com",
Headers: { Authorization: "Bearer prometheus-token" }
});
const kafka = new KafkaReportingSink({
Topic: "loadstrike-reporting",
PublishAsync: async (_topic, _payload) => undefined
});
const jsonl = new JsonlFileReportingSink({ FilePath: "./reports/loadstrike-events.jsonl" });
const webhook = new GenericWebhookReportingSink({
BaseUrl: "https://hooks.example.com",
EndpointPath: "/loadstrike",
Headers: { Authorization: "LoadStrike webhook-secret" }
});
await LoadStrikeRunner
.registerScenarios(scenario)
.withReportingInterval(5)
.withReportingSinks(prometheus, kafka, jsonl, webhook)
.withRunnerKey("rkl_your_enterprise_runner_key")
.run();
const {
GenericWebhookReportingSink,
JsonlFileReportingSink,
KafkaReportingSink,
LoadStrikeRunner,
LoadStrikeScenario,
LoadStrikeSimulation,
PrometheusRemoteWriteReportingSink
} = require("@loadstrike/loadstrike-sdk");
(async () => {
const scenario = LoadStrikeScenario
.empty("orders-expanded-sinks")
.withLoadSimulations(LoadStrikeSimulation.inject(20, 1, 120));
const prometheus = new PrometheusRemoteWriteReportingSink({
BaseUrl: "https://prometheus.example.com",
Headers: { Authorization: "Bearer prometheus-token" }
});
const kafka = new KafkaReportingSink({
Topic: "loadstrike-reporting",
PublishAsync: async (_topic, _payload) => undefined
});
const jsonl = new JsonlFileReportingSink({ FilePath: "./reports/loadstrike-events.jsonl" });
const webhook = new GenericWebhookReportingSink({
BaseUrl: "https://hooks.example.com",
EndpointPath: "/loadstrike",
Headers: { Authorization: "LoadStrike webhook-secret" }
});
await LoadStrikeRunner
.registerScenarios(scenario)
.withReportingInterval(5)
.withReportingSinks(prometheus, kafka, jsonl, webhook)
.withRunnerKey("rkl_your_enterprise_runner_key")
.run();
})();
Expanded sink families
Prometheus remote write, CloudWatch, Dynatrace, New Relic, StatsD, DogStatsD, and Netdata-compatible StatsD are useful when dashboard and alert metric series are the primary destination.
Elasticsearch, OpenSearch, JSONL file streaming, and generic webhook sinks keep LoadStrike reporting events easy to search, replay, ship, or transform.
Kafka publishes LoadStrike reporting envelopes to a topic so downstream consumers can enrich, route, store, or alert on them.
All built-in sinks participate in the same Init, Start, SaveRealtimeStats, SaveRealtimeMetrics, SaveRunResult, Stop, and Dispose lifecycle.
Persistent sink failures are recorded in the result and can disable only the failing sink while the main run continues.
Expanded built-in sinks are available on Enterprise.
{
"LoadStrike": {
"ReportingSinks": {
"PrometheusRemoteWrite": {
"BaseUrl": "https://prometheus.example.com",
"EndpointPath": "/api/v1/write",
"BearerToken": "prometheus-token"
},
"CloudWatch": {
"Region": "eu-west-2",
"Namespace": "LoadStrike"
},
"Dynatrace": {
"BaseUrl": "https://dynatrace.example.com",
"ApiToken": "dynatrace-token"
},
"Elasticsearch": {
"BaseUrl": "https://elastic.example.com",
"IndexName": "loadstrike-runs"
},
"OpenSearch": {
"BaseUrl": "https://opensearch.example.com",
"IndexName": "loadstrike-runs"
},
"Kafka": {
"BootstrapServers": "kafka.example.com:9092",
"Topic": "loadstrike-reporting"
},
"StatsD": {
"Prefix": "loadstrike"
},
"DogStatsD": {
"Prefix": "loadstrike"
},
"NewRelic": {
"BaseUrl": "https://metric-api.newrelic.com",
"LicenseKey": "new-relic-license-key"
},
"Netdata": {
"Prefix": "loadstrike"
},
"Jsonl": {
"FilePath": "./reports/loadstrike-events.jsonl"
},
"Webhook": {
"Url": "https://hooks.example.com/loadstrike",
"Secret": "webhook-secret"
}
}
}
}
Use WithReportingSinks(...) for code-first setup, or LoadInfraConfig(...) when deployment-specific endpoint, token, topic, or file path values should live outside the test source.