{"id":15397361,"url":"https://github.com/adriaandejonge/loadtest","last_synced_at":"2025-07-20T06:33:42.307Z","repository":{"id":141891422,"uuid":"148982145","full_name":"adriaandejonge/loadtest","owner":"adriaandejonge","description":"Run load with URLs from access log","archived":false,"fork":false,"pushed_at":"2020-10-27T09:20:11.000Z","size":20,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-28T16:45:37.740Z","etag":null,"topics":["accesslog","failuretest","load","loadtest"],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/adriaandejonge.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-09-16T09:45:15.000Z","updated_at":"2024-09-27T06:00:48.000Z","dependencies_parsed_at":null,"dependency_job_id":"65cb84a7-dcad-4289-ad66-b5f2db6f1b0a","html_url":"https://github.com/adriaandejonge/loadtest","commit_stats":{"total_commits":24,"total_committers":1,"mean_commits":24.0,"dds":0.0,"last_synced_commit":"10ca77c8352239026ffa3a1c6527db1d285ea9c1"},"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/adriaandejonge/loadtest","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/adriaandejonge%2Floadtest","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/adriaandejonge%2Floadtest/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/adriaandejonge%2Floadtest/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/adriaandejonge%2Floadtest/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/adriaandejonge","download_url":"https://codeload.github.com/adriaandejonge/loadtest/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/adriaandejonge%2Floadtest/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266076387,"owners_count":23872750,"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":["accesslog","failuretest","load","loadtest"],"created_at":"2024-10-01T15:37:14.013Z","updated_at":"2025-07-20T06:33:42.259Z","avatar_url":"https://github.com/adriaandejonge.png","language":"Go","readme":"# Load Test\nGenerate load with URLs from access log. \n\nRunning a load test is fairly simple: just fire many requests to the server and gradually increase the number. However, the traffic this generates is often different from the patterns actually observed in production. Either a handful URLs is queried again and again or the site is spidered and every URL is accessed an equal number of times. In reality, a site has some popular URLs and some less popular URLs. Both of them are potential sources of latency. By generating load based on an access log, the distribution across URLs is more production-like. Also, typical 404s are tested and some funny query strings may be introduced as they would be in the real world.\n\nPlease note:\n * Time stamps are *ignored* The purpose of using an access-log is to get closer to production-like patterns, not replicating the exact traffic.\n * Only GET requests (no POST/PUT/HEAD/DELETE/etc)\n * Status codes in the access log are ignored so 200, 301, 302, 404, 500 etc are still getting called\n * Any query strings are still in the URL\n\n## Running:\n\n```\nUsage of loadtest:\n  -b string\n    \tbase URL as prefix in front of paths in access logs\n  -c int\n    \tnumber of concurrent requests (default 2)\n  -f string\n    \tcomma-separated list of URLs to filter (default \"a,b,c\")\n  -k\tkeep cookies across requests\n  -l string\n    \tfile name of access log file to interpret\n  -r int\n    \treport interval in seconds (default 1)\n  -rp\n    \trepeat after done reading log file\n  -s\tsuppress errors\n  -v\tverbose output\n```\n\ne.g.:\n```\n./loadtest -l=myaccesslogfile.log -f=http,//,/undesirable,/my-api -b=https://www.mydomain.com -r=5 -c=2 -k\n```\n\n## Production experience\n\nFrom experience, use concurrency 384 as a maximum concurrency per process. Spin up multiple instances of this load test on a single machine to get beyond this. A total number of 4 load tests ran well on a single machine (m4.2xlarge)\n\n## Building\n\nMake sure you have a recent version of Go installed.\n\n```\nGOOS=linux GOARCH=amd64 go get github.com/adriaandejonge/loadtest\nGOOS=windows GOARCH=amd64 go get github.com/adriaandejonge/loadtest\nGOOS=darwin GOARCH=amd64 go get github.com/adriaandejonge/loadtest\n```\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fadriaandejonge%2Floadtest","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fadriaandejonge%2Floadtest","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fadriaandejonge%2Floadtest/lists"}