Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Service Bus] StressTests scenarios #11546

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
65 commits
Select commit Hold shift + click to select a range
09ce3da
package.json and tsconfig.json
HarshaNalluru Sep 29, 2020
7c9fa2f
samples
HarshaNalluru Sep 29, 2020
22d7226
Add TODOs
HarshaNalluru Sep 29, 2020
68251f6
init.. cration and deletion on resources
HarshaNalluru Sep 29, 2020
5058a2a
Add a console.log
HarshaNalluru Sep 29, 2020
5b2d840
Grouping the metrics and info accordingly
HarshaNalluru Sep 29, 2020
2b41b67
update TODO
HarshaNalluru Sep 29, 2020
fc29a98
Added interfaces for grouping
HarshaNalluru Sep 29, 2020
2fc740d
Address Richar'd feedback
HarshaNalluru Sep 29, 2020
1366e52
minor todo
HarshaNalluru Sep 29, 2020
2810c23
Simplified messageLockRenewalTimers
HarshaNalluru Sep 29, 2020
2100a7b
JS Docs
HarshaNalluru Sep 29, 2020
f0cd9ef
minor changes to logs
HarshaNalluru Sep 29, 2020
8835660
renewLock -> renewMessageLockUntil
HarshaNalluru Sep 29, 2020
7704d75
formatting
HarshaNalluru Sep 29, 2020
49d8faa
readme
HarshaNalluru Sep 29, 2020
f383458
single sender - command line arguments
HarshaNalluru Sep 29, 2020
827ac0d
More TODOs
HarshaNalluru Sep 29, 2020
69e7e9e
messagesSent filling - missed
HarshaNalluru Sep 29, 2020
6470326
batch receive scenario args
HarshaNalluru Sep 30, 2020
d4d19e1
Add minimist package for command line args
HarshaNalluru Sep 30, 2020
bf2b89c
Update stress tests with command line args from minimist
HarshaNalluru Sep 30, 2020
9b5452d
file renames
HarshaNalluru Sep 30, 2020
5e56406
renew message lock - scenario completed - command line args and readm…
HarshaNalluru Sep 30, 2020
fdc2c8d
Renew session lock helper and info interface
HarshaNalluru Sep 30, 2020
1bd945c
arguments for init - name-prefix and CreateQueueOptions
HarshaNalluru Sep 30, 2020
e0b72c6
scenarioRenewSessionLock
HarshaNalluru Sep 30, 2020
a8797ee
fix naming, and minor issues and add readme entry for sessionLock ren…
HarshaNalluru Sep 30, 2020
2a27965
Update TODOs
HarshaNalluru Sep 30, 2020
c01694d
snapshot options and fix some TODOs
HarshaNalluru Sep 30, 2020
40bbbb2
autoLockRenewal - sessions
HarshaNalluru Oct 1, 2020
18e1aad
scenario streaming sample - readme - helper in the base class
HarshaNalluru Oct 1, 2020
3b38e24
fix snapshotInterval default
HarshaNalluru Oct 1, 2020
74ba5e5
reduce number of interfaces
HarshaNalluru Oct 1, 2020
85154fc
schedule messages
HarshaNalluru Oct 1, 2020
cfc2656
Add error dumping to file
HarshaNalluru Oct 1, 2020
8cb3f66
update tsconfig
HarshaNalluru Oct 1, 2020
6c880bc
formatting
HarshaNalluru Oct 1, 2020
3df5838
Add memory usage to the snapshot
HarshaNalluru Oct 2, 2020
c2eea4f
save logs to the report file
HarshaNalluru Oct 2, 2020
11e40cf
renewlock todos
HarshaNalluru Oct 2, 2020
c1767cc
trackedMessageIds object and uuid for messageId's
HarshaNalluru Oct 2, 2020
dab7cf8
saveDiscrepanciesFromTrackedMessages method and a generic utils file …
HarshaNalluru Oct 2, 2020
4ff7eab
change file name for messageReport and minor bug fix with trackedMess…
HarshaNalluru Oct 3, 2020
37a90c7
package json.. test script and removed "module" in tsconfig
HarshaNalluru Oct 4, 2020
3432d1d
Exclude stress tests in ts-config
HarshaNalluru Oct 5, 2020
6bfc01c
TrackedMessageIdsInfo - added settledCount, completeMessageAfterDurat…
HarshaNalluru Oct 5, 2020
9a353bd
limit the time for renewling locks and sending
HarshaNalluru Oct 5, 2020
da25cf7
readme rename
HarshaNalluru Oct 5, 2020
7b7cc46
peekMessages test
HarshaNalluru Oct 5, 2020
104657f
omit readme in stress folder
HarshaNalluru Oct 5, 2020
24141a5
update ommitted path
HarshaNalluru Oct 5, 2020
cb31810
close-open scenario draft
HarshaNalluru Oct 6, 2020
bbbac0a
close open scenario done
HarshaNalluru Oct 8, 2020
9f59851
Update sdk/servicebus/service-bus/test/stress-test-track-2/SetupAndGu…
HarshaNalluru Oct 9, 2020
85f92ba
pass fromSeqNum to peekMessages
HarshaNalluru Oct 9, 2020
6c7199f
Merge branch 'harshan/sb/service-bus-stress-base' of https://github.c…
HarshaNalluru Oct 9, 2020
5cc5ab7
Take in changes from preview.7
HarshaNalluru Oct 17, 2020
6df0f74
Merge branch 'master' of https://github.com/Azure/azure-sdk-for-js in…
HarshaNalluru Oct 21, 2020
0fe826e
pick up current generated package - for stress tests - to get the rec…
HarshaNalluru Oct 21, 2020
92a17fb
Add initializer options to the report
HarshaNalluru Oct 21, 2020
b38461a
Move logging to the top in init
HarshaNalluru Oct 22, 2020
8fe7cfd
stress base updates - take settleOnMessageReceived
HarshaNalluru Oct 22, 2020
f8796e0
settleMessageOnReceive option for batch receive
HarshaNalluru Oct 22, 2020
8a46d91
formatting
HarshaNalluru Oct 22, 2020
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions eng/.docsettings.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ omitted_paths:
- sdk/eventhub/*/test/README.md
- sdk/search/*/test/README.md
- sdk/servicebus/*/test/README.md
- sdk/servicebus/service-bus/test/stress-test-track-2/*
- sdk/schemaregistry/README.md
- sdk/servicebus/service-bus/samples-v1/*
- sdk/storage/*/test/README.md
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
### Setup

