Skip to content

Commit

Permalink
Merge pull request #518 from neonlabsorg/NDEV-3489-split-trace-transa…
Browse files Browse the repository at this point in the history
…ction-scenario

Ndev 3489 split trace transaction scenario
  • Loading branch information
romanova-natasha authored Feb 18, 2025
2 parents 482eb14 + 8767317 commit 4e662e1
Show file tree
Hide file tree
Showing 7 changed files with 656 additions and 315 deletions.
2 changes: 1 addition & 1 deletion clickfile.py
Original file line number Diff line number Diff line change
Expand Up @@ -1306,7 +1306,7 @@ def build(tag):
"-u", "--users", default=None, required=True, help="Number of users (have to be generated before load test run)"
)
@click.option("-b", "--balance", default=None, required=True, help="Initial balance of accounts in Neon")
@click.option("-a", "--bank_account", default="", required=False, help="Eth bank account private key")
@click.option("-a", "--bank_account", default=None, required=False, help="Eth bank account private key")
@catch_traceback
def run_load_k6(network, script, users, balance, bank_account):
network_manager = NetworkManager()
Expand Down

Large diffs are not rendered by default.

52 changes: 52 additions & 0 deletions loadtesting/k6/scenarios/tracerDebugTraceTransaction.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
import { default as DebugTraceTransactionTest } from '../tests/tracer/traceTransaction/debugTraceTransactionSimple.test.js'
import { default as DebugTraceTransactionWithEventsTest } from '../tests/tracer/traceTransaction/debugTraceTransactionWithEvents.test.js'
import { default as DebugTraceIterativeTransactionTest } from '../tests/tracer/traceTransaction/debugTraceTransactionIterative.test.js'
import { usersNumber } from "../tests/utils/consts.js";

export const options = {
scenarios: {
DebugTraceTransaction: {
exec: 'DebugTraceTransaction',
executor: 'ramping-vus',
startVUs: 0,
stages: [
{ duration: '20s', target: usersNumber },
{ duration: '20m', target: usersNumber },
],
gracefulRampDown: '60s',
},
DebugTraceTransactionWithEvents: {
exec: 'DebugTraceTransactionWithEvents',
executor: 'ramping-vus',
startVUs: 0,
stages: [
{ duration: '20s', target: usersNumber },
{ duration: '20m', target: usersNumber },
],
gracefulRampDown: '60s',
},
DebugTraceIterativeTransaction: {
exec: 'DebugTraceIterativeTransaction',
executor: 'ramping-vus',
startVUs: 0,
stages: [
{ duration: '20s', target: usersNumber },
{ duration: '20m', target: usersNumber },
],
gracefulRampDown: '60s',
},
},
noConnectionReuse: true,
};

export function DebugTraceTransaction() {
DebugTraceTransactionTest();
}

export function DebugTraceTransactionWithEvents() {
DebugTraceTransactionWithEventsTest();
}

