@loadstrike/loadstrike-sdk 1.0.31001 → 1.0.32601

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 (45) hide show
  1. package/README.md +16 -2
  2. package/dist/cjs/internal/prometheus-remote-write.js +37 -0
  3. package/dist/cjs/internal/reporting-sink-http-error.js +17 -0
  4. package/dist/cjs/internal/vendor-metric-payloads.js +390 -0
  5. package/dist/cjs/iteration-observations.js +24 -8
  6. package/dist/cjs/local-report-input.js +21 -0
  7. package/dist/cjs/local.js +48 -63
  8. package/dist/cjs/report-history.js +421 -0
  9. package/dist/cjs/reporting-containment.js +242 -0
  10. package/dist/cjs/reporting-svg.js +116 -0
  11. package/dist/cjs/reporting.js +413 -136
  12. package/dist/cjs/runtime.js +237 -8
  13. package/dist/cjs/sinks.js +1337 -38
  14. package/dist/cjs/transports.js +1339 -151
  15. package/dist/esm/internal/prometheus-remote-write.js +31 -0
  16. package/dist/esm/internal/reporting-sink-http-error.js +13 -0
  17. package/dist/esm/internal/vendor-metric-payloads.js +382 -0
  18. package/dist/esm/iteration-observations.js +24 -8
  19. package/dist/esm/local-report-input.js +17 -0
  20. package/dist/esm/local.js +49 -64
  21. package/dist/esm/report-history.js +413 -0
  22. package/dist/esm/reporting-containment.js +238 -0
  23. package/dist/esm/reporting-svg.js +113 -0
  24. package/dist/esm/reporting.js +413 -136
  25. package/dist/esm/runtime.js +239 -10
  26. package/dist/esm/sinks.js +1334 -35
  27. package/dist/esm/transports.js +1335 -151
  28. package/dist/types/contracts.d.ts +1 -0
  29. package/dist/types/index.d.ts +1 -1
  30. package/dist/types/internal/prometheus-remote-write.d.ts +2 -0
  31. package/dist/types/internal/reporting-sink-http-error.d.ts +6 -0
  32. package/dist/types/internal/vendor-metric-payloads.d.ts +48 -0
  33. package/dist/types/local-report-input.d.ts +6 -0
  34. package/dist/types/local.d.ts +0 -6
  35. package/dist/types/report-history.d.ts +124 -0
  36. package/dist/types/reporting-containment.d.ts +2 -0
  37. package/dist/types/reporting-svg.d.ts +2 -0
  38. package/dist/types/reporting.d.ts +6 -3
  39. package/dist/types/runtime.d.ts +24 -0
  40. package/dist/types/sinks.d.ts +134 -17
  41. package/dist/types/transports.d.ts +2 -0
  42. package/package.json +9 -3
  43. package/dist/cjs/internal-build.js +0 -4
  44. package/dist/esm/internal-build.js +0 -1
  45. package/dist/types/internal-build.d.ts +0 -1
@@ -259,6 +259,7 @@ export interface LoadStrikeWebSocketEndpointOptions {
259
259
  ConnectTimeoutSeconds?: number;
260
260
  CloseTimeoutSeconds?: number;
261
261
  ConnectionMetadata?: Record<string, string>;
262
+ NativeClient?: Record<string, unknown>;
262
263
  }