Before running the code,

- Setup the `SERVICEBUS_CONNECTION_STRING` environment variable. (Queue resource will be created in the beginning for the test period and teared down at the end)
- Run `rushx pack` at `sdk/servicebus/service-bus` folder to generate the current version of service-bus package. (Or skip this step and install the version that you prefer)
- Run `npm install` in this folder to install the Service Bus package that should be stress tested.

### Scenarios

Here are the scenarios being covered and how you can run them.

1. Single sender that keeps sending messages in series.
`ts-node scenarioSend.ts` (runs with defaults)
`ts-node scenarioSend.ts --numberOfMessagesPerSend=100 delayBetweenSendsInMs=50`(with flags)
Flags that can be set

- testDurationInMs (default = 3600000) // 60 minutes
- numberOfMessagesPerSend (default = 1)
- delayBetweenSendsInMs (default = 0)
- totalNumberOfMessagesToSend (default = Infinity)
- useScheduleApi (default = false)

2. Batch receive with a streaming sender
`ts-node scenarioBatchReceive.ts` (runs with defaults)
`ts-node scenarioBatchReceive.ts --delayBetweenReceivesInMs=200 --totalNumberOfMessagesToSend=5000` (With flags)
Flags that can be set

- testDurationInMs (default = 3600000) // 1hr
- receiveMode (default = "peekLock")
- receiveBatchMaxMessageCount (default = 10)
- receiveBatchMaxWaitTimeInMs (default = 10000)
- delayBetweenReceivesInMs (default = 0)
- numberOfMessagesPerSend (default = 1)
- delayBetweenSendsInMs (default = 0)
- totalNumberOfMessagesToSend (default = Infinity)

3. Renew message locks for a duration
`ts-node scenarioRenewMessageLock.ts` (runs with defaults)
`ts-node scenarioRenewMessageLock.ts --delayBetweenReceivesInMs=200 --totalNumberOfMessagesToSend=5000` (With flags)
Flags that can be set

- testDurationInMs (default = 3600000) // 1hr
- receiveBatchMaxMessageCount (default = 10)
- receiveBatchMaxWaitTimeInMs (default = 10000)
- delayBetweenReceivesInMs (default = 0)
- numberOfMessagesPerSend (default = 1)
- delayBetweenSendsInMs (default = 0)
- totalNumberOfMessagesToSend (default = Infinity)

4. Renew session locks for a duration
`ts-node scenarioRenewSessionLock.ts` (runs with defaults)
`ts-node scenarioRenewSessionLock.ts --delayBetweenReceivesInMs=200 --totalNumberOfMessagesToSend=5000` (With flags)
Flags that can be set

- testDurationInMs (default = 3600000) // 1hr
- receiveBatchMaxMessageCount (default = 10)
- receiveBatchMaxWaitTimeInMs (default = 10000)
- delayBetweenReceivesInMs (default = 0)
- numberOfMessagesPerSend (default = 100)
- delayBetweenSendsInMs (default = 0)
- totalNumberOfMessagesToSend (default = Infinity)
- autoLockRenewal (default = false)

