From 0e7eccd238697e2be5a7bca39e24dc9fcf8c6a36 Mon Sep 17 00:00:00 2001 From: Tomi Turtiainen <10324676+tomi@users.noreply.github.com> Date: Wed, 23 Oct 2024 15:09:30 +0300 Subject: [PATCH] feat(benchmark): Add filter flag (#11355) --- packages/@n8n/benchmark/README.md | 35 ++++++++++++++++++- packages/@n8n/benchmark/src/commands/run.ts | 6 +++- .../benchmark/src/scenario/scenario-loader.ts | 5 ++- 3 files changed, 43 insertions(+), 3 deletions(-) diff --git a/packages/@n8n/benchmark/README.md b/packages/@n8n/benchmark/README.md index b3a0a4d548..af8726d0ea 100644 --- a/packages/@n8n/benchmark/README.md +++ b/packages/@n8n/benchmark/README.md @@ -1,6 +1,6 @@ # n8n benchmarking tool -Tool for executing benchmarks against an n8n instance. The tool consists of these components: +Tool for executing benchmarks against an n8n instance. ## Directory structure @@ -12,6 +12,39 @@ packages/@n8n/benchmark ├── scripts Orchestration scripts ``` +## Benchmarking an existing n8n instance + +The easiest way to run the existing benchmark scenarios is to use the benchmark docker image: + +```sh +docker pull ghcr.io/n8n-io/n8n-benchmark:latest +# Print the help to list all available flags +docker run ghcr.io/n8n-io/n8n-benchmark:latest run --help +# Run all available benchmark scenarios for 1 minute with 5 concurrent requests +docker run ghcr.io/n8n-io/n8n-benchmark:latest run \ + --n8nBaseUrl=https://instance.url \ + --n8nUserEmail=InstanceOwner@email.com \ + --n8nUserPassword=InstanceOwnerPassword \ + --vus=5 \ + --duration=1m \ + --scenarioFilter SingleWebhook +``` + +### Using custom scenarios with the Docker image + +It is also possible to create your own [benchmark scenarios](#benchmark-scenarios) and load them using the `--testScenariosPath` flag: + +```sh +# Assuming your scenarios are located in `./scenarios`, mount them into `/scenarios` in the container +docker run -v ./scenarios:/scenarios ghcr.io/n8n-io/n8n-benchmark:latest run \ + --n8nBaseUrl=https://instance.url \ + --n8nUserEmail=InstanceOwner@email.com \ + --n8nUserPassword=InstanceOwnerPassword \ + --vus=5 \ + --duration=1m \ + --testScenariosPath=/scenarios +``` + ## Running the entire benchmark suite The benchmark suite consists of [benchmark scenarios](#benchmark-scenarios) and different [n8n setups](#n8n-setups). diff --git a/packages/@n8n/benchmark/src/commands/run.ts b/packages/@n8n/benchmark/src/commands/run.ts index 164eef0f41..312de91c3c 100644 --- a/packages/@n8n/benchmark/src/commands/run.ts +++ b/packages/@n8n/benchmark/src/commands/run.ts @@ -13,6 +13,10 @@ export default class RunCommand extends Command { static flags = { testScenariosPath, + scenarioFilter: Flags.string({ + char: 'f', + description: 'Filter scenarios by name', + }), scenarioNamePrefix: Flags.string({ description: 'Prefix for the scenario name', default: 'Unnamed', @@ -95,7 +99,7 @@ export default class RunCommand extends Command { flags.scenarioNamePrefix, ); - const allScenarios = scenarioLoader.loadAll(flags.testScenariosPath); + const allScenarios = scenarioLoader.loadAll(flags.testScenariosPath, flags.scenarioFilter); await scenarioRunner.runManyScenarios(allScenarios); } diff --git a/packages/@n8n/benchmark/src/scenario/scenario-loader.ts b/packages/@n8n/benchmark/src/scenario/scenario-loader.ts index 4f315c1bf7..2da9109e86 100644 --- a/packages/@n8n/benchmark/src/scenario/scenario-loader.ts +++ b/packages/@n8n/benchmark/src/scenario/scenario-loader.ts @@ -8,7 +8,7 @@ export class ScenarioLoader { /** * Loads all scenarios from the given path */ - loadAll(pathToScenarios: string): Scenario[] { + loadAll(pathToScenarios: string, filter?: string): Scenario[] { pathToScenarios = path.resolve(pathToScenarios); const scenarioFolders = fs .readdirSync(pathToScenarios, { withFileTypes: true }) @@ -18,6 +18,9 @@ export class ScenarioLoader { const scenarios: Scenario[] = []; for (const folder of scenarioFolders) { + if (filter && !folder.toLowerCase().includes(filter.toLowerCase())) { + continue; + } const scenarioPath = path.join(pathToScenarios, folder); const manifestFileName = `${folder}.manifest.json`; const scenarioManifestPath = path.join(pathToScenarios, folder, manifestFileName);