263
264
  export interface LoadStrikeReportingSinkSpec {
264
265
  Kind: string;
@@ -11,4 +11,4 @@ export type { CorrelationEntry, DestinationConsumeResult, GatheredRow, Correlati
11
11
  export { LOADSTRIKE_TRACE_ID_HEADER, LOADSTRIKE_TRACE_ID_TRACKING_FIELD, TrafficEndpointDefinition, HttpEndpointDefinition, KafkaEndpointDefinition, KafkaSaslOptions, RabbitMqEndpointDefinition, NatsEndpointDefinition, RedisStreamsEndpointDefinition, AzureEventHubsEndpointDefinition, SqsEndpointDefinition, DelegateStreamEndpointDefinition, PushDiffusionEndpointDefinition, GrpcEndpointDefinition, GrpcMethodTypes, GrpcNativeClientOptions, GrpcStatusMapper, ProtocolMetricSnapshot, WebSocketEndpointDefinition, WebSocketExpectedMessage, WebSocketMessageSpec, WebSocketNativeClientOptions, WebSocketReconnectPolicy, HttpOAuth2ClientCredentialsOptions, HttpAuthOptions } from "./transports.js";
12
12
  export type { EndpointAdapter, EndpointDefinition, EndpointDefinitionInput, EndpointKind, EndpointMode, DotNetDelegateEndpointOptions, DotNetEndpointDefinition, DotNetHttpAuthOptions, DotNetHttpEndpointOptions, DotNetHttpOAuth2ClientCredentialsOptions, HttpAuthMode, HttpAuthType, HttpRequestBodyType, HttpResponseSource, HttpTrackingPayloadSource, KafkaSaslMechanismType, KafkaSecurityProtocolType, HttpEndpointOptions, KafkaEndpointOptions, RabbitMqEndpointOptions, NatsEndpointOptions, RedisStreamsEndpointOptions, AzureEventHubsEndpointOptions, SqsEndpointOptions, PushDiffusionEndpointOptions, GrpcEndpointOptions, WebSocketEndpointOptions, GrpcEndpointDefinition as GrpcEndpointDefinitionShape, WebSocketEndpointDefinition as WebSocketEndpointDefinitionShape, TrackingFieldSelectorInput, TrackingRunMode, TrafficEndpointKind, TrafficEndpointMode, ProducedMessageRequest, ProducedMessageResult, ConsumedMessage, DelegateConsumeAsync, DelegateConsumeStreamHandler, DelegateEndpointOptions } from "./transports.js";
13
13
  export { DatadogReportingSink, DatadogReportingSinkOptions, DogStatsDReportingSink, CloudWatchReportingSink, DynatraceReportingSink, ElasticsearchReportingSink, GrafanaLokiReportingSink, GrafanaLokiReportingSinkOptions, GenericWebhookReportingSink, InfluxDbReportingSink, InfluxDbReportingSinkOptions, JsonlFileReportingSink, KafkaReportingSink, NetdataStatsDReportingSink, NewRelicReportingSink, OtelCollectorReportingSink, OtelCollectorReportingSinkOptions, OpenSearchReportingSink, PortalReportingSink, PrometheusRemoteWriteReportingSink, SplunkReportingSink, SplunkReportingSinkOptions, StatsDReportingSink, TimescaleDbReportingSink, TimescaleDbReportingSinkOptions } from "./sinks.js";
14
- export type { DatadogSinkOptions, ExpandedSinkOptionsInput, GrafanaLokiSinkOptions, InfluxDbSinkOptions, JsonlFileReportingSinkOptionsInput, KafkaReportingSinkOptionsInput, OtelCollectorSinkOptions, PortalReportingSinkOptionsInput, SplunkSinkOptions, StatsDReportingSinkOptionsInput, TimescaleDbSinkOptions } from "./sinks.js";
14
+ export type { CloudWatchReportingSinkOptionsInput, DatadogSinkOptions, DynatraceReportingSinkOptionsInput, ElasticsearchReportingSinkOptionsInput, ExpandedSinkOptionsInput, GrafanaLokiSinkOptions, InfluxDbSinkOptions, JsonlFileReportingSinkOptionsInput, KafkaReportingSinkOptionsInput, NewRelicReportingSinkOptionsInput, OpenSearchReportingSinkOptionsInput, OtelCollectorSinkOptions, PortalReportingSinkOptionsInput, PrometheusRemoteWriteReportingSinkOptionsInput, SplunkSinkOptions, StatsDReportingSinkOptionsInput, TimescaleDbSinkOptions } from "./sinks.js";
@@ -0,0 +1,2 @@
1
+ import { type EncodedProtocolPayload, type ProtocolMetricPoint } from "./vendor-metric-payloads.js";
2
+ export declare function encodePrometheusRemoteWrite(points: readonly ProtocolMetricPoint[], staticLabels?: Readonly<Record<string, string>>): EncodedProtocolPayload;
@@ -0,0 +1,6 @@
1
+ export declare class ReportingSinkHttpError extends Error {
2
+ readonly status: number;
3
+ readonly statusText: string;
4
+ readonly requestId: string;
5
+ constructor(sinkName: string, status: number, statusText: string, requestId: string);
6
+ }
@@ -0,0 +1,48 @@
1
+ export type ProtocolMetricKind = "count" | "gauge";
2
+ export interface ProtocolMetricPoint {
3
+ metricName: string;
4
+ metricKind: ProtocolMetricKind;
5
+ occurredUtc: Date;
6
+ value: number;
7
+ unitOfMeasure?: string;
8
+ scenario: string;
9
+ status: string;
10
+ runId?: string;
11
+ intervalMs?: number | bigint;
12
+ }
13
+ export interface EncodedProtocolPayload {
14
+ contentType: string;
15
+ body: Uint8Array;
16
+ }
17
+ export interface CloudWatchDimension {
18
+ Name: string;
19
+ Value: string;
20
+ }
21
+ export interface CloudWatchMetricDatum {
22
+ MetricName: string;
23
+ Dimensions: CloudWatchDimension[];
24
+ Value: number;
25
+ Unit?: string;
26
+ Timestamp: Date;
27
+ }
28
+ export interface CloudWatchPutMetricData {
29
+ Namespace: string;
30
+ MetricData: CloudWatchMetricDatum[];
31
+ }
32
+ type ProtocolSink = "prometheus" | "cloudwatch" | "dynatrace" | "newrelic";
33
+ export interface PreparedProtocolMetricPoint {
34
+ metricName: string;
35
+ metricKind: ProtocolMetricKind;
36
+ occurredUtc: Date;
37
+ value: number;
38
+ unitOfMeasure?: string;
39
+ intervalMs?: bigint;
40
+ attributes: Array<readonly [string, string]>;
41
+ }
42
+ export declare function createCloudWatchMetricData(namespace: string, points: readonly ProtocolMetricPoint[], staticDimensions?: Readonly<Record<string, string>>): CloudWatchPutMetricData;
43
+ export declare function encodeDynatraceMetrics(points: readonly ProtocolMetricPoint[], staticDimensions?: Readonly<Record<string, string>>): EncodedProtocolPayload;
44
+ export declare function encodeDynatraceMetricBatches(points: readonly ProtocolMetricPoint[], staticDimensions?: Readonly<Record<string, string>>, maximumBodyBytesExclusive?: number): EncodedProtocolPayload[];
45
+ export declare function encodeNewRelicMetricBatch(points: readonly ProtocolMetricPoint[], staticAttributes?: Readonly<Record<string, string>>): EncodedProtocolPayload;
46
+ export declare function encodeNewRelicMetricBatches(points: readonly ProtocolMetricPoint[], staticAttributes?: Readonly<Record<string, string>>, maximumBodyBytesExclusive?: number): EncodedProtocolPayload[];
47
+ export declare function prepareProtocolMetricPoints(sink: ProtocolSink, points: readonly ProtocolMetricPoint[], staticAttributes?: Readonly<Record<string, string>>): PreparedProtocolMetricPoint[];
48
+ export {};
@@ -0,0 +1,6 @@
1
+ import type { ReportHistoryProjection } from "./report-history.js";
2
+ export interface LocalReportInput {
3
+ history: ReportHistoryProjection;
4
+ }
5
+ export declare function emptyLocalReportInput(): LocalReportInput;
6
+ export declare function distributedLocalReportInput(): LocalReportInput;
@@ -43,9 +43,6 @@ export declare class LoadStrikeLocalClient {
43
43
  private getLicensingRequest;
44
44
  }
45
45
  declare function sanitizeRequest(request: LoadStrikeRunRequest): LoadStrikeRunRequest;
46
- declare function normalizeLicensingApiBaseUrl(value: string | undefined): string;
47
- declare function resolveLicensingApiBaseUrl(): string;
48
- declare function setDevelopmentLicensingApiBaseUrlOverride(value: string | undefined): void;
49
46
  declare function normalizeTimeoutMs(value: number | undefined): number;
50
47
  declare function collectRequestedFeatures(request: LoadStrikeRunRequest): string[];
51
48
  declare function mapEnvironmentClassification(value: string): number;
@@ -146,8 +143,6 @@ export declare const __loadstrikeTestExports: {
146
143
  mapEnvironmentClassification: typeof mapEnvironmentClassification;
147
144
  mapEndpointSpec: typeof mapEndpointSpec;
148
145
  normalizeEndpointPayloadValue: typeof normalizeEndpointPayloadValue;
149
- normalizeLicensingApiBaseUrl: typeof normalizeLicensingApiBaseUrl;
150
- resolveLicensingApiBaseUrl: typeof resolveLicensingApiBaseUrl;
151
146
  normalizeNodeType: typeof normalizeNodeType;
152
147
  normalizePayload: typeof normalizePayload;
153
148
  normalizeStringArray: typeof normalizeStringArray;
@@ -166,7 +161,6 @@ export declare const __loadstrikeTestExports: {
166
161
  sanitizeLooseJson: typeof sanitizeLooseJson;
167
162
  sanitizeRequest: typeof sanitizeRequest;
168
163
  setJsonPathValue: typeof setJsonPathValue;
169
- setDevelopmentLicensingApiBaseUrlOverride: typeof setDevelopmentLicensingApiBaseUrlOverride;
170
164
  sleep: typeof sleep;
171
165
  stringOrDefault: typeof stringOrDefault;
172
166
  toBoolean: typeof toBoolean;
@@ -0,0 +1,124 @@
1
+ export declare const REPORT_HISTORY_MAX_POINTS = 2048;
2
+ export declare const REPORT_HISTORY_MAX_SCALAR_VALUES = 262144;
3
+ export type ReportHistoryReasonCategory = "capture_failure" | "budget_pressure" | "distributed_temporal_aggregation_unavailable";
4
+ export interface ReportHistoryMeasurement {
5
+ count: number;
6
+ bytes: number;
7
+ approximate?: boolean;
8
+ percent50Ms?: number;
9
+ percent75Ms?: number;
10
+ percent95Ms?: number;
11
+ percent99Ms?: number;
12
+ }
13
+ export interface ReportHistoryScenario {
14
+ scenarioName: string;
15
+ sortIndex?: number;
16
+ all?: ReportHistoryMeasurement;
17
+ ok?: ReportHistoryMeasurement;
18
+ failed?: ReportHistoryMeasurement;
19
+ }
20
+ export interface ReportHistoryPoint {
21
+ elapsedSeconds: number;
22
+ terminal: boolean;
23
+ scenarios: ReportHistoryScenario[];
24
+ }
25
+ export interface AvailableReportHistoryProjection {
26
+ status: "available";
27
+ points: ReportHistoryPoint[];
28
+ }
29
+ export interface UnavailableReportHistoryProjection {
30
+ status: "unavailable";
31
+ reasonCategory: ReportHistoryReasonCategory;
32
+ points: [];
33
+ }
34
+ export type ReportHistoryProjection = AvailableReportHistoryProjection | UnavailableReportHistoryProjection;
35
+ export interface ReportHistoryRateSeries {
36
+ scenarioName: string;
37
+ values: Array<number | null>;
38
+ }
39
+ export interface ReportHistoryCollectorOptions {
40
+ scenarioCount: number;
41
+ maxPoints?: number;
42
+ nowNs?: () => bigint;
43
+ onCaptureError?: (error: unknown) => void;
44
+ }
45
+ /**
46
+ * Bounded report-only cumulative telemetry. This type is intentionally not
47
+ * exported from the package entry point and never participates in public run,
48
+ * sink, observation, or cluster payloads.
49
+ */
50
+ export declare class ReportHistoryCollector {
51
+ readonly pointLimit: number;
52
+ private readonly nowNs;
53
+ private readonly onCaptureError?;
54
+ private points;
55
+ private startNs;
56
+ private terminalCaptured;
57
+ private reasonCategory;
58
+ constructor(options: ReportHistoryCollectorOptions);
59
+ get available(): boolean;
60
+ start(startNs?: bigint): void;
61
+ capture(snapshotFactory: () => readonly ReportHistoryScenario[]): boolean;
62
+ finalize(snapshotFactory: () => readonly ReportHistoryScenario[]): boolean;
63
+ disable(reasonCategory: ReportHistoryReasonCategory): void;
64
+ toProjection(): ReportHistoryProjection;
65
+ private captureSafely;
66
+ private compact;
67
+ }
68
+ export interface ReportHistoryWorkerOptions {
69
+ collector: ReportHistoryCollector;
70
+ cadenceSeconds: number;
71
+ snapshotFactory: () => readonly ReportHistoryScenario[];
72
+ nowNs?: () => bigint;
73
+ onFailure?: (category: ReportHistoryReasonCategory, exceptionClasses: string) => void;
74
+ }
75
+ interface ReportHistoryLifecycleWorker {
76
+ start(): void;
77
+ stopAndFinalize(): void;
78
+ stopWithoutFinalizing(): void;
79
+ }
80
+ /**
81
+ * Coordinates one private history worker across every local scenario. The
82
+ * first measured phase establishes the history clock, and the last scenario
83
+ * leaving execution records the terminal point before scenario cleanup.
84
+ */
85
+ export declare class ReportHistoryLifecycleCoordinator {
86
+ private readonly worker;
87
+ private readonly scenarioCount;
88
+ private readonly terminalBoundary;
89
+ private releaseTerminalBoundary;
90
+ private measuredLoadStarted;
91
+ private endedScenarios;
92
+ private completed;
93
+ private terminalBoundaryReleased;
94
+ constructor(worker: ReportHistoryLifecycleWorker & {
95
+ scenarioCount?: number;
96
+ });
97
+ scenarioBombingStarted(): void;
98
+ scenarioExecutionEnded(): Promise<void>;
99
+ stopWithoutFinalizing(): void;
100
+ private releaseBoundary;
101
+ }
102
+ /**
103
+ * Owns the report timer. Every cadence calculation, timeout callback, snapshot,
104
+ * and projection is exception-bounded so report history can never fail a run.
105
+ */
106
+ export declare class ReportHistoryWorker {
107
+ private readonly options;
108
+ private readonly nowNs;
109
+ private timer;
110
+ private cadenceNs;
111
+ private nextDeadlineNs;
112
+ private running;
113
+ constructor(options: ReportHistoryWorkerOptions);
114
+ get started(): boolean;
115
+ start(): void;
116
+ stopAndFinalize(): void;
117
+ stopWithoutFinalizing(): void;
118
+ private scheduleNext;
119
+ private onTimer;
120
+ private fail;
121
+ }
122
+ export declare function sanitizedExceptionClassChain(error: unknown): string;
123
+ export declare function deriveScenarioRates(points: readonly ReportHistoryPoint[]): ReportHistoryRateSeries[];
124
+ export {};
@@ -0,0 +1,2 @@
1
+ export declare function assertNoUnsupportedReportingInfraConfig(infraConfig: unknown, sinks?: readonly unknown[]): void;
2
+ export declare function assertNoUnsupportedReportingSinkGraph(sinks: readonly unknown[]): void;
@@ -0,0 +1,2 @@
1
+ export declare const REPORT_SVG_CSS: string;
2
+ export declare const REPORT_SVG_SCRIPT: string;
@@ -1,3 +1,4 @@
1
+ import { type LocalReportInput } from "./local-report-input.js";
1
2
  type ReportRecord = Record<string, any>;
2
3
  type ReportTab = [string, string, string];
3
4
  declare function buildUngroupedCorrelationChartPayload(rows: ReportRecord[]): ReportRecord;
@@ -14,7 +15,7 @@ declare function buildDotnetMetricHtml(nodeStats: ReportRecord): string;
14
15
  declare function buildDotnetGroupedCorrelationSummaryHtml(rows: ReportRecord[], groupedChartKey: string): string;
15
16
  declare function buildDotnetUngroupedCorrelationSummaryHtml(rows: ReportRecord[], groupedChartKey: string): string;
16
17
  declare function buildDotnetPluginHints(plugin: ReportRecord): string;
17
- declare function buildDotnetHtmlTabs(nodeStats: ReportRecord): ReportTab[];
18
+ declare function buildDotnetHtmlTabs(nodeStats: ReportRecord, localReportInput?: LocalReportInput): ReportTab[];
18
19
  /**
19
20
  * Exposes the build dotnet txt report operation. Use this when interacting with the SDK through this surface.
20
21
  */
@@ -28,9 +29,11 @@ export declare function buildDotnetCsvReport(nodeStats: ReportRecord): string;
28
29
  */
29
30
  export declare function buildDotnetMarkdownReport(nodeStats: ReportRecord): string;
30
31
  /**
31
- * Exposes the build dotnet html report operation. Use this when interacting with the SDK through this surface.
32
+ * Builds the portable single-file HTML report. The optional second argument is
33
+ * an internal report-only carrier used by the native runner and is never added
34
+ * to public result, sink, observation, or cluster payloads.
32
35
  */
33
- export declare function buildDotnetHtmlReport(nodeStats: ReportRecord): string;
36
+ export declare function buildDotnetHtmlReport(nodeStats: ReportRecord, localReportInput?: LocalReportInput): string;
34
37
  export declare const __loadstrikeTestExports: {
35
38
  buildDotnetFailedResponseContent: typeof buildDotnetFailedResponseContent;
36
39
  buildDotnetFailedResponseHtml: typeof buildDotnetFailedResponseHtml;
@@ -1,6 +1,7 @@
1
1
  import { type ClusterNodeResult, type LoadEngineV2PlanInput } from "./cluster.js";
2
2
  import { RedisCorrelationStore, RedisCorrelationStoreOptions, TrackingFieldSelector, type TrackingPayload } from "./correlation.js";
3
3
  import { type EndpointAdapter, type EndpointDefinition } from "./transports.js";
4
+ import { type ReportHistoryMeasurement, type ReportHistoryScenario } from "./report-history.js";
4
5
  import { LoadEngineV2ExecutionBudget, type LoadEngineV2DistributionRecord, type LoadStrikeHistogramV1Sidecar } from "./load-engine-v2.js";
5
6
  import { type LoadStrikeIterationObservationBatchV1, type LoadStrikeIterationObservationStreamCompletionV1, type LoadStrikeIterationStepObservationV1, type LoadStrikeObservationDeliveryStats } from "./iteration-observations.js";
6
7
  declare const LOAD_ENGINE_V2_SCHEDULER_DISTRIBUTIONS: unique symbol;
@@ -570,6 +571,17 @@ declare class MeasurementAccumulator {
570
571
  */
571
572
  build(allRequestCount: number, durationMs: number): LoadStrikeMeasurementStats;
572
573
  buildCombined(other: MeasurementAccumulator, allRequestCount: number, durationMs: number): LoadStrikeMeasurementStats;
574
+ /**
575
+ * Projects only the cumulative fields used by the private HTML-report
576
+ * history. Legacy distributions deliberately omit latency so this cadence
577
+ * path never scans their retained per-request arrays.
578
+ */
579
+ buildReportHistoryMeasurement(): ReportHistoryMeasurement;
580
+ /**
581
+ * Combines only bounded native latency state plus exact counters. It does
582
+ * not materialize status rows or any public measurement DTO.
583
+ */
584
+ buildCombinedReportHistoryMeasurement(other: MeasurementAccumulator): ReportHistoryMeasurement;
573
585
  private histogramSnapshot;
574
586
  }
575
587
  declare class StepStatsAccumulator {
@@ -627,6 +639,11 @@ declare class ScenarioStatsAccumulator {
627
639
  * Use this when the surrounding wrapper type makes this operation the clearest way to express your intent.
628
640
  */
629
641
  recordStep(stepName: string, reply: LoadStrikeStepReply, observedLatencyMs: number, sortIndex?: number): number;
642
+ /**
643
+ * Captures the bounded, private history view without building scenario
644
+ * steps, status rows, plugins, aliases, or any other public result shape.
645
+ */
646
+ buildReportHistorySnapshot(): ReportHistoryScenario;
630
647
  /**
631
648
  * Builds the configured payload or helper object.
632
649
  * Use this when all builder inputs are ready to be materialized.
@@ -2384,6 +2401,8 @@ export declare class LoadStrikeRunner {
2384
2401
  private collectPluginData;
2385
2402
  }
2386
2403
  declare function hasPluginRows(value: LoadStrikePluginData): boolean;
2404
+ declare function boundedReportingIntervalMs(seconds: number): number;
2405
+ declare function resolvedReportHistoryCadenceSeconds(seconds: number): number;
2387
2406
  declare function combineAbortSignals(...signals: AbortSignal[]): AbortSignal;
2388
2407
  declare function delayWithAbort(durationMs: number, signal: AbortSignal): Promise<void>;
2389
2408
  declare function createRuntimeRandom(): LoadStrikeRandom;
@@ -2434,6 +2453,7 @@ declare function normalizeThresholdScope(value: string): "scenario" | "step" | "
2434
2453
  declare function buildThresholdCheckExpression(scope: "scenario" | "step" | "metric", stepName: string, field: string): string;
2435
2454
  declare function detailedToNodeStats(result: LoadStrikeRunResult, metricStats?: LoadStrikeMetricStats): LoadStrikeNodeStats;
2436
2455
  declare function resolveClusterExecutionMode(options: LoadStrikeRunnerOptions): "single" | "local-coordinator" | "nats-coordinator" | "nats-agent";
2456
+ declare function isDistributedReportHistoryExecution(clusterMode: ReturnType<typeof resolveClusterExecutionMode>, options: Pick<LoadStrikeRunnerOptions, "clusterShardCount" | "loadEngineV2SegmentLifecycleOverride">): boolean;
2437
2457
  declare function buildEmptyNodeStats(args: {
2438
2458
  startedUtc: string;
2439
2459
  completedUtc: string;
@@ -2494,6 +2514,7 @@ declare class ManagedScenarioTrackingRuntime {
2494
2514
  dispose(): Promise<void>;
2495
2515
  private executeSourceOnly;
2496
2516
  private observeExistingTraffic;
2517
+ private interruptEndpointAdapters;
2497
2518
  private consumeSourceLoop;
2498
2519
  private consumeDestinationLoop;
2499
2520
  private runTimeoutSweepLoop;
@@ -2644,6 +2665,8 @@ export declare const __loadstrikeTestExports: {
2644
2665
  buildThresholdCheckExpression: typeof buildThresholdCheckExpression;
2645
2666
  buildTrackingLeaseKey: typeof buildTrackingLeaseKey;
2646
2667
  buildTrackingRunNamespace: typeof buildTrackingRunNamespace;
2668
+ boundedReportingIntervalMs: typeof boundedReportingIntervalMs;
2669
+ resolvedReportHistoryCadenceSeconds: typeof resolvedReportHistoryCadenceSeconds;
2647
2670
  clusterNodeResultToNodeStats: typeof clusterNodeResultToNodeStats;
2648
2671
  combineAbortSignals: typeof combineAbortSignals;
2649
2672
  computeScenarioRequestCount: typeof computeScenarioRequestCount;
@@ -2663,6 +2686,7 @@ export declare const __loadstrikeTestExports: {
2663
2686
  formatUtcReportTimestamp: typeof formatUtcReportTimestamp;
2664
2687
  hasPluginRows: typeof hasPluginRows;
2665
2688
  inferRuntimeLegacyHttpResponseSource: typeof inferRuntimeLegacyHttpResponseSource;
2689
+ isDistributedReportHistoryExecution: typeof isDistributedReportHistoryExecution;
2666
2690
  isComparisonFailed: typeof isComparisonFailed;
2667
2691
  loadJsonObject: typeof loadJsonObject;
2668
2692
  logLevelOrder: typeof logLevelOrder;
@@ -1,5 +1,8 @@
1
1
  import type { ILoadStrikeReportingSink, LoadStrikeBaseContext, LoadStrikeMetricStats, LoadStrikeMetricValue, LoadStrikeNodeInfo, LoadStrikePluginData, LoadStrikeReportingSink, LoadStrikeRunResult, LoadStrikeScenarioStats, LoadStrikeSessionStartInfo, LoadStrikeSinkError, LoadStrikeStepStats, LoadStrikeTestInfo, LoadStrikeThresholdResult } from "./runtime.js";
2
2
  import { type LoadStrikeIterationObservationBatchV1, type LoadStrikeIterationObservationStreamCompletionV1 } from "./iteration-observations.js";
3
+ import { type ProtocolMetricPoint } from "./internal/vendor-metric-payloads.js";
4
+ declare const SEND_DIRECT_VENDOR_PROTOCOL_POINTS: unique symbol;
5
+ declare const CLONE_DIRECT_VENDOR_FOR_RUN: unique symbol;
3
6
  interface LoadStrikeNodeStats {
4
7
  startedUtc: string;
5
8
  completedUtc: string;
@@ -489,7 +492,7 @@ export declare class PortalReportingSink implements LoadStrikeReportingSink {
489
492
  private persistObservationPayload;
490
493
  private currentRunToken;
491
494
  }
492
- export declare function cloneReportingSinkForRun(sink: LoadStrikeReportingSink): LoadStrikeReportingSink;
495
+ export declare function cloneReportingSinkForRun(sink: LoadStrikeReportingSink, infraConfig?: Record<string, unknown>, environment?: Readonly<Record<string, string | undefined>>): LoadStrikeReportingSink;
493
496
  export declare class InfluxDbReportingSink implements LoadStrikeReportingSink {
494
497
  readonly sinkName = "influxdb";
495
498
  readonly SinkName = "influxdb";
@@ -680,6 +683,8 @@ export declare class OtelCollectorReportingSink implements LoadStrikeReportingSi
680
683
  private persistEvents;
681
684
  }
682
685
  export interface ExpandedSinkOptionsInput {
686
+ ConfigurationSectionPath?: string;
687
+ configurationSectionPath?: string;
683
688
  BaseUrl?: string;
684
689
  baseUrl?: string;
685
690
  EndpointPath?: string;
@@ -695,6 +700,20 @@ export interface ExpandedSinkOptionsInput {
695
700
  FetchImpl?: SinkFetch;
696
701
  fetchImpl?: SinkFetch;
697
702
  }
703
+ export interface ElasticsearchReportingSinkOptionsInput extends ExpandedSinkOptionsInput {
704
+ IndexName?: string;
705
+ indexName?: string;
706
+ ApiKey?: string;
707
+ apiKey?: string;
708
+ }
709
+ export interface OpenSearchReportingSinkOptionsInput extends ExpandedSinkOptionsInput {
710
+ IndexName?: string;
711
+ indexName?: string;
712
+ Username?: string;
713
+ username?: string;
714
+ Password?: string;
715
+ password?: string;
716
+ }
698
717
  declare abstract class ExpandedEventReportingSink implements LoadStrikeReportingSink {
699
718
  readonly SinkName: string;
700
719
  readonly sinkName: string;
@@ -729,38 +748,128 @@ declare abstract class ExpandedEventReportingSink implements LoadStrikeReporting
729
748
  declare class ExpandedHttpJsonReportingSink extends ExpandedEventReportingSink {
730
749
  private readonly fetchImpl;
731
750
  private readonly baseUrl;
751
+ private readonly exactUrl;
732
752
  private readonly endpointPath;
733
753
  private readonly headers;
734
754
  private readonly staticTags;
735
755
  private readonly timeoutMs;
736
- constructor(sinkName: string, licenseFeature: string, defaultEndpointPath: string, options?: ExpandedSinkOptionsInput);
756
+ constructor(sinkName: string, licenseFeature: string, defaultEndpointPath: string, options?: ExpandedSinkOptionsInput, bindingOptions?: ExpandedSinkOptionsInput);
737
757
  init(context: LoadStrikeBaseContext, infraConfig: Record<string, unknown>): void;
738
758
  protected persistEvents(events: ReportingSinkEvent[]): Promise<void>;
739
759
  saveIterationBatch(batch: LoadStrikeIterationObservationBatchV1): Promise<void>;
740
760
  completeIterationObservationStream(completion: LoadStrikeIterationObservationStreamCompletionV1): Promise<void>;
741
761
  protected persistCanonicalGzipPayload(payload: unknown): Promise<void>;
762
+ private requestUrl;
742
763
  }
743
- export declare class PrometheusRemoteWriteReportingSink extends ExpandedHttpJsonReportingSink {
744
- readonly iterationObservationShapeLimited = true;
745
- constructor(options?: ExpandedSinkOptionsInput);
764
+ interface DirectVendorMetricSinkOptionsInput extends ExpandedSinkOptionsInput {
765
+ RunId?: string;
766
+ runId?: string;
767
+ ReportingIntervalSeconds?: number;
768
+ reportingIntervalSeconds?: number;
746
769
  }
747
- export declare class CloudWatchReportingSink extends ExpandedHttpJsonReportingSink {
748
- readonly iterationObservationShapeLimited = true;
749
- constructor(options?: ExpandedSinkOptionsInput);
770
+ export interface PrometheusRemoteWriteReportingSinkOptionsInput extends DirectVendorMetricSinkOptionsInput {
771
+ BearerToken?: string;
772
+ bearerToken?: string;
773
+ }
774
+ export interface CloudWatchReportingSinkOptionsInput extends DirectVendorMetricSinkOptionsInput {
775
+ Namespace?: string;
776
+ namespace?: string;
777
+ Region?: string;
778
+ region?: string;
779
+ AccessKeyId?: string;
780
+ accessKeyId?: string;
781
+ SecretAccessKey?: string;
782
+ secretAccessKey?: string;
783
+ SessionToken?: string;
784
+ sessionToken?: string;
785
+ EndpointUrl?: string;
786
+ endpointUrl?: string;
787
+ }
788
+ export interface DynatraceReportingSinkOptionsInput extends DirectVendorMetricSinkOptionsInput {
789
+ ApiToken?: string;
790
+ apiToken?: string;
750
791
  }
751
- export declare class DynatraceReportingSink extends ExpandedHttpJsonReportingSink {
792
+ export interface NewRelicReportingSinkOptionsInput extends DirectVendorMetricSinkOptionsInput {
793
+ LicenseKey?: string;
794
+ licenseKey?: string;
795
+ ApiKey?: string;
796
+ apiKey?: string;
797
+ }
798
+ declare abstract class DirectVendorMetricReportingSink extends ExpandedEventReportingSink {
752
799
  readonly iterationObservationShapeLimited = true;
753
- constructor(options?: ExpandedSinkOptionsInput);
800
+ protected readonly fetchImpl: SinkFetch;
801
+ protected readonly baseUrl: string;
802
+ protected readonly endpointPath: string;
803
+ protected readonly headers: Record<string, string>;
804
+ protected readonly staticTags: Record<string, string>;
805
+ protected readonly timeoutMs: number;
806
+ private readonly configuredRunId;
807
+ private readonly requireBaseUrl;
808
+ private configuredFirstIntervalMs;
809
+ private runStartedUtc;
810
+ private previousCounts;
811
+ private previousCountTimes;
812
+ private stateGeneration;
813
+ private stateQueue;
814
+ protected constructor(sinkName: string, licenseFeature: string, defaultEndpointPath: string, options: DirectVendorMetricSinkOptionsInput, requireBaseUrl?: boolean);
815
+ init(context: LoadStrikeBaseContext, infraConfig: Record<string, unknown>): void;
816
+ start(session: LoadStrikeSessionStartInfo): void;
817
+ stop(): void;
818
+ protected persistEvents(events: ReportingSinkEvent[]): Promise<void>;
819
+ protected abstract [SEND_DIRECT_VENDOR_PROTOCOL_POINTS](points: readonly ProtocolMetricPoint[]): Promise<void>;
820
+ abstract [CLONE_DIRECT_VENDOR_FOR_RUN](): DirectVendorMetricReportingSink;
821
+ private prepareStatefulPoints;
822
+ }
823
+ export declare class PrometheusRemoteWriteReportingSink extends DirectVendorMetricReportingSink {
824
+ private readonly bearerToken;
825
+ private readonly cloneOptions;
826
+ constructor(options?: PrometheusRemoteWriteReportingSinkOptionsInput);
827
+ [CLONE_DIRECT_VENDOR_FOR_RUN](): PrometheusRemoteWriteReportingSink;
828
+ protected [SEND_DIRECT_VENDOR_PROTOCOL_POINTS](points: readonly ProtocolMetricPoint[]): Promise<void>;
829
+ }
830
+ export declare class CloudWatchReportingSink extends DirectVendorMetricReportingSink {
831
+ private readonly namespace;
832
+ private readonly region;
833
+ private readonly accessKeyId;
834
+ private readonly secretAccessKey;
835
+ private readonly sessionToken;
836
+ private readonly cloneOptions;
837
+ private cloudWatchClient;
838
+ constructor(options?: CloudWatchReportingSinkOptionsInput);
839
+ [CLONE_DIRECT_VENDOR_FOR_RUN](): CloudWatchReportingSink;
840
+ init(context: LoadStrikeBaseContext, infraConfig: Record<string, unknown>): void;
841
+ Dispose(): void;
842
+ protected [SEND_DIRECT_VENDOR_PROTOCOL_POINTS](points: readonly ProtocolMetricPoint[]): Promise<void>;
843
+ }
844
+ export declare class DynatraceReportingSink extends DirectVendorMetricReportingSink {
845
+ private readonly apiToken;
846
+ private readonly cloneOptions;
847
+ constructor(options?: DynatraceReportingSinkOptionsInput);
848
+ [CLONE_DIRECT_VENDOR_FOR_RUN](): DynatraceReportingSink;
849
+ init(context: LoadStrikeBaseContext, infraConfig: Record<string, unknown>): void;
850
+ protected [SEND_DIRECT_VENDOR_PROTOCOL_POINTS](points: readonly ProtocolMetricPoint[]): Promise<void>;
851
+ }
852
+ export declare class NewRelicReportingSink extends DirectVendorMetricReportingSink {
853
+ private readonly licenseKey;
854
+ private readonly cloneOptions;
855
+ constructor(options?: NewRelicReportingSinkOptionsInput);
856
+ [CLONE_DIRECT_VENDOR_FOR_RUN](): NewRelicReportingSink;
857
+ init(context: LoadStrikeBaseContext, infraConfig: Record<string, unknown>): void;
858
+ protected [SEND_DIRECT_VENDOR_PROTOCOL_POINTS](points: readonly ProtocolMetricPoint[]): Promise<void>;
754
859
  }
755
860
  export declare class ElasticsearchReportingSink extends ExpandedHttpJsonReportingSink {
756
- constructor(options?: ExpandedSinkOptionsInput);
861
+ private readonly indexName;
862
+ private readonly usesIndexName;
863
+ constructor(options?: ElasticsearchReportingSinkOptionsInput);
864
+ init(context: LoadStrikeBaseContext, infraConfig: Record<string, unknown>): void;
757
865
  }
758
866
  export declare class OpenSearchReportingSink extends ExpandedHttpJsonReportingSink {
759
- constructor(options?: ExpandedSinkOptionsInput);
760
- }
761
- export declare class NewRelicReportingSink extends ExpandedHttpJsonReportingSink {
762
- readonly iterationObservationShapeLimited = true;
763
- constructor(options?: ExpandedSinkOptionsInput);
867
+ private readonly indexName;
868
+ private readonly usesIndexName;
869
+ private readonly username;
870
+ private readonly password;
871
+ constructor(options?: OpenSearchReportingSinkOptionsInput);
872
+ init(context: LoadStrikeBaseContext, infraConfig: Record<string, unknown>): void;
764
873
  }
765
874
  export declare class GenericWebhookReportingSink extends ExpandedHttpJsonReportingSink {
766
875
  protected preservesRawIterationObservations: boolean;
@@ -771,6 +880,8 @@ export declare class GenericWebhookReportingSink extends ExpandedHttpJsonReporti
771
880
  CompleteIterationObservationStream(completion: LoadStrikeIterationObservationStreamCompletionV1): Promise<void>;
772
881
  }
773
882
  export interface KafkaReportingSinkOptionsInput {
883
+ ConfigurationSectionPath?: string;
884
+ configurationSectionPath?: string;
774
885
  Topic?: string;
775
886
  topic?: string;
776
887
  BootstrapServers?: string;
@@ -782,15 +893,19 @@ export interface KafkaReportingSinkOptionsInput {
782
893
  }
783
894
  export declare class KafkaReportingSink extends ExpandedEventReportingSink {
784
895
  private readonly topic;
896
+ private readonly bootstrapServers;
785
897
  private readonly staticTags;
786
898
  private readonly publishAsync?;
787
899
  constructor(options?: KafkaReportingSinkOptionsInput);
900
+ init(context: LoadStrikeBaseContext, infraConfig: Record<string, unknown>): void;
788
901
  saveIterationBatch(batch: LoadStrikeIterationObservationBatchV1): Promise<void>;
789
902
  completeIterationObservationStream(completion: LoadStrikeIterationObservationStreamCompletionV1): Promise<void>;
790
903
  protected persistEvents(events: ReportingSinkEvent[]): Promise<void>;
791
904
  private publishCanonicalValue;
792
905
  }
793
906
  export interface StatsDReportingSinkOptionsInput {
907
+ ConfigurationSectionPath?: string;
908
+ configurationSectionPath?: string;
794
909
  Prefix?: string;
795
910
  prefix?: string;
796
911
  Host?: string;
@@ -827,6 +942,8 @@ export declare class NetdataStatsDReportingSink extends StatsDReportingSinkBase
827
942
  constructor(options?: StatsDReportingSinkOptionsInput);
828
943
  }
829
944
  export interface JsonlFileReportingSinkOptionsInput {
945
+ ConfigurationSectionPath?: string;
946
+ configurationSectionPath?: string;
830
947
  FilePath?: string;
831
948
  filePath?: string;
832
949
  StaticTags?: Record<string, string>;
@@ -886,7 +1003,7 @@ declare function cloneSessionStartInfo(session: LoadStrikeSessionStartInfo): Loa
886
1003
  declare function cloneMetricStats(metrics: LoadStrikeMetricStats): LoadStrikeMetricStats;
887
1004
  declare function cloneScenarioStats(value: LoadStrikeScenarioStats): LoadStrikeScenarioStats;
888
1005
  declare function cloneNodeStats(result: LoadStrikeNodeStats): LoadStrikeNodeStats;
889
- declare function postWithTimeout(fetchImpl: SinkFetch, url: string, init: RequestInit, timeoutMs: number, sinkName: string): Promise<string>;
1006
+ declare function postWithTimeout(fetchImpl: SinkFetch, url: string, init: RequestInit, timeoutMs: number, sinkName: string, ignoreSuccessfulResponseBody?: boolean): Promise<string>;
890
1007
  export declare const __loadstrikeTestExports: {
891
1008
  GrafanaLokiReportingSink: typeof GrafanaLokiReportingSink;
892
1009
  InfluxDbReportingSink: typeof InfluxDbReportingSink;
@@ -1009,6 +1009,7 @@ export interface EndpointAdapter {
1009
1009
  initialize?(): Promise<void>;
1010
1010
  produce(payload?: TrackingPayload): Promise<TrackingPayload | null>;
1011
1011
  consume(): Promise<TrackingPayload | null>;
1012
+ interrupt?(): void;
1012
1013
  dispose?(): Promise<void>;
1013
1014
  }
1014
1015
  declare class CallbackAdapter implements EndpointAdapter {
@@ -1068,6 +1069,7 @@ declare class SqsEndpointAdapter extends CallbackAdapter {
1068
1069
  export declare class EndpointAdapterFactory {
1069
1070
  static create(endpoint: EndpointDefinitionInput): EndpointAdapter;
1070
1071
  }
1072
+ export declare function validateNativeEndpointExecutionSupport(endpoint: EndpointDefinitionInput): void;
1071
1073
  declare function validateTrackingSelectorPath(expression: string, fieldName: "TrackingField" | "GatherByField"): void;
1072
1074
  declare function validateHttpEndpoint(endpoint: EndpointDefinition, mode: EndpointMode, hasModeDelegate: boolean): void;
1073
1075
  declare function applyHttpAuthHeaders(headers: Record<string, string>, options: HttpEndpointOptions, resolveOAuthToken: () => Promise<string>): Promise<void>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@loadstrike/loadstrike-sdk",
3
- "version": "1.0.31001",
3
+ "version": "1.0.32601",
4
4
  "description": "TypeScript and JavaScript SDK for in-process load execution, traffic correlation, and reporting.",
5
5
  "keywords": [
6
6
  "load-testing",
@@ -61,6 +61,7 @@
61
61
  "test:broker": "node --test --test-concurrency=1 tests/broker-integration.test.mjs tests/broker-distributed.test.mjs"
62
62
  },
63
63
  "dependencies": {
64
+ "@aws-sdk/client-cloudwatch": "^3.1045.0",
64
65
  "@aws-sdk/client-sqs": "^3.1045.0",
65
66
  "@azure/event-hubs": "^5.12.2",
66
67
  "@confluentinc/kafka-javascript": "^1.8.2",
@@ -68,7 +69,10 @@
68
69
  "amqplib": "^0.10.9",
69
70
  "nats": "^2.29.3",
70
71
  "pg": "^8.20.0",
71
- "redis": "^4.7.1"
72
+ "protobufjs": "^8.7.1",
73
+ "redis": "^4.7.1",
74
+ "snappyjs": "^0.7.0",
75
+ "ws": "^8.21.1"
72
76
  },
73
77
  "publishConfig": {
74
78
  "access": "public"
@@ -76,12 +80,14 @@
76
80
  "devDependencies": {
77
81
  "@types/amqplib": "^0.10.7",
78
82
  "@types/node": "^20.19.37",
83
+ "@types/snappyjs": "^0.7.1",
84
+ "@types/ws": "^8.18.1",
79
85
  "c8": "^11.0.0",
80
86
  "rimraf": "^6.0.1",
81
87
  "typescript": "^5.9.2"
82
88
  },
83
89
  "overrides": {
84
- "brace-expansion": "5.0.8",
90
+ "brace-expansion": "5.0.9",
85
91
  "tar": "7.5.21"
86
92
  }
87
93
  }
@@ -1,4 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.BLACKBOX_LICENSING_API_BASE_URL_TOKEN = void 0;
4
- exports.BLACKBOX_LICENSING_API_BASE_URL_TOKEN = "";