From 4e4d5fd99cd64e5edc8067aaf4546e2e6cf0f76f Mon Sep 17 00:00:00 2001 From: surbhigarg92 Date: Wed, 5 Apr 2023 15:10:13 +0530 Subject: [PATCH 1/3] Updated ledger template for Data load test --- .../finance/ledger/sample-configs/setup.json | 2 +- .../finance/ledger/templates/data-load.jmx | 231 +++++++++++++++++- .../finance/ledger/templates/schema.sql | 65 +++-- 3 files changed, 261 insertions(+), 37 deletions(-) diff --git a/machmeter/usecases/finance/ledger/sample-configs/setup.json b/machmeter/usecases/finance/ledger/sample-configs/setup.json index 2dea5a4..222d0b2 100644 --- a/machmeter/usecases/finance/ledger/sample-configs/setup.json +++ b/machmeter/usecases/finance/ledger/sample-configs/setup.json @@ -18,7 +18,7 @@ "ipRangePodsName": "ip-range-pods", "ipRangeServicesName": "ip-range-services", "service_account_json": "sa.json", - "machineType": "e2-standard-2", + "machineType": "c2-standard-4", "nodeLocations": "us-central1-a,us-central1-b,us-central1-c", "minCount": 3, "maxCount": 3, diff --git a/machmeter/usecases/finance/ledger/templates/data-load.jmx b/machmeter/usecases/finance/ledger/templates/data-load.jmx index 798a4f6..07e643a 100644 --- a/machmeter/usecases/finance/ledger/templates/data-load.jmx +++ b/machmeter/usecases/finance/ledger/templates/data-load.jmx @@ -48,7 +48,7 @@ /test/ - + true 5000 @@ -67,7 +67,147 @@ - + + continue + + false + 1 + + 1 + 1 + false + + + true + + + + groovy + + + true + import com.google.cloud.spanner.*; + +String projectId = "${project}"; +String instanceId = "${instance}"; +String databaseId = "${database}"; + +int sessions = ${connections}; +int channels = ${channels}; +SessionPoolOptions sessionPool = SessionPoolOptions.newBuilder() + .setMinSessions(sessions) + .setMaxSessions(sessions) + .build(); + +SpannerOptions options = SpannerOptions.newBuilder() + .setNumChannels(channels) + .setSessionPoolOption(sessionPool) + .build(); + +Spanner spanner = options.getService(); +DatabaseClient dbClient = spanner.getDatabaseClient(DatabaseId.of(projectId, instanceId, databaseId)); + +props.put("spanner", spanner); +props.put("dbClient", dbClient); +props.put("maxSamplingSize", 1000); + +SampleResult.setRequestHeaders(spanner.toString()); + + + + + continue + + false + ${iterations} + + ${users} + ${ramUp_Time} + false + ${duration} + ${startUp_Delay} + false + + + + groovy + + + true + import com.google.cloud.spanner.*; +import java.util.*; +import com.google.cloud.Timestamp; +import org.apache.commons.lang3.RandomStringUtils; +import java.lang.Long + +try +{ + DatabaseClient dbClient = props.get("dbClient"); + + Timestamp createdDate = Timestamp.ofTimeMicroseconds(System.currentTimeMillis()); + + String data = "fbsdkjbfksdjfbksdfsvddjfgbdcfdsfbjsdkfbskdfbksdfbksdfbjksdbfksdbfksdbfksdfbdskbfksjfgbdjkfhbgdfkgsfsdbfskdfbsksdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfsdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvddjfgbdcfdsfbjsdkfbskdfbksdfbksdfbjksdbfksdbfksdbfksdfbdskbfksjfgbdjkfhbgdfkgsfsdbfskdfbsksdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsfskjhhjvgvhsdfasaewrerergergergergertertevcxvxcvsdsdfgdfgdfgdfgdfgdgfdgnnnnndsvcfjsdfvjsdvfksdavfvfdsjhbdjhfgbjhdfbgdhjfgjdhfgbjdhfbgjhdfbgvnvnvbnvnvbnvnbvnbjhfjfhjfjfjfjfjfhjdfbgsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvddjfgbdcfdsfbjsdkfbskdfbksdfbksdfbjksdbfksdbfksdbfksdfbdskbfksjfgbdjkfhbgdfkgbsfsdbfskdfbsksdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsfskjhhjvgvhsdfasaewrerergergergergertertevcxvxcvsdsdfgdfgdfgdfgdfgdgfdgnnnnndsvcfjsdfvjsdvfksdavfvfdsjhbdjhfgbjhdfbgdhjfgjdhfgbjdhfbgjhdfbgvnvnvbnvnvbnvnbvnbjhfjfhjfjfjfjfjfhjdfbgsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjb"; + + ArrayList<Mutation> mutations = new ArrayList<>(); + + for (int i = 0; i < 50; i = i + 1) { + float limitAmt = Float.parseFloat(RandomStringUtils.randomNumeric(4)); + float balance = 1000 + limitAmt; + + String userId = UUID.randomUUID().toString(); + Mutation user_bal_mutation = Mutation.newInsertBuilder("user_bal") + .set("userId") + .to(userId) + .set("balance") + .to(balance) + .set("creationTime") + .to(createdDate) + .set("engmtLvl") + .to(data) + .set("streakDay") + .to(data) + .set("source") + .to(data) + .build(); + mutations.add(user_bal_mutation); + + String transactionId = UUID.randomUUID().toString(); + Mutation user_txn_mutation = Mutation.newInsertBuilder("user_txns") + .set("userId") + .to(userId) + .set("transactionId") + .to(transactionId) + .set("amount") + .to(limitAmt) + .set("creationTime") + .to(createdDate) + .set("streakDay") + .to(data) + .set("RewardType") + .to(data) + .build(); + + mutations.add(user_txn_mutation); + } + + dbClient.write(mutations); + +} catch (Exception e) { + System.out.println(e.toString()); +} + +//Random randomNum = new Random(); +//int low = 1; +//int high = props.get("maxSamplingSize"); //Change here to suit for sampling size +//int number = randomNum.nextInt(high - low) + low; +//vars.put("UserId_" + number.toString(), userId); +//log.info("insert -->thread({}): modify UserId({}) with {}",${__threadNum},number, userId); + + + + + + continue false @@ -221,7 +361,92 @@ - + + continue + + false + 1 + + 1 + 1 + false + + + true + + + + groovy + + + true + import com.google.cloud.spanner.*; + + +DatabaseClient dbClient = props.get("dbClient"); + +// Create a list of sampling user_ref_id before testing +// Note: Please change limit to 10000 +String readUserIdSql="SELECT userId FROM user_profile TABLESAMPLE BERNOULLI (50 PERCENT) limit 1000;"; +Statement stmt = Statement.newBuilder(readUserIdSql).build(); + +ResultSet result = dbClient + .singleUseReadOnlyTransaction() + .executeQuery(stmt); + +StringBuilder csv_result = new StringBuilder(); +int count = 0; + +// Store sampling user_ref_id in the JmeterProperties for future use by other threads* +while (result.next()) { + count = count+1; + //log.info("count({}), thread({}):{}",count, ${__threadNum},result.getString("user_ref_id")); + //vars.put("UserId_" + count.toString(),result.getString("user_ref_id") ) + csv_result.append(result.getString("userId")); + csv_result.append(System.getProperty("line.separator")); + +} +org.apache.commons.io.FileUtils.writeStringToFile(new File("/data/userId.csv"), csv_result.toString(), "UTF-8"); +result.close(); + + + + groovy + + + true + import com.google.cloud.spanner.*; + + +DatabaseClient dbClient = props.get("dbClient"); + +// Create a list of sampling user_ref_id before testing +// Note: Please change limit to 10000 +String readUserIdSql="SELECT deviceId FROM device_profile TABLESAMPLE BERNOULLI (50 PERCENT) limit 1000;"; +Statement stmt = Statement.newBuilder(readUserIdSql).build(); + +ResultSet result = dbClient + .singleUseReadOnlyTransaction() + .executeQuery(stmt); + +StringBuilder csv_result = new StringBuilder(); +int count = 0; + +// Store sampling user_ref_id in the JmeterProperties for future use by other threads* +while (result.next()) { + count = count+1; + //log.info("count({}), thread({}):{}",count, ${__threadNum},result.getString("device_id")); + //vars.put("DeviceId_" + count.toString(),result.getString("device_id") ) + csv_result.append(result.getString("deviceId")); + csv_result.append(System.getProperty("line.separator")); + +} +org.apache.commons.io.FileUtils.writeStringToFile(new File("/data/deviceId.csv"), csv_result.toString(), "UTF-8"); +result.close(); + + + + Fetches sampled data from Spanner for the load test continue diff --git a/machmeter/usecases/finance/ledger/templates/schema.sql b/machmeter/usecases/finance/ledger/templates/schema.sql index 59ccf87..6ade78d 100644 --- a/machmeter/usecases/finance/ledger/templates/schema.sql +++ b/machmeter/usecases/finance/ledger/templates/schema.sql @@ -1,38 +1,37 @@ CREATE TABLE user_bal ( - userId STRING(128) NOT NULL, - cSpent INT64, - cEarn INT64, - cEarnToday INT64, - balance FLOAT64 NOT NULL, - engmtLvl STRING(30), - streakDay STRING(30), - source STRING(60), - cEarnUpdatedAt INT64, - engmtLvlUpdatedAt INT64, - streakDayUpdatedAt INT64, - creationTime TIMESTAMP, - updationTime TIMESTAMP, - currStreakFirstEarnAt INT64, - sourceTransactLog JSON, + userId STRING(128) NOT NULL, + cSpent INT64, + cEarn INT64, + cEarnToday INT64, + balance FLOAT64 NOT NULL, + engmtLvl STRING(MAX), + streakDay STRING(MAX), + source STRING(MAX), + cEarnUpdatedAt INT64, + engmtLvlUpdatedAt INT64, + streakDayUpdatedAt INT64, + creationTime TIMESTAMP, + updationTime TIMESTAMP, + currStreakFirstEarnAt INT64, + sourceTransactLog JSON, ) PRIMARY KEY(userId); - - + CREATE TABLE user_txns ( - userId STRING(128) NOT NULL, - transactionId STRING(128) NOT NULL, - org_transId STRING(128), - amount FLOAT64 NOT NULL, - balance FLOAT64, - currency STRING(50), - streakDay STRING(30), - transactionType STRING(50), - transactionStatus STRING(50), - RewardType STRING(50), - refType STRING(50), - refTypeId STRING(128), - transactionSource STRING(60), - creationTime TIMESTAMP, + userId STRING(128) NOT NULL, + transactionId STRING(128) NOT NULL, + org_transId STRING(128), + amount FLOAT64 NOT NULL, + balance FLOAT64, + currency STRING(50), + streakDay STRING(MAX), + transactionType STRING(50), + transactionStatus STRING(50), + RewardType STRING(MAX), + refType STRING(50), + refTypeId STRING(128), + transactionSource STRING(60), + creationTime TIMESTAMP, ) PRIMARY KEY(userId, transactionId), - INTERLEAVE IN PARENT user_bal ON DELETE CASCADE; - + INTERLEAVE IN PARENT user_bal ON DELETE CASCADE; + CREATE INDEX user_txnsByTransactionId ON user_txns(transactionId); \ No newline at end of file From f94f9a7e6b7fb6537960a39d1fb0dc97a99e039f Mon Sep 17 00:00:00 2001 From: surbhigarg92 Date: Thu, 6 Apr 2023 09:03:21 +0530 Subject: [PATCH 2/3] fixL review comments --- machmeter/usecases/finance/ledger/README.md | 1 + .../templates/data-load-with-spanner.jmx | 637 ++++++++++++++++++ .../finance/ledger/templates/data-load.jmx | 233 +------ 3 files changed, 642 insertions(+), 229 deletions(-) create mode 100644 machmeter/usecases/finance/ledger/templates/data-load-with-spanner.jmx diff --git a/machmeter/usecases/finance/ledger/README.md b/machmeter/usecases/finance/ledger/README.md index ac88f3b..00c9e2c 100644 --- a/machmeter/usecases/finance/ledger/README.md +++ b/machmeter/usecases/finance/ledger/README.md @@ -11,3 +11,4 @@ template to use in its run. For performance testing, we showcase a variety of different access patterns such as write mutations, read queries, readWriteTransactions etc. +Use `data-load-with-spanner.jmx` template for loading data using Spanner connection and mutations for bulk upload. \ No newline at end of file diff --git a/machmeter/usecases/finance/ledger/templates/data-load-with-spanner.jmx b/machmeter/usecases/finance/ledger/templates/data-load-with-spanner.jmx new file mode 100644 index 0000000..07e643a --- /dev/null +++ b/machmeter/usecases/finance/ledger/templates/data-load-with-spanner.jmx @@ -0,0 +1,637 @@ + + + + + Populates the user_bal and user_txn table with dummy data + false + true + true + + + + project + ${__P(project, default)} + = + + + instance + ${__P(instance, default)} + = + + + database + ${__P(database, default)} + = + + + connections + ${__P(connections, 1000)} + = + + + channels + ${__P(channels, 10)} + = + + + users + ${__P(users, 10)} + = + + + iterations + ${__P(iterations, 5)} + = + + + + /test/ + + + + true + + 5000 + + conn_pool + jdbc:cloudspanner:/projects/${project}/instances/${instance}/databases/${database}?minSessions=${connections};maxSessions=${connections};numChannels=${channels} + com.google.cloud.spanner.jdbc.JdbcDriver + + true + + ${connections} + false + 10000 + DEFAULT + 60000 + + + + + continue + + false + 1 + + 1 + 1 + false + + + true + + + + groovy + + + true + import com.google.cloud.spanner.*; + +String projectId = "${project}"; +String instanceId = "${instance}"; +String databaseId = "${database}"; + +int sessions = ${connections}; +int channels = ${channels}; +SessionPoolOptions sessionPool = SessionPoolOptions.newBuilder() + .setMinSessions(sessions) + .setMaxSessions(sessions) + .build(); + +SpannerOptions options = SpannerOptions.newBuilder() + .setNumChannels(channels) + .setSessionPoolOption(sessionPool) + .build(); + +Spanner spanner = options.getService(); +DatabaseClient dbClient = spanner.getDatabaseClient(DatabaseId.of(projectId, instanceId, databaseId)); + +props.put("spanner", spanner); +props.put("dbClient", dbClient); +props.put("maxSamplingSize", 1000); + +SampleResult.setRequestHeaders(spanner.toString()); + + + + + continue + + false + ${iterations} + + ${users} + ${ramUp_Time} + false + ${duration} + ${startUp_Delay} + false + + + + groovy + + + true + import com.google.cloud.spanner.*; +import java.util.*; +import com.google.cloud.Timestamp; +import org.apache.commons.lang3.RandomStringUtils; +import java.lang.Long + +try +{ + DatabaseClient dbClient = props.get("dbClient"); + + Timestamp createdDate = Timestamp.ofTimeMicroseconds(System.currentTimeMillis()); + + String data = "fbsdkjbfksdjfbksdfsvddjfgbdcfdsfbjsdkfbskdfbksdfbksdfbjksdbfksdbfksdbfksdfbdskbfksjfgbdjkfhbgdfkgsfsdbfskdfbsksdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfsdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvddjfgbdcfdsfbjsdkfbskdfbksdfbksdfbjksdbfksdbfksdbfksdfbdskbfksjfgbdjkfhbgdfkgsfsdbfskdfbsksdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsfskjhhjvgvhsdfasaewrerergergergergertertevcxvxcvsdsdfgdfgdfgdfgdfgdgfdgnnnnndsvcfjsdfvjsdvfksdavfvfdsjhbdjhfgbjhdfbgdhjfgjdhfgbjdhfbgjhdfbgvnvnvbnvnvbnvnbvnbjhfjfhjfjfjfjfjfhjdfbgsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvddjfgbdcfdsfbjsdkfbskdfbksdfbksdfbjksdbfksdbfksdbfksdfbdskbfksjfgbdjkfhbgdfkgbsfsdbfskdfbsksdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsfskjhhjvgvhsdfasaewrerergergergergertertevcxvxcvsdsdfgdfgdfgdfgdfgdgfdgnnnnndsvcfjsdfvjsdvfksdavfvfdsjhbdjhfgbjhdfbgdhjfgjdhfgbjdhfbgjhdfbgvnvnvbnvnvbnvnbvnbjhfjfhjfjfjfjfjfhjdfbgsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjb"; + + ArrayList<Mutation> mutations = new ArrayList<>(); + + for (int i = 0; i < 50; i = i + 1) { + float limitAmt = Float.parseFloat(RandomStringUtils.randomNumeric(4)); + float balance = 1000 + limitAmt; + + String userId = UUID.randomUUID().toString(); + Mutation user_bal_mutation = Mutation.newInsertBuilder("user_bal") + .set("userId") + .to(userId) + .set("balance") + .to(balance) + .set("creationTime") + .to(createdDate) + .set("engmtLvl") + .to(data) + .set("streakDay") + .to(data) + .set("source") + .to(data) + .build(); + mutations.add(user_bal_mutation); + + String transactionId = UUID.randomUUID().toString(); + Mutation user_txn_mutation = Mutation.newInsertBuilder("user_txns") + .set("userId") + .to(userId) + .set("transactionId") + .to(transactionId) + .set("amount") + .to(limitAmt) + .set("creationTime") + .to(createdDate) + .set("streakDay") + .to(data) + .set("RewardType") + .to(data) + .build(); + + mutations.add(user_txn_mutation); + } + + dbClient.write(mutations); + +} catch (Exception e) { + System.out.println(e.toString()); +} + +//Random randomNum = new Random(); +//int low = 1; +//int high = props.get("maxSamplingSize"); //Change here to suit for sampling size +//int number = randomNum.nextInt(high - low) + low; +//vars.put("UserId_" + number.toString(), userId); +//log.info("insert -->thread({}): modify UserId({}) with {}",${__threadNum},number, userId); + + + + + + + continue + + false + ${iterations} + + ${users} + 1 + false + + + true + + + + conn_pool + insert into user_bal (UserId, Balance, CreationTime) values (?,?,?) + ${UserId},${Balance},${CreationTime} + VARCHAR,DOUBLE,TIMESTAMP + + Prepared Update Statement + Store as String + + + + + + + + UserId + Balance + CreationTime + + + + ${__UUID()} + 0 + ${__time(yyyy-MM-dd hh:mm:ss)} + + + false + Random generated values to populate database + + + + + true + 1 + + + + conn_pool + insert into user_txns (UserId, TransactionId, Amount, CreationTime) values (?,?,?,?); + ${UserId},${TransactionId},${Amount},${CreationTime_txn} + VARCHAR,VARCHAR,DOUBLE,TIMESTAMP + + Prepared Update Statement + Store as String + + + + + + + + TransactionId + Amount + CreationTime_txn + + + + ${__UUID()} + ${__Random(0,3000)} + ${__time(yyyy-MM-dd hh:mm:ss)} + + + false + + + + + conn_pool + Prepared Update Statement + update user_bal set Balance = Balance + ? where UserId = ?; + ${Amount},${UserId} + DOUBLE,VARCHAR + + + + + Store as String + + + + + false + true + false + + + + + + + influxdbMetricsSender + org.apache.jmeter.visualizers.backend.influxdb.HttpMetricsSender + = + + + influxdbUrl + http://jmeter-influxdb:8086/write?db=jmeter + = + + + application + application name + = + + + measurement + jmeter + = + + + summaryOnly + true + = + + + samplersRegex + .* + = + + + percentiles + 99;95;90 + = + + + testTitle + Test name + = + + + eventTags + + = + + + + org.apache.jmeter.visualizers.backend.influxdb.InfluxdbBackendListenerClient + + + + + continue + + false + 1 + + 1 + 1 + false + + + true + + + + groovy + + + true + import com.google.cloud.spanner.*; + + +DatabaseClient dbClient = props.get("dbClient"); + +// Create a list of sampling user_ref_id before testing +// Note: Please change limit to 10000 +String readUserIdSql="SELECT userId FROM user_profile TABLESAMPLE BERNOULLI (50 PERCENT) limit 1000;"; +Statement stmt = Statement.newBuilder(readUserIdSql).build(); + +ResultSet result = dbClient + .singleUseReadOnlyTransaction() + .executeQuery(stmt); + +StringBuilder csv_result = new StringBuilder(); +int count = 0; + +// Store sampling user_ref_id in the JmeterProperties for future use by other threads* +while (result.next()) { + count = count+1; + //log.info("count({}), thread({}):{}",count, ${__threadNum},result.getString("user_ref_id")); + //vars.put("UserId_" + count.toString(),result.getString("user_ref_id") ) + csv_result.append(result.getString("userId")); + csv_result.append(System.getProperty("line.separator")); + +} +org.apache.commons.io.FileUtils.writeStringToFile(new File("/data/userId.csv"), csv_result.toString(), "UTF-8"); +result.close(); + + + + groovy + + + true + import com.google.cloud.spanner.*; + + +DatabaseClient dbClient = props.get("dbClient"); + +// Create a list of sampling user_ref_id before testing +// Note: Please change limit to 10000 +String readUserIdSql="SELECT deviceId FROM device_profile TABLESAMPLE BERNOULLI (50 PERCENT) limit 1000;"; +Statement stmt = Statement.newBuilder(readUserIdSql).build(); + +ResultSet result = dbClient + .singleUseReadOnlyTransaction() + .executeQuery(stmt); + +StringBuilder csv_result = new StringBuilder(); +int count = 0; + +// Store sampling user_ref_id in the JmeterProperties for future use by other threads* +while (result.next()) { + count = count+1; + //log.info("count({}), thread({}):{}",count, ${__threadNum},result.getString("device_id")); + //vars.put("DeviceId_" + count.toString(),result.getString("device_id") ) + csv_result.append(result.getString("deviceId")); + csv_result.append(System.getProperty("line.separator")); + +} +org.apache.commons.io.FileUtils.writeStringToFile(new File("/data/deviceId.csv"), csv_result.toString(), "UTF-8"); +result.close(); + + + + + Fetches sampled data from Spanner for the load test + continue + + false + 1 + + 1 + 1 + false + + + true + + + + Create CSV for sample UserIds to be used for perf test. + conn_pool + Select Statement + SELECT UserId FROM user_bal TABLESAMPLE BERNOULLI (50 PERCENT) limit 50000; + + + + + + + Store as String + + + + conn_pool + Select Statement + SELECT UserId FROM user_bal TABLESAMPLE BERNOULLI (50 PERCENT) limit 50000; + + + + resultSet + + + Store as String + + + + java + + + false + resultSet = vars.getObject("resultSet"); +StringBuilder result = new StringBuilder(); + +for (Object row : resultSet ) { + iter = row.entrySet().iterator(); + while (iter.hasNext()) { + pair = iter.next(); + result.append(pair.getValue()); + } + result.append(System.getProperty("line.separator")); +} + +org.apache.commons.io.FileUtils.writeStringToFile(new File("/data/userId.csv"), result.toString(), "UTF-8"); + + + + + Create CSV for sample UserIds, TransactionIds to be used for perf test. + conn_pool + Select Statement + SELECT TransactionId FROM user_txns TABLESAMPLE BERNOULLI (50 PERCENT) limit 50000; + + + + + + + Store as String + + + + conn_pool + Select Statement + SELECT TransactionId FROM user_txns TABLESAMPLE BERNOULLI (50 PERCENT) limit 50000; + + + + resultSet + + + Store as String + + + + groovy + + + true + resultSet = vars.getObject("resultSet"); +StringBuilder result = new StringBuilder(); + +for (Object row : resultSet ) { + iter = row.entrySet().iterator(); + while (iter.hasNext()) { + pair = iter.next(); + result.append(pair.getValue()); + } + result.append(System.getProperty("line.separator")); +} + +org.apache.commons.io.FileUtils.writeStringToFile(new File("/data/txnId.csv"), result.toString(), "UTF-8"); + + + + + + false + + saveConfig + + + true + true + true + + true + true + true + true + false + true + true + false + false + false + true + false + false + false + true + 0 + true + true + true + true + true + true + + + + + + + false + + saveConfig + + + true + true + true + + true + true + true + true + false + true + true + false + false + false + true + false + false + false + true + 0 + true + true + true + true + true + true + + + + + + + + diff --git a/machmeter/usecases/finance/ledger/templates/data-load.jmx b/machmeter/usecases/finance/ledger/templates/data-load.jmx index 07e643a..7d05f78 100644 --- a/machmeter/usecases/finance/ledger/templates/data-load.jmx +++ b/machmeter/usecases/finance/ledger/templates/data-load.jmx @@ -48,7 +48,7 @@ /test/ - + true 5000 @@ -67,147 +67,7 @@ - - continue - - false - 1 - - 1 - 1 - false - - - true - - - - groovy - - - true - import com.google.cloud.spanner.*; - -String projectId = "${project}"; -String instanceId = "${instance}"; -String databaseId = "${database}"; - -int sessions = ${connections}; -int channels = ${channels}; -SessionPoolOptions sessionPool = SessionPoolOptions.newBuilder() - .setMinSessions(sessions) - .setMaxSessions(sessions) - .build(); - -SpannerOptions options = SpannerOptions.newBuilder() - .setNumChannels(channels) - .setSessionPoolOption(sessionPool) - .build(); - -Spanner spanner = options.getService(); -DatabaseClient dbClient = spanner.getDatabaseClient(DatabaseId.of(projectId, instanceId, databaseId)); - -props.put("spanner", spanner); -props.put("dbClient", dbClient); -props.put("maxSamplingSize", 1000); - -SampleResult.setRequestHeaders(spanner.toString()); - - - - - continue - - false - ${iterations} - - ${users} - ${ramUp_Time} - false - ${duration} - ${startUp_Delay} - false - - - - groovy - - - true - import com.google.cloud.spanner.*; -import java.util.*; -import com.google.cloud.Timestamp; -import org.apache.commons.lang3.RandomStringUtils; -import java.lang.Long - -try -{ - DatabaseClient dbClient = props.get("dbClient"); - - Timestamp createdDate = Timestamp.ofTimeMicroseconds(System.currentTimeMillis()); - - String data = "fbsdkjbfksdjfbksdfsvddjfgbdcfdsfbjsdkfbskdfbksdfbksdfbjksdbfksdbfksdbfksdfbdskbfksjfgbdjkfhbgdfkgsfsdbfskdfbsksdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfsdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvddjfgbdcfdsfbjsdkfbskdfbksdfbksdfbjksdbfksdbfksdbfksdfbdskbfksjfgbdjkfhbgdfkgsfsdbfskdfbsksdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsfskjhhjvgvhsdfasaewrerergergergergertertevcxvxcvsdsdfgdfgdfgdfgdfgdgfdgnnnnndsvcfjsdfvjsdvfksdavfvfdsjhbdjhfgbjhdfbgdhjfgjdhfgbjdhfbgjhdfbgvnvnvbnvnvbnvnbvnbjhfjfhjfjfjfjfjfhjdfbgsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvddjfgbdcfdsfbjsdkfbskdfbksdfbksdfbjksdbfksdbfksdbfksdfbdskbfksjfgbdjkfhbgdfkgbsfsdbfskdfbsksdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsfskjhhjvgvhsdfasaewrerergergergergertertevcxvxcvsdsdfgdfgdfgdfgdfgdgfdgnnnnndsvcfjsdfvjsdvfksdavfvfdsjhbdjhfgbjhdfbgdhjfgjdhfgbjdhfbgjhdfbgvnvnvbnvnvbnvnbvnbjhfjfhjfjfjfjfjfhjdfbgsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjbfksdjfbksdfsvdsdfhjksdfhksjdfjskdfbjksdbfskdbgfssdfsdkfbsdkjb"; - - ArrayList<Mutation> mutations = new ArrayList<>(); - - for (int i = 0; i < 50; i = i + 1) { - float limitAmt = Float.parseFloat(RandomStringUtils.randomNumeric(4)); - float balance = 1000 + limitAmt; - - String userId = UUID.randomUUID().toString(); - Mutation user_bal_mutation = Mutation.newInsertBuilder("user_bal") - .set("userId") - .to(userId) - .set("balance") - .to(balance) - .set("creationTime") - .to(createdDate) - .set("engmtLvl") - .to(data) - .set("streakDay") - .to(data) - .set("source") - .to(data) - .build(); - mutations.add(user_bal_mutation); - - String transactionId = UUID.randomUUID().toString(); - Mutation user_txn_mutation = Mutation.newInsertBuilder("user_txns") - .set("userId") - .to(userId) - .set("transactionId") - .to(transactionId) - .set("amount") - .to(limitAmt) - .set("creationTime") - .to(createdDate) - .set("streakDay") - .to(data) - .set("RewardType") - .to(data) - .build(); - - mutations.add(user_txn_mutation); - } - - dbClient.write(mutations); - -} catch (Exception e) { - System.out.println(e.toString()); -} - -//Random randomNum = new Random(); -//int low = 1; -//int high = props.get("maxSamplingSize"); //Change here to suit for sampling size -//int number = randomNum.nextInt(high - low) + low; -//vars.put("UserId_" + number.toString(), userId); -//log.info("insert -->thread({}): modify UserId({}) with {}",${__threadNum},number, userId); - - - - - - + continue false @@ -361,92 +221,7 @@ try - - continue - - false - 1 - - 1 - 1 - false - - - true - - - - groovy - - - true - import com.google.cloud.spanner.*; - - -DatabaseClient dbClient = props.get("dbClient"); - -// Create a list of sampling user_ref_id before testing -// Note: Please change limit to 10000 -String readUserIdSql="SELECT userId FROM user_profile TABLESAMPLE BERNOULLI (50 PERCENT) limit 1000;"; -Statement stmt = Statement.newBuilder(readUserIdSql).build(); - -ResultSet result = dbClient - .singleUseReadOnlyTransaction() - .executeQuery(stmt); - -StringBuilder csv_result = new StringBuilder(); -int count = 0; - -// Store sampling user_ref_id in the JmeterProperties for future use by other threads* -while (result.next()) { - count = count+1; - //log.info("count({}), thread({}):{}",count, ${__threadNum},result.getString("user_ref_id")); - //vars.put("UserId_" + count.toString(),result.getString("user_ref_id") ) - csv_result.append(result.getString("userId")); - csv_result.append(System.getProperty("line.separator")); - -} -org.apache.commons.io.FileUtils.writeStringToFile(new File("/data/userId.csv"), csv_result.toString(), "UTF-8"); -result.close(); - - - - groovy - - - true - import com.google.cloud.spanner.*; - - -DatabaseClient dbClient = props.get("dbClient"); - -// Create a list of sampling user_ref_id before testing -// Note: Please change limit to 10000 -String readUserIdSql="SELECT deviceId FROM device_profile TABLESAMPLE BERNOULLI (50 PERCENT) limit 1000;"; -Statement stmt = Statement.newBuilder(readUserIdSql).build(); - -ResultSet result = dbClient - .singleUseReadOnlyTransaction() - .executeQuery(stmt); - -StringBuilder csv_result = new StringBuilder(); -int count = 0; - -// Store sampling user_ref_id in the JmeterProperties for future use by other threads* -while (result.next()) { - count = count+1; - //log.info("count({}), thread({}):{}",count, ${__threadNum},result.getString("device_id")); - //vars.put("DeviceId_" + count.toString(),result.getString("device_id") ) - csv_result.append(result.getString("deviceId")); - csv_result.append(System.getProperty("line.separator")); - -} -org.apache.commons.io.FileUtils.writeStringToFile(new File("/data/deviceId.csv"), csv_result.toString(), "UTF-8"); -result.close(); - - - - + Fetches sampled data from Spanner for the load test continue @@ -634,4 +409,4 @@ org.apache.commons.io.FileUtils.writeStringToFile(new File("/data/txnId.csv - + \ No newline at end of file From 2fbd85b6885ff582f9b62f1002e77e4cd2fb6a65 Mon Sep 17 00:00:00 2001 From: surbhigarg92 Date: Tue, 18 Apr 2023 17:00:03 +0530 Subject: [PATCH 3/3] Perf test template for 150K QPS --- .../ledger/templates/finance-ledger-perf.jmx | 92 ++++++++++--------- 1 file changed, 51 insertions(+), 41 deletions(-) diff --git a/machmeter/usecases/finance/ledger/templates/finance-ledger-perf.jmx b/machmeter/usecases/finance/ledger/templates/finance-ledger-perf.jmx index ba8e06f..74dfead 100644 --- a/machmeter/usecases/finance/ledger/templates/finance-ledger-perf.jmx +++ b/machmeter/usecases/finance/ledger/templates/finance-ledger-perf.jmx @@ -222,7 +222,7 @@ SampleResult.setRequestHeaders(spanner.toString()); 1 ThroughputController.percentThroughput - 12.0 + 10.0 0.0 @@ -239,7 +239,7 @@ import com.google.cloud.Timestamp; DatabaseClient dbClient = props.get("dbClient"); String userId = vars.get("userId"); -String txnId = vars.get("txnId"); +String txnId = UUID.randomUUID().toString();; double randomAmount = Double.parseDouble(vars.get("randomAmount")); dbClient @@ -262,19 +262,6 @@ dbClient .to(randomAmount) .set("RewardType") .to("COINS") - .set("TransactionSource") - .to("LOADTEST") - .set("TransactionStatus") - .to("SUCCESS") - .set("TransactionType") - .to("Credit") - .build()); - transaction.buffer( - Mutation.newUpdateBuilder("user_bal") - .set("UserId") - .to(userId) - .set("Balance") - .to(balance + randomAmount) .build()); } ); @@ -284,12 +271,10 @@ dbClient - txnId randomAmount - - ${__UUID()} + ${__Random(0000,9999)} @@ -304,7 +289,7 @@ dbClient 1 ThroughputController.percentThroughput - 24.06 + 30.0 0.0 @@ -331,11 +316,37 @@ ResultSet result = dbClient String responseHeader = ""; while (result.next()) { - responseHeader += " Balance: " +result.getDouble("Balance"); } result.close(); + + + + + groovy + + + true + import com.google.cloud.spanner.*; +import java.util.concurrent.TimeUnit; + +DatabaseClient dbClient = props.get("dbClient"); + +String userId = vars.get("userId"); +String readBalanceSql = "Select Balance from user_bal where UserId = @userId"; +Statement stmt = Statement.newBuilder(readBalanceSql) + .bind("userId").to(userId) + .build(); + +ResultSet result = dbClient + .singleUse(TimestampBound.ofExactStaleness(1, TimeUnit.SECONDS)) + .executeQuery(stmt); -SampleResult.setRequestHeaders(responseHeader); + +String responseHeader = ""; +while (result.next()) { +} +result.close(); + @@ -345,7 +356,7 @@ SampleResult.setRequestHeaders(responseHeader); 1 ThroughputController.percentThroughput - 63.16 + 10.0 0.0 @@ -362,13 +373,13 @@ import com.google.cloud.Timestamp; DatabaseClient dbClient = props.get("dbClient"); String userId = vars.get("userId"); -String txnId = vars.get("txnId"); +double randomAmount = 10.0; Mutation mutation = Mutation.newUpdateBuilder("user_bal") .set("UserId") .to(userId) - .set("StreakDay") - .to(10) + .set("balance") + .to(randomAmount) .build(); ArrayList<Mutation> mutations = new ArrayList<>(); @@ -385,7 +396,7 @@ SampleResult.setRequestHeaders(mutation.toString()); 1 ThroughputController.percentThroughput - 0.12 + 30.0 0.0 @@ -396,28 +407,27 @@ SampleResult.setRequestHeaders(mutation.toString()); true import com.google.cloud.spanner.*; +import java.util.concurrent.TimeUnit; DatabaseClient dbClient = props.get("dbClient"); String loadedTxnId = vars.get("loaded_txnId"); -String sql = "Select * from user_txns where transactionid = @loadedTxnId"; +String sql = "Select balance from user_txns where transactionid = @loadedTxnId limit 1"; Statement stmt = Statement.newBuilder(sql) .bind("loadedTxnId") .to(loadedTxnId) .build(); ResultSet result = dbClient - .singleUseReadOnlyTransaction() - .executeQuery(stmt); + .singleUse(TimestampBound.ofExactStaleness(1, TimeUnit.SECONDS)) + .executeQuery(stmt); + String responseHeader = ""; while (result.next()) { - responseHeader += " Userid: " +result.getString(0); } -result.close(); - -SampleResult.setRequestHeaders(responseHeader); +result.close(); @@ -427,7 +437,7 @@ SampleResult.setRequestHeaders(responseHeader); 1 ThroughputController.percentThroughput - 0.62 + 20.0 0.0 @@ -438,10 +448,11 @@ SampleResult.setRequestHeaders(responseHeader); true import com.google.cloud.spanner.*; +import java.util.concurrent.TimeUnit; DatabaseClient dbClient = props.get("dbClient"); -String sql = "select * from user_txns where UserId= @user_id"; +String sql = "select userId from user_txns where UserId= @user_id limit 1"; String userId = vars.get("userId"); Statement stmt = Statement.newBuilder(sql) @@ -450,20 +461,19 @@ Statement stmt = Statement.newBuilder(sql) .build(); ResultSet result = dbClient - .singleUseReadOnlyTransaction() - .executeQuery(stmt); + .singleUse(TimestampBound.ofExactStaleness(1, TimeUnit.SECONDS)) + .executeQuery(stmt); + String responseHeader = ""; while (result.next()) { - responseHeader += " Userid: " +result.getString(0); } result.close(); - -SampleResult.setRequestHeaders(responseHeader); + - +