5. Streaming Receive
`ts-node scenarioStreamingReceive.ts` (runs with defaults)
`ts-node scenarioStreamingReceive.ts --manualLockRenewal=false --totalNumberOfMessagesToSend=5000` (With flags)
Flags that can be set

- testDurationInMs (default = 3600000) // 1hr
- receiveMode (default = "peekLock")
- autoComplete (default = true)
- maxConcurrentCalls (default = 100)
- maxAutoRenewLockDurationInMs (default = 0)
- manualLockRenewal (default = true)
- numberOfMessagesPerSend (default = 1)
- delayBetweenSendsInMs (default = 0)
- totalNumberOfMessagesToSend (default = Infinity)
- completeMessageAfterDuration (default = true)

6. Management client - peek messages
`ts-node scenarioPeekMessages.ts` (runs with defaults)
`ts-node scenarioPeekMessages.ts --delayBetweenPeeksInMs=200 --totalNumberOfMessagesToSend=5000` (With flags)
Flags that can be set

- testDurationInMs (default = 3600000) // 1hr
- peekMaxMessageCount (default = 10)
- delayBetweenPeeksInMs (default = 0)
- numberOfMessagesPerSend (default = 1)
- delayBetweenSendsInMs (default = 0)
- totalNumberOfMessagesToSend (default = Infinity)
20 changes: 20 additions & 0 deletions sdk/servicebus/service-bus/test/stress-test-track-2/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
{
"name": "stress-test-track-2",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "ts-node scenarioBatchReceive.ts --testDurationInMs=10000 --recieveMode=receiveAndDelete"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"@azure/service-bus": "file:../../azure-service-bus-7.0.0-preview.8.tgz",
"minimist": "^1.2.5",
"uuid": "^8.3.0"
},
"devDependencies": {
"@types/uuid": "^8.3.0"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
import {
ReceiveMode,
ServiceBusClient,
ServiceBusReceivedMessage,
ServiceBusReceiver
} from "@azure/service-bus";
import { SBStressTestsBase } from "./stressTestsBase";
import { delay } from "rhea-promise";
import parsedArgs from "minimist";

// Load the .env file if it exists
import * as dotenv from "dotenv";
dotenv.config();

// Define connection string and related Service Bus entity names here
const connectionString = process.env.SERVICEBUS_CONNECTION_STRING || "<connection string>";

interface ScenarioReceiveBatchOptions {
testDurationInMs?: number;
receiveMode?: ReceiveMode;
receiveBatchMaxMessageCount?: number;
receiveBatchMaxWaitTimeInMs?: number;
delayBetweenReceivesInMs?: number;
numberOfMessagesPerSend?: number;
delayBetweenSendsInMs?: number;
totalNumberOfMessagesToSend?: number;
maxAutoLockRenewalDurationInMs?: number;
settleMessageOnReceive: boolean;
}

function sanitizeOptions(
options: ScenarioReceiveBatchOptions
): Required<ScenarioReceiveBatchOptions> {
return {
testDurationInMs: options.testDurationInMs || 60 * 60 * 1000, // Default = 60 minutes
receiveMode: (options.receiveMode as ReceiveMode) || "peekLock",
receiveBatchMaxMessageCount: options.receiveBatchMaxMessageCount || 10,
receiveBatchMaxWaitTimeInMs: options.receiveBatchMaxWaitTimeInMs || 10000,
delayBetweenReceivesInMs: options.delayBetweenReceivesInMs || 0,
numberOfMessagesPerSend: options.numberOfMessagesPerSend || 1,
delayBetweenSendsInMs: options.delayBetweenSendsInMs || 0,
totalNumberOfMessagesToSend: options.totalNumberOfMessagesToSend || Infinity,
maxAutoLockRenewalDurationInMs: options.maxAutoLockRenewalDurationInMs || 0, // 0 = disabled
settleMessageOnReceive: options.settleMessageOnReceive || false
};
}

export async function scenarioReceiveBatch() {
const testOptions = sanitizeOptions(parsedArgs<ScenarioReceiveBatchOptions>(process.argv));
const {
testDurationInMs,
receiveMode,
receiveBatchMaxMessageCount,
receiveBatchMaxWaitTimeInMs,
delayBetweenReceivesInMs,
numberOfMessagesPerSend,
delayBetweenSendsInMs,
totalNumberOfMessagesToSend,
maxAutoLockRenewalDurationInMs,
settleMessageOnReceive
} = testOptions;

// Sending stops after 70% of total duration to give the receiver a chance to clean up and receive all the messages
const testDurationForSendInMs = testDurationInMs * 0.7;

const startedAt = new Date();

const stressBase = new SBStressTestsBase({
snapshotFocus: ["send-info", "receive-info"]
});
const sbClient = new ServiceBusClient(connectionString);

await stressBase.init(undefined, undefined, testOptions);
const sender = sbClient.createSender(stressBase.queueName);
let receiver: ServiceBusReceiver<ServiceBusReceivedMessage>;

if (receiveMode === "receiveAndDelete") {
receiver = sbClient.createReceiver(stressBase.queueName, {
receiveMode: "receiveAndDelete",
maxAutoLockRenewalDurationInMs
});
} else {
receiver = sbClient.createReceiver(stressBase.queueName, { maxAutoLockRenewalDurationInMs });
}

async function sendMessages() {
let elapsedTime = new Date().valueOf() - startedAt.valueOf();
while (
elapsedTime < testDurationForSendInMs &&
stressBase.messagesSent.length < totalNumberOfMessagesToSend
) {
await stressBase.sendMessages([sender], numberOfMessagesPerSend);
elapsedTime = new Date().valueOf() - startedAt.valueOf();
await delay(delayBetweenSendsInMs);
}
}

async function receiveMessages() {
let elapsedTime = new Date().valueOf() - startedAt.valueOf();
while (elapsedTime < testDurationInMs) {
await stressBase.receiveMessages(
receiver,
receiveBatchMaxMessageCount,
receiveBatchMaxWaitTimeInMs,
settleMessageOnReceive
);
elapsedTime = new Date().valueOf() - startedAt.valueOf();
await delay(delayBetweenReceivesInMs);
}
}

await Promise.all([sendMessages(), receiveMessages()]);
await sbClient.close();

await stressBase.end();
}

scenarioReceiveBatch().catch((err) => {
console.log("Error occurred: ", err);
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
import { ServiceBusClient } from "@azure/service-bus";
import { SBStressTestsBase } from "./stressTestsBase";
import { delay } from "rhea-promise";
import parsedArgs from "minimist";

// Load the .env file if it exists
import * as dotenv from "dotenv";
dotenv.config();

// Define connection string and related Service Bus entity names here
const connectionString = process.env.SERVICEBUS_CONNECTION_STRING || "<connection string>";

interface ScenarioCloseOptions {
testDurationInMs?: number;
receiveBatchMaxMessageCount?: number;
receiveBatchMaxWaitTimeInMs?: number;
numberOfMessagesPerSend?: number;
delayBeforeCallingCloseInMs?: number;
shouldCreateNewClientEachTime?: boolean;
}

function sanitizeOptions(options: ScenarioCloseOptions): Required<ScenarioCloseOptions> {
return {
testDurationInMs: options.testDurationInMs || 60 * 1000, // Default = 60 minutes
receiveBatchMaxMessageCount: options.receiveBatchMaxMessageCount || 10,
receiveBatchMaxWaitTimeInMs: options.receiveBatchMaxWaitTimeInMs || 10000,
numberOfMessagesPerSend: options.numberOfMessagesPerSend || 1,
delayBeforeCallingCloseInMs: options.delayBeforeCallingCloseInMs || 100,
shouldCreateNewClientEachTime: options.shouldCreateNewClientEachTime || true
};
}

export async function scenarioClose() {
const testOptions = sanitizeOptions(parsedArgs<ScenarioCloseOptions>(process.argv));

const {
testDurationInMs,
receiveBatchMaxMessageCount,
receiveBatchMaxWaitTimeInMs,
numberOfMessagesPerSend,
delayBeforeCallingCloseInMs,
shouldCreateNewClientEachTime
} = testOptions;

const startedAt = new Date();

const stressBase = new SBStressTestsBase({
snapshotFocus: ["send-info", "receive-info", "close-info"]
});
let sbClient = new ServiceBusClient(connectionString);

await stressBase.init(undefined, undefined, testOptions);

let elapsedTime = new Date().valueOf() - startedAt.valueOf();
while (elapsedTime < testDurationInMs) {
const sender = sbClient.createSender(stressBase.queueName);
const receiver = sbClient.createReceiver(stressBase.queueName);
await stressBase.sendMessages([sender], numberOfMessagesPerSend);
await stressBase.receiveMessages(
receiver,
receiveBatchMaxMessageCount,
receiveBatchMaxWaitTimeInMs
);
await delay(delayBeforeCallingCloseInMs);
await stressBase.callClose(sender, "sender");
await stressBase.callClose(receiver, "receiver");
if (shouldCreateNewClientEachTime) {
await stressBase.callClose(sbClient, "client");
sbClient = new ServiceBusClient(connectionString);
}
elapsedTime = new Date().valueOf() - startedAt.valueOf();
}

await sbClient.close();
await stressBase.end();
}

scenarioClose().catch((err) => {
console.log("Error occurred: ", err);
});
Loading