export function DebugTraceIterativeTransaction() {
DebugTraceIterativeTransactionTest();
}
32 changes: 31 additions & 1 deletion loadtesting/k6/scenarios/tracerStandardLoad.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
import { default as DebugTraceTransactionTest } from '../tests/tracer/debugTraceTransaction.test.js'
import { default as DebugTraceTransactionTest } from '../tests/tracer/traceTransaction/debugTraceTransactionSimple.test.js'
import { default as DebugTraceTransactionWithEventsTest } from '../tests/tracer/traceTransaction/debugTraceTransactionWithEvents.test.js'
import { default as DebugTraceIterativeTransactionTest } from '../tests/tracer/traceTransaction/debugTraceTransactionIterative.test.js'
import { default as EthCallTest } from '../tests/tracer/ethCall.test.js';
import { default as EthGetBalanceTest } from '../tests/tracer/ethGetBalance.test.js';
import { default as EthGetTransactionCountTest } from '../tests/tracer/ethGetTransactionCount.test.js';
Expand All @@ -17,6 +19,26 @@ export const options = {
],
gracefulRampDown: '60s',
},
DebugTraceTransactionWithEvents: {
exec: 'DebugTraceTransactionWithEvents',
executor: 'ramping-vus',
startVUs: 0,
stages: [
{ duration: '20s', target: usersNumber },
{ duration: '20m', target: usersNumber },
],
gracefulRampDown: '60s',
},
DebugTraceIterativeTransaction: {
exec: 'DebugTraceIterativeTransaction',
executor: 'ramping-vus',
startVUs: 0,
stages: [
{ duration: '20s', target: usersNumber },
{ duration: '20m', target: usersNumber },
],
gracefulRampDown: '60s',
},
EthCall: {
exec: 'EthCall',
executor: 'ramping-vus',
Expand Down Expand Up @@ -65,6 +87,14 @@ export function DebugTraceTransaction() {
DebugTraceTransactionTest();
}

export function DebugTraceTransactionWithEvents() {
DebugTraceTransactionWithEventsTest();
}

export function DebugTraceIterativeTransaction() {
DebugTraceIterativeTransactionTest();
}

export function EthCall() {
EthCallTest();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
import { ethClient } from '../../utils/ethClient.js';
import { standardScenarioOptions } from '../../../options/options.js';
import { Trend, Counter } from 'k6/metrics';
import { SharedArray } from 'k6/data';

import { randomIntBetween } from 'https://jslib.k6.io/k6-utils/1.2.0/index.js';
import exec from 'k6/execution';
import { check } from 'k6';

const debugTraceTransactionRequests = new Counter('debug_trace_transaction_iterative_requests');
const debugTraceTransactionRequestErrorCounter = new Counter('debug_trace_transaction_iterative_request_errors');
const debugTraceTransactionErrorCounter = new Counter('debug_trace_transaction_iterative_errors');
const debugTraceTransactionRequestTime = new Trend('debug_trace_transaction_iterative_request_time', true);

export const options = standardScenarioOptions;

const historicalData = JSON.parse(open("../../../data/tracer_data.json"));

const usersArray = new SharedArray('Users accounts', function () {
const accounts = JSON.parse(open("../../../data/accounts.json"));
let data = [];
for (let i = 0; i < Object.keys(accounts).length; i++) {
data[i] = accounts[i];
}
return data;
});


export default function DebugTraceIterativeTransactionTest() {
const vuID = exec.vu.idInTest
const index = vuID % usersArray.length;

const dataIndexIterative = randomIntBetween(0, (historicalData.iterative_tx_contract_calls).length - 1);
const txInfoIterative = historicalData.iterative_tx_contract_calls[dataIndexIterative];

const accountPrivateKey = usersArray[index].sender_key;
const client = ethClient(accountPrivateKey);
const tracer_config = { "tracer": "callTracer", "tracerConfig": { "withLog": true } }

// call iterative tx contract
// blockNumber
const requestParamsBlockNumberIterative = {
requestType: "blockNumber",
method: "debug_traceTransaction",
params: [txInfoIterative.tx_hash, tracer_config]
}

doRequest(client, requestParamsBlockNumberIterative, checkExpectedValueIterative, 1001);

// blockHash
const requestParamsBlockHashIterative = {
requestType: "blockHash",
method: "debug_traceTransaction",
params: [txInfoIterative.tx_hash, tracer_config]
}

doRequest(client, requestParamsBlockHashIterative, checkExpectedValueIterative, 1001);
}

function doRequest(client, requestParams, checkExpectedValueFunction, args) {
const startTime = new Date();
try {
const responseBody = client.callTracer(
JSON.stringify(requestParams.requestType),
JSON.stringify(requestParams.method),
JSON.stringify(requestParams.params)
);
const response = JSON.parse(responseBody);
const checkResult = checkExpectedValueFunction(response, args);
if (!checkResult) {
console.log('Error in response of debug_traceTransaction: ' + JSON.stringify(response));
debugTraceTransactionRequestErrorCounter.add(1);
}
} catch (e) {
console.log('Error in debug_traceTransaction: ' + e);
debugTraceTransactionErrorCounter.add(1);
}
debugTraceTransactionRequestTime.add(new Date() - startTime);
debugTraceTransactionRequests.add(1);
}

function checkExpectedValueIterative(response, expectedValue) {
return check(response, {
'response result is not expected value': (r) => {
return (r.result.logs.length == expectedValue)
}
});
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
import { ethClient } from '../../utils/ethClient.js';
import { standardScenarioOptions } from '../../../options/options.js';
import { Trend, Counter } from 'k6/metrics';
import { SharedArray } from 'k6/data';

import { randomIntBetween } from 'https://jslib.k6.io/k6-utils/1.2.0/index.js';
import exec from 'k6/execution';
import { check } from 'k6';

const debugTraceTransactionRequests = new Counter('debug_trace_transaction_simple_requests');
const debugTraceTransactionRequestErrorCounter = new Counter('debug_trace_transaction_simple_request_errors');
const debugTraceTransactionErrorCounter = new Counter('debug_trace_transaction_simple_errors');
const debugTraceTransactionRequestTime = new Trend('debug_trace_transaction_simple_request_time', true);

export const options = standardScenarioOptions;

const historicalData = JSON.parse(open("../../../data/tracer_data.json"));

const usersArray = new SharedArray('Users accounts', function () {
const accounts = JSON.parse(open("../../../data/accounts.json"));
let data = [];
for (let i = 0; i < Object.keys(accounts).length; i++) {
data[i] = accounts[i];
}
return data;
});


export default function DebugTraceTransactionTest() {
const vuID = exec.vu.idInTest
const index = vuID % usersArray.length;

const dataIndexStorage = randomIntBetween(0, (historicalData.storage_contract_calls).length - 1);
const txInfoStorage = historicalData.storage_contract_calls[dataIndexStorage];

const accountPrivateKey = usersArray[index].sender_key;
const client = ethClient(accountPrivateKey);

// call storage contract
// blockNumber
const requestParamsBlockNumberStorage = {
requestType: "blockNumber",
method: "debug_traceTransaction",
params: [txInfoStorage.tx_hash, { "blockNumber": txInfoStorage.blockNumber }]
}

doRequest(client, requestParamsBlockNumberStorage, checkExpectedValueStorage, txInfoStorage.store_value);

// blockHash
const requestParamsBlockHashStorage = {
requestType: "blockHash",
method: "debug_traceTransaction",
params: [txInfoStorage.tx_hash, { "blockHash": txInfoStorage.blockHash }]
}

doRequest(client, requestParamsBlockHashStorage, checkExpectedValueStorage, txInfoStorage.store_value);

}

function doRequest(client, requestParams, checkExpectedValueFunction, args) {
const startTime = new Date();
try {
const responseBody = client.callTracer(
JSON.stringify(requestParams.requestType),
JSON.stringify(requestParams.method),
JSON.stringify(requestParams.params)
);
const response = JSON.parse(responseBody);
const checkResult = checkExpectedValueFunction(response, args);
if (!checkResult) {
console.log('Error in response of debug_traceTransaction: ' + JSON.stringify(response));
debugTraceTransactionRequestErrorCounter.add(1);
}
} catch (e) {
console.log('Error in debug_traceTransaction: ' + e);
debugTraceTransactionErrorCounter.add(1);
}
debugTraceTransactionRequestTime.add(new Date() - startTime);
debugTraceTransactionRequests.add(1);
}


function checkExpectedValueStorage(response, expectedValue) {
return check(response, {
'response result is not expected value': (r) => {
return (parseInt(r.result.returnValue, 16) == expectedValue)
}
});
}
Loading

0 comments on commit 4e662e1

Please sign in to comment.