{"id":37017210,"url":"https://github.com/cossme/grinder","last_synced_at":"2026-01-14T01:58:19.823Z","repository":{"id":28336861,"uuid":"117019016","full_name":"cossme/grinder","owner":"cossme","description":"The Grinder, a Java Load Testing Framework","archived":false,"fork":false,"pushed_at":"2023-08-17T22:34:52.000Z","size":4288,"stargazers_count":38,"open_issues_count":27,"forks_count":16,"subscribers_count":6,"default_branch":"master","last_synced_at":"2025-07-09T21:42:10.003Z","etag":null,"topics":["grinder","load-testing"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cossme.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}},"created_at":"2018-01-10T22:31:12.000Z","updated_at":"2024-11-23T19:25:21.000Z","dependencies_parsed_at":"2022-09-26T22:11:11.335Z","dependency_job_id":null,"html_url":"https://github.com/cossme/grinder","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/cossme/grinder","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cossme%2Fgrinder","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cossme%2Fgrinder/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cossme%2Fgrinder/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cossme%2Fgrinder/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cossme","download_url":"https://codeload.github.com/cossme/grinder/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cossme%2Fgrinder/sbom","scorecard":{"id":305725,"data":{"date":"2025-08-11","repo":{"name":"github.com/cossme/grinder","commit":"bec249fa126f6ecf8e34003967f87d1a60b73b86"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":1.2,"checks":[{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Code-Review","score":0,"reason":"Found 0/7 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Binary-Artifacts","score":8,"reason":"binaries present in source code","details":["Warn: binary detected: grinder-test-support/src/main/resources/net/grinder/testutility/resources/SimpleObject.clazz:1","Warn: binary detected: grinder/contrib/mq/org.rextency.mq.jar:1"],"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"License","score":9,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Warn: project license file does not contain an FSF or OSI license."],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact 4.0.0 not signed: https://api.github.com/repos/cossme/grinder/releases/10035813","Warn: release artifact 3.13 not signed: https://api.github.com/repos/cossme/grinder/releases/9316433","Warn: release artifact 3.11 not signed: https://api.github.com/repos/cossme/grinder/releases/9203314","Warn: release artifact 4.0.0 does not have provenance: https://api.github.com/repos/cossme/grinder/releases/10035813","Warn: release artifact 3.13 does not have provenance: https://api.github.com/repos/cossme/grinder/releases/9316433","Warn: release artifact 3.11 does not have provenance: https://api.github.com/repos/cossme/grinder/releases/9203314"],"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: containerImage not pinned by hash: docker/Dockerfile:1: pin your Docker image by updating openjdk:8u151-jdk-alpine3.7 to openjdk:8u151-jdk-alpine3.7@sha256:bd4030dd52cfb61a61e622fe74483e4e2089a2ef3d782bbf742a0d99093da119","Info:   0 out of   1 containerImage dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 24 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":0,"reason":"50 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-vmfg-rjjm-rjrj","Warn: Project is vulnerable to: GHSA-vmq6-5m68-f53m","Warn: Project is vulnerable to: GHSA-668q-qrv7-99fm","Warn: Project is vulnerable to: GHSA-6v67-2wr5-gvf4","Warn: Project is vulnerable to: GHSA-pr98-23f8-jwxv","Warn: Project is vulnerable to: GHSA-h46c-h94j-95f3","Warn: Project is vulnerable to: GHSA-wf8f-6423-gfxg","Warn: Project is vulnerable to: GHSA-jjjh-jjxp-wpff","Warn: Project is vulnerable to: GHSA-rgv9-q543-rqg4","Warn: Project is vulnerable to: GHSA-27hp-xhwr-wr2m","Warn: Project is vulnerable to: GHSA-5j33-cvvr-w245","Warn: Project is vulnerable to: GHSA-7w75-32cg-r6g2","Warn: Project is vulnerable to: GHSA-83qj-6fr2-vhqg","Warn: Project is vulnerable to: GHSA-fccv-jmmp-qg76","Warn: Project is vulnerable to: GHSA-g8pj-r55q-5c2v","Warn: Project is vulnerable to: GHSA-h2fw-rfh5-95r3","Warn: Project is vulnerable to: GHSA-h3gc-qfqq-6h8f","Warn: Project is vulnerable to: GHSA-hfrx-6qgj-fp6c","Warn: Project is vulnerable to: GHSA-p22x-g9px-3945","Warn: Project is vulnerable to: GHSA-q3mw-pvr8-9ggc","Warn: Project is vulnerable to: GHSA-qppj-fm5r-hxr3","Warn: Project is vulnerable to: GHSA-r6j3-px5g-cq3x","Warn: Project is vulnerable to: GHSA-rq2w-37h9-vg94","Warn: Project is vulnerable to: GHSA-wc4r-xq3c-5cf3","Warn: Project is vulnerable to: GHSA-wm9w-rjj3-j356","Warn: Project is vulnerable to: GHSA-v682-8vv8-vpwr","Warn: Project is vulnerable to: GHSA-rc42-6c7j-7h5r","Warn: Project is vulnerable to: GHSA-xf96-w227-r7c4","Warn: Project is vulnerable to: GHSA-hh26-6xwr-ggv7","Warn: Project is vulnerable to: GHSA-4gc7-5j7h-4qph","Warn: Project is vulnerable to: GHSA-4wp7-92pw-q264","Warn: Project is vulnerable to: GHSA-g5mm-vmx4-3rg7","Warn: Project is vulnerable to: GHSA-564r-hj7v-mcr5","Warn: Project is vulnerable to: GHSA-9cmq-m9j5-mvww","Warn: Project is vulnerable to: GHSA-wxqc-pxw9-g2p8","Warn: Project is vulnerable to: GHSA-2rmj-mq67-h97g","Warn: Project is vulnerable to: GHSA-2wrp-6fg6-hmc5","Warn: Project is vulnerable to: GHSA-4wrc-f8pq-fpqp","Warn: Project is vulnerable to: GHSA-ccgv-vj62-xf9h","Warn: Project is vulnerable to: GHSA-hgjh-9rj2-g67j","Warn: Project is vulnerable to: GHSA-cx7f-g6mp-7hqm","Warn: Project is vulnerable to: GHSA-g5vr-rgqm-vf78","Warn: Project is vulnerable to: GHSA-w3c8-7r8f-9jp8","Warn: Project is vulnerable to: GHSA-3mc7-4q67-w48m","Warn: Project is vulnerable to: GHSA-98wm-3w3q-mw94","Warn: Project is vulnerable to: GHSA-9w3m-gqgf-c4p9","Warn: Project is vulnerable to: GHSA-c4r9-r8fh-9vj2","Warn: Project is vulnerable to: GHSA-hhhw-99gj-p3c3","Warn: Project is vulnerable to: GHSA-mjmj-j48q-9wg2","Warn: Project is vulnerable to: GHSA-w37g-rhq8-7m4j"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-17T21:59:00.371Z","repository_id":28336861,"created_at":"2025-08-17T21:59:00.371Z","updated_at":"2025-08-17T21:59:00.371Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28408704,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-14T01:52:23.358Z","status":"ssl_error","status_checked_at":"2026-01-14T01:40:32.775Z","response_time":56,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["grinder","load-testing"],"created_at":"2026-01-14T01:58:19.276Z","updated_at":"2026-01-14T01:58:19.815Z","avatar_url":"https://github.com/cossme.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n# The Grinder\n\nThe Grinder is a framework for running test scripts across a number of machines aimed at running load test. The framework is comprised of three types of _process_\n(or program): _worker processes_, _agent processes_, and the _console_. The responsibilities of each of the process types are:\n\n*   **Worker processes**\n    *   Interprets test scripts and performs the tests.  \n        Each worker process can run many tests in parallel using a number of _worker threads_.\n*   **Agent processes**\n    *   Long running process that starts and stops worker processes as required.\n    *   Maintains a local cache of test scripts distributed from the console.\n*   **The Console**\n    *   Coordinates the other processes.\n    *   Collates and displays statistics.\n    *   Provides script editing and distribution.\n\n# Download\nYou can download the latest grinder version [here](https://github.com/cossme/grinder/releases/download/4.0.0/grinder-4.0.0-binary.zip)\n    \n# Grinder Architecture    \n\nAs The Grinder is written in Java, each of these processes is a Java Virtual Machine (JVM).\n\n![The Grinder Processes](https://github.com/solcyr/grinder/raw/master/docs/images/processes.png)\n\nFor heavy duty testing, you start an agent process on each of several load injector machines. The worker processes they launch can be \ncontrolled and monitored using the console. There is little reason to run more than one agent on each load injector, but you can if\nyou wish.\n\n\n# Tests and test scripts\n\nA _test_ is a unit of work against which statistics are recorded. Tests are uniquely defined by a _test number_ and also have a \n_description_. Users specify which tests to run using a test script. If you wish your scripts can report many different actions\n(e.g. different web page requests) against the same test, The Grinder will aggregate the results.\n\nThe script is executed many times in a typical testing scenario. Each worker process has a number of worker threads,\nand each worker thread calls the script a number of times. A single execution of a test script is called a _run_.\n\nYou can write scripts for use with the Grinder by hand. There are a number of examples of how to do this in the\n[Script Gallery](https://cossme.github.io/grinder/guide/script-gallery.html). \nSee the [Scripts](https://cossme.github.io/grinder/guide/scripts.html) section for more details on how to create scripts.\n\nIf you are creating a script to test a web site or web application, you can use the \n[TCPProxy](https://cossme.github.io/grinder/guide/tcpproxy.html) to record a browser session as a script.\n\n# Network communication\n\nEach worker process sets up a network connection to the console to report statistics. \nEach agent process sets up a connection to the console to receive commands, which it passes on to its worker processes.\nThe console listens for both types of connection on a particular address and port.\nBy default, the console listens on port `6372` on all local network interfaces of the machine running the console.\n\nIf an agent process fails to connect to the console, or the `grinder.useConsole` property is `false`,\nthe agent will continue independently without the console and automatically will start its worker processes. \nThe worker processes will run to completion and not report to the console. This can be useful when you want to quickly try \nout a test script without bothering to start the console.\n\n\u003e To change the console addresses, set the `grinder.consoleHost` and `grinder.consolePort` properties in the \n\u003e [`grinder.properties`](https://cossme.github.io/grinder/guide/properties.html) file before starting The Grinder agents.\n\u003e The values should match those specified in the console options dialog.\n\n# Output\n\nEach worker process writes logging information to a file called `host-n.log`, where `host` is the machine host name and `n` \nis the worker process number.\n\nData about individual test invocations is written into a file called `host-n-data.log` that can be imported into a spreadsheet\ntool such as Microsoft Excel\u003csup\u003eTM\u003c/sup\u003e for further analysis. The data file is the only place where information about individual\ntests is recorded; the console displays only aggregate information.\n\nThe final statistics summary (in the log file of each process) looks something like this:\n\n```\nFinal statistics for this process:\n\n              Successful\n              Tests         Errors        Mean Test    Test Time\n                                          Time (ms)    Standard\n                                                       Deviation\n                                                       (ms)\n                                                       \nTest 0        25            0             255.52       22.52\nTest 1        25            0             213.40       25.15\nTest 2        25            0             156.80       20.81         \"Image\"\nTest 3        25            0             90.48        14.41\nTest 4        25            0             228.68       23.97         \"Login page\"\nTest 5        25            0             86.12        12.53         \"Security check\"\nTest 6        25            0             216.20       8.89\nTest 7        25            0             73.20        12.83\nTest 8        25            0             141.92       18.36\nTest 9        25            0             104.68       19.86         \"Logout page\"\n\nTotals        250           0             156.70       23.32\n```\n\nThe console has a dynamic display of similar information collected from all the worker processes. \nPlug-ins and advanced test scripts can provide additional statistics; for example, the HTTP plug-in adds \na statistic for the content length of the response body.\n\nEach test has one of two possible outcomes:\n\n1.  Success. The number of _Successful Tests_ for that test is incremented The time taken to perform the test is added to the _Total_.\n2.  Error. The execution of a test raised an exception. The number of _Errors_ for the test is incremented. The time taken is discarded.\n\nThe _Total_, _Mean_, and _Standard Deviation_ figures are calculated based only on successful tests.\n\n\n# How do I start The Grinder?\n\nIt's easy:\n\n1.  Create a `grinder.properties` file. This file specifies general control information (how the worker processes should \ncontact the console, how many worker processes to use, ..), as well as the name of the test script that will be used to \nrun the tests.\n2.  Set your `CLASSPATH` to include the `grinder.jar` file which can be found in the `lib` directory.\n3.  Start the console on one of the test machines: `java net.grinder.Console`\n4.  For each test machine, do steps 1\\. and 2\\. and start an agent process: `java net.grinder.Grinder`\n\n    The agent will look for the `grinder.properties` file in the local directory. The test script is usually stored alongside \n    the properties file. If you like, you can specify an explicit properties file as the first argument. For example:\n\n    `java net.grinder.Grinder myproperties`\n\nThe console does not read the `grinder.properties` file. It has its own options dialog (choose the _File/Options_ menu option)\nwhich you should use to set the communication addresses and ports to match those in the `grinder.properties` files.\nThe console [process controls](site:console/ui/process-controls) can be used to trigger The Grinder test scenario. \nEach agent process then creates child worker processes to do the work.\n\n\u003e When you know a little more about the console, you can use it to edit and distribute properties files and scripts instead\n\u003e of copying them to each agent machine.\u003c/note\u003e\n\nAs the worker processes execute, they dynamically inform the console of the tests in the test script. \nIf you start the console after the agent process, you should press the _Reset processes_ button. \nThis will cause the existing worker processes to exit and the agent process to start fresh worker processes which will \nupdate the console with the new test information.\n\nIncluded below are some sample scripts, for both Unix/Linux and Windows, for starting grinder agents, the console, and the\n[TCPProxy](site:tcpproxy) for recording HTTP scripts.\n\n## Windows\n\n### setGrinderEnv.cmd\n```set GRINDERPATH=(full path to grinder installation directory)\nset GRINDERPROPERTIES=(full path to grinder.properties)\\grinder.properties\nset CLASSPATH=%GRINDERPATH%\\lib\\grinder.jar;%CLASSPATH%\nset JAVA_HOME=(full path to java installation directory)\nPATH=%JAVA_HOME%\\bin;%PATH%\n```\n### startAgent.cmd\n```call (path to setGrinderEnv.cmd)\\setGrinderEnv.cmd\necho %CLASSPATH%\njava -classpath %CLASSPATH% net.grinder.Grinder %GRINDERPROPERTIES%\n```\n### startConsole.cmd\n```call (path to setGrinderEnv.cmd)\\setGrinderEnv.cmd\njava -classpath %CLASSPATH% net.grinder.Console\n```\n### startProxy.cmd\n```call (path to setGrinderEnv.cmd)\\setGrinderEnv.cmd\njava -classpath %CLASSPATH% net.grinder.TCPProxy -console -http \u003e grinder.py\n```\n\n##\u003c Unix\n\n### setGrinderEnv.sh \n```#!/usr/bin/ksh\nGRINDERPATH=(full path to grinder installation directory)\nGRINDERPROPERTIES=(full path to grinder.properties)/grinder.properties\nCLASSPATH=$GRINDERPATH/lib/grinder.jar:$CLASSPATH\nJAVA_HOME=(full path to java installation directory)\nPATH=$JAVA_HOME/bin:$PATH\nexport CLASSPATH PATH GRINDERPROPERTIES\n```\n### startAgent.sh \n```#!/usr/bin/ksh\n. (path to setGrinderEnv.sh)/setGrinderEnv.sh\njava -classpath $CLASSPATH net.grinder.Grinder $GRINDERPROPERTIES\n```\n### startConsole.sh \n```\n#!/usr/bin/ksh\n. (path to setGrinderEnv.sh)/setGrinderEnv.sh \njava -classpath $CLASSPATH net.grinder.Console\n```\n### startProxy.sh \n```\n#!/usr/bin/ksh\n. (path to setGrinderEnv.sh)/setGrinderEnv.sh\njava -classpath $CLASSPATH net.grinder.TCPProxy -console -http \u003e grinder.py\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcossme%2Fgrinder","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcossme%2Fgrinder","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcossme%2Fgrinder/lists"}