{"id":20236556,"url":"https://github.com/wdias/wdias-performance-test","last_synced_at":"2026-05-08T12:35:08.632Z","repository":{"id":128397608,"uuid":"143845467","full_name":"wdias/wdias-performance-test","owner":"wdias","description":"Distributed performance testing based on JMeter.","archived":false,"fork":false,"pushed_at":"2020-02-01T20:26:28.000Z","size":28693,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-01-14T00:48:37.418Z","etag":null,"topics":["distributed-testing","jmeter","performance-testing","wdias"],"latest_commit_sha":null,"homepage":null,"language":"Groovy","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/wdias.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-08-07T08:46:33.000Z","updated_at":"2020-02-01T20:26:30.000Z","dependencies_parsed_at":"2024-08-24T07:30:27.870Z","dependency_job_id":null,"html_url":"https://github.com/wdias/wdias-performance-test","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wdias%2Fwdias-performance-test","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wdias%2Fwdias-performance-test/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wdias%2Fwdias-performance-test/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wdias%2Fwdias-performance-test/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/wdias","download_url":"https://codeload.github.com/wdias/wdias-performance-test/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":241680184,"owners_count":20002051,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["distributed-testing","jmeter","performance-testing","wdias"],"created_at":"2024-11-14T08:21:49.619Z","updated_at":"2026-05-08T12:35:03.603Z","avatar_url":"https://github.com/wdias.png","language":"Groovy","funding_links":[],"categories":[],"sub_categories":[],"readme":"# wdias-performance-test\nDistributed performance testing based on JMeter.\n\n## Dev Guide\n#### How to run grrovy code\n- Download Groovy same as JMeter JSR223 version and extract into the folder (Add permission to run, if required)\n- `./groovy-2.4.16/bin/groovy ./scripts/wait_for_extension_timeseries.groovy`\n#### Evaluate the Bash Script\n- `bash -x ./bin/macos/test-dev  enable import scalar`\n\n## Installation\n- Downalod Apache JMeter 5.0 - `wget https://archive.apache.org/dist/jmeter/binaries/apache-jmeter-5.0.tgz`\n- Extract `tar -xzf apache-jmeter-5.0.tgz`\n- Run JMeter - `./apache-jmeter-5.0/bin/jmeter \u0026`\n- Download JMeter Plugin Manager - `curl -O -J -L https://jmeter-plugins.org/get/  \u0026\u0026 mv jmeter-plugins-manager-1.3.jar apache-jmeter-5.0/lib/ext`\n- Open the `wdias_performance_test.jmx` test cases, then JMeter will asked to install the requered plugins\n\n## Test Plan\n1. Test Setup to create timeseries in 1hr, 5min and 1min intervals and create metadata of the timeseries\n2. Import Timeseries\n  - Plan for test run of 1 hour. In each test run change the request size from 1hr, 5min to 1min. (total 3 hours)\n  - Have mixture of data: Scalar - 70%(max 2100req), Vector (Multi-Scalar) - 20% (max 600req), Grid - 10% (max 300req)\n3. Extensions\n  - Create Extensions for /Aggregation_Accumulative, /Interpolation Linear, /Validation Missing Values (OnChange and OnTime)\n  - 1 hour of test run. Just for 1min data. (total 1 hours)\n  - Do with Import Timeseries with error data which will go through extensions.\n4. Export Timeseries\n  - 1 hour test run. Change request size from 1hr, 5min to 1min. (total 3 hours)\n  - Have mixture of data: Scalar - 70%, Vector (Multi-Scalar) - 20%, Grid - 10% (Use the Imported - - - Data before and verify against Extensions)\n5. Import + Extension + Export + Timeseries Queries\n  - 1 hour test run. Change with request size from 1hr, 5min to 1min. (total 3 hours)\n\n## Help\n- Enable one of MODULE\n  - MODULE: import(i) | export(e) | extension(x) | all(a)\n  - `./bin/macos/test-dev enable import`\n- Disable one of MODULE\n  - `./bin/macos/test-dev disable import`\n- Run test case with given MODULE and REQ_SIZE\n  - MODULE: import(i) | export(e) | extension(x) | all(a)\n  - REQ_SIZE: 24(1) | 288(2) | 1044(3)\n  - `./bin/macos/test-dev once import 24` or `./bin/macos/test-dev once i 1`\n- Run in Distributed Mode\n  - `SERVER_IPS=\u003cIP1,IP2...\u003e /bin/macos/test-dev once 24 all`\nUsing above commands it's possible to cover the \"Test Plan\" above.\nIt's possible to run the test cases in two modes: `prod` or `dev`. In each envirnment, configure the `./bin/macos/test.conf` as appropriate. \n\n### Prod testing\n- Change the `ENV` value to `prod` in `test.conf`\n- Change `TST_FEEDBACK_\u003cMODULE\u003e_prod_\u003cDATA_TYPE\u003e` as necessary according to Throughput Step Timer for each `tst-timer-\u003cMODULE\u003e_prod_\u003cDATA_TYPE\u003e`\n  - Format: `\u003cINITIAL_THREADS,MAXIMUM_THREADS,NUMBER_OF_THREADS_TO_KEEP_ONDEMAND\u003e`\n  - E.g. `\"100,3000,50\"` means;\n    - init concurrency thread group with 100 threads\n    - allow up to create 3000 threads in order to keep number of requests hold as mentioned in Throughput Step Timer\n    - create extra 50 threads in order to provide more threads on demand\n- Change `TST_HOLD_\u003cMODULE\u003e_prod_\u003cDATA_TYPE\u003e` as necessary\n  - The period of time that test case is running as defined in the Throughput Step Timer for each `tst-timer-\u003cMODULE\u003e_prod_\u003cDATA_TYPE\u003e`\n\n- Enable a module\n  - `./bin/macos/test-dev enable import`\n- Run the test case for the scenario\n  - `./bin/macos/test-dev run 24`\n- Disable the module\n  - `./bin/macos/test-dev disable import`\n\nEnable and run the test cases until it met the Test Plan conditions. If one instance can't run up to the given limits, then consider running multiple instance the same test case in order to fulfill given requirement.\nE.g. Lets consider 2nd case of Test Plan. For Import Scalar, it should be able to run at maximum of 2100 concurent requests. If it's unable to archive with one instance, then consider using 3 instances running parallel with each one is creating 2100/3 = 700 concurent requests.\n\n### Dev testing\n- - Change the `ENV` value to `dev` in `test.conf`\n\n## Support\n### Run via Command Line\n```\n./apache-jmeter-5.0/bin/jmeter.sh -n -t wdias_performance_test.jmx -l testresults.jtl -j non-ui.log -JreqSize=24\n```\n- https://stackoverflow.com/questions/14317715/jmeter-changing-user-defined-variables-from-command-line\n- Variable can be provide as properties file - https://gerardnico.com/jmeter/property_file#userproperties\n\n## K8s - Distributed JMeter\nCreated using [JMeter Distributed](https://github.com/helm/charts/tree/master/stable/distributed-jmeter) Helm charts.\nThe original helm charts try to install some plugins while creating the Docker container. But when we want to install other set of plugins, there're some conflicts which difficult to resolve.\n### Installation\n- Build and deploy into K8s with `wdias build ~/wdias/wdias-performance-test \u0026\u0026 wdias helm_delete ~/wdias/wdias-performance-test/helm/wdias-performance-test \u0026\u0026 wdias helm_install ~/wdias/wdias-performance-test/helm/wdias-performance-test`\n  - `wdias` refer to `wdias=\"~/wdias/wdias/bin/macos/dev\"` from [wdias](https://github.com/wdias/wdias)\n### Configuration\nIn order to run the Distributed JMeter within the same cluster, it need to set up a proper domain. In that case, requests will go outside of the cluster and come back though the ingress/load balancer.\nI that is not the case, it need to call via internal service calls. In order to support that, JMeter performance test contains User defined variable names for both the cases. Activate the appropriate User define variables as per the planing to do the performance test.\n\n### Helpers\n- Run test internally\n`jmeter -n -t /jmeter/wdias_performance_test.jmx`\n`jmeter -n -t /jmeter/wdias_performance_test.jmx -j ./logs/wdias_grid.log -l ./logs/wdias_grid.jtl`\n`jmeter -n -t /jmeter/wdias_performance_test.jmx -R \u003cSERVER_IPS...\u003e` - [Distributed Mode](http://www.testautomationguru.com/jmeter-distributed-load-testing-using-docker/)\n- Export IPs\n```sh\nexport MASTER_NAME=$(kubectl get pods -l wdias=jmeter-master -o jsonpath='{.items[*].metadata.name}')\nexport SERVER_IPS=$(kubectl get pods -lrole=server -o jsonpath='{.items[*].status.podIP}' | tr ' ' ',')\nkubectl exec -it $MASTER_NAME -- bash -c \"export SERVER_IPS=${SERVER_IPS}; ./test-plan/test_plan.sh /jmeter run 24\" \u0026\n---\nkubectl exec -it $MASTER_NAME -- jmeter -n -t /jmeter/wdias_performance_test.jmx -R $SERVER_IPS\nkubectl exec -it $MASTER_NAME -- /bin/bash\n--\nexport MASTER_NAME=$(kubectl get pods -l wdias=jmeter-master -o jsonpath='{.items[*].metadata.name}') \u0026\u0026 \\\nkubectl exec -it $MASTER_NAME -- /bin/bash\n./bin/macos/test-dev once 24 DebugGrid\n./test-plan/test_plan.sh /jmeter grid 24\n```\n- Copy Results from container to local\n`kubectl get pods | grep 'wdias-performance-test-master' | awk '{print $1}' | xargs -o -I {} kubectl cp default/{}:/jmeter/logs/wdias_grid.jtl ./logs/wdias_grid.jtl`\n- Copy all result files from container to local\n```\n\u003c./test-plan/logs.txt | xargs  -n1  -I {} kubectl cp default/$(kubectl get pods -l wdias=jmeter-master -o jsonpath='{.items[*].metadata.name}'):/jmeter/logs/{}.jtl ./logs/{}.jtl\n# For (UNIX)\ncat ./test-plan/logs.txt | xargs  -n1  -I {} kubectl cp default/$(kubectl get pods -l wdias=jmeter-master -o jsonpath='{.items[*].metadata.name}'):/jmeter/logs/{}.jtl ./logs/{}.jtl\n```\n- Copy from REMOTE server to local\n`scp -i ~/.ssh/id_rsa.pem ubuntu@IP_ADDRESS:~/wdias/wdias-performance-test/logs/wdias_flow.jtl .`\n- Copy all result files from Remote server to local\n```\n\u003c./test-plan/logs.txt | xargs  -n1  -I {} scp -i ~/.ssh/id_rsa.pem ubuntu@IP_ADDRESS:~/wdias/wdias-performance-test/logs/{}.jtl ./aws_logs\n# For (UNIX);\ncat ./test-plan/logs.txt | xargs  -n1  -I {} scp -i ~/.ssh/id_rsa.pem ubuntu@IP_ADDRESS:~/wdias/wdias-performance-test/logs/{}.jtl ./aws_logs\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwdias%2Fwdias-performance-test","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwdias%2Fwdias-performance-test","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwdias%2Fwdias-performance-test/lists"}