{"id":13429158,"url":"https://github.com/fcsonline/drill","last_synced_at":"2025-12-29T23:05:14.162Z","repository":{"id":37548327,"uuid":"91699290","full_name":"fcsonline/drill","owner":"fcsonline","description":"Drill is an HTTP load testing application written in Rust","archived":false,"fork":false,"pushed_at":"2024-02-29T19:31:37.000Z","size":357,"stargazers_count":2163,"open_issues_count":59,"forks_count":115,"subscribers_count":23,"default_branch":"master","last_synced_at":"2025-04-26T05:19:17.726Z","etag":null,"topics":["http","jmeter","performance","performance-testing","rust","tester"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/fcsonline.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":"2017-05-18T13:53:15.000Z","updated_at":"2025-04-25T12:11:12.000Z","dependencies_parsed_at":"2024-04-29T06:45:29.909Z","dependency_job_id":"44d33a72-a1a7-4299-a86d-029abdcabc07","html_url":"https://github.com/fcsonline/drill","commit_stats":{"total_commits":245,"total_committers":27,"mean_commits":9.074074074074074,"dds":"0.30204081632653057","last_synced_commit":"8ef2e256d4a7645c97bb395d6630118ab64e6d94"},"previous_names":[],"tags_count":17,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fcsonline%2Fdrill","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fcsonline%2Fdrill/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fcsonline%2Fdrill/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fcsonline%2Fdrill/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fcsonline","download_url":"https://codeload.github.com/fcsonline/drill/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254101558,"owners_count":22014908,"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":["http","jmeter","performance","performance-testing","rust","tester"],"created_at":"2024-07-31T02:00:28.646Z","updated_at":"2025-12-29T23:05:14.156Z","avatar_url":"https://github.com/fcsonline.png","language":"Rust","readme":"# Drill\n\n[![](https://img.shields.io/crates/v/drill.svg?ts=2)](https://crates.io/crates/drill)\n![](https://travis-ci.com/fcsonline/drill.svg?branch=master)\n\nDrill is a HTTP load testing application written in Rust. The main goal\nfor this project is to build a really lightweight tool as alternative to other\nthat require JVM and other stuff.\n\nYou can write benchmark files, in YAML format, describing all the stuff you\nwant to test.\n\nIt was inspired by [Ansible](http://docs.ansible.com/ansible/playbooks_intro.html)\nsyntax because it is really easy to use and extend.\n\nHere is an example for **benchmark.yml**:\n\n```yaml\n---\n\nconcurrency: 4\nbase: 'http://localhost:9000'\niterations: 5\nrampup: 2\n\nplan:\n  - name: Include comments\n    include: comments.yml\n\n  - name: Fetch users\n    request:\n      url: /api/users.json\n\n  - name: Fetch organizations\n    request:\n      url: /api/organizations\n\n  - name: Fetch account\n    request:\n      url: /api/account\n    assign: foo\n\n  - name: Fetch manager user\n    request:\n      url: /api/users/{{ foo.body.manager_id }}\n\n  - name: Assert request response code\n    assert:\n      key: foo.status\n      value: 200\n\n  - name: Assign values\n    assign:\n      key: bar\n      value: \"2\"\n\n  - name: Assert values\n    assert:\n      key: bar\n      value: \"2\"\n\n  - name: Fetch user from assign\n    request:\n      url: /api/users/{{ bar }}\n\n  - name: Fetch some users\n    request:\n      url: /api/users/{{ item }}\n    with_items:\n      - 70\n      - 73\n      - 75\n\n  - name: Tagged user request\n    request:\n      url: /api/users/70\n    tags:\n      - tag_user\n\n  - name: Fetch some users by hash\n    request:\n      url: /api/users/{{ item.id }}\n    with_items:\n      - { id: 70 }\n      - { id: 73 }\n      - { id: 75 }\n\n  - name: Fetch some users by range, index {{ index }}\n    request:\n      url: /api/users/{{ item }}\n    with_items_range:\n      start: 70\n      step: 5\n      stop: 75\n\n  - name: Fetch some users from CSV, index {{ index }}\n    request:\n      url: /api/users/contacts/{{ item.id }}\n    with_items_from_csv: ./fixtures/users.csv\n    shuffle: true\n\n  - name: POST some crafted JSONs stored in CSV, index {{ index }}\n    request:\n      url: /api/transactions\n      method: POST\n      body: '{{ item.txn }}'\n      headers:\n        Content-Type: 'application/json'\n    with_items_from_csv:\n      file_name: ./fixtures/transactions.csv\n      quote_char: \"\\\\'\"\n\n  - name: Fetch no relative url\n    request:\n      url: http://localhost:9000/api/users.json\n\n  - name: Interpolate environment variables\n    request:\n      url: http://localhost:9000/api/{{ EDITOR }}\n\n  - name: Support for POST method\n    request:\n      url: /api/users\n      method: POST\n      body: foo=bar\u0026arg={{ bar }}\n\n  - name: Support for hex-encoded request body\n    request:\n      url: /api/blob\n      method: POST\n      body:\n        hex: 65 78 61 6D 70 6C 65\n\n  - name: Support request body loaded from a file\n    request:\n      url: /api/blob\n      method: POST\n      body:\n        file: ./image.png\n\n  - name: Login user\n    request:\n      url: /login?user=example\u0026password=3x4mpl3\n\n  - name: Fetch counter\n    request:\n      url: /counter\n    assign: memory\n\n  - name: Fetch counter\n    request:\n      url: /counter\n    assign: memory\n\n  - name: Fetch endpoint\n    request:\n      url: /?counter={{ memory.body.counter }}\n\n  - name: Reset counter\n    request:\n      method: DELETE\n      url: /\n\n  - name: Exec external commands\n    exec:\n      command: \"echo '{{ foo.body }}' | jq .phones[0] | tr -d '\\\"'\"\n    assign: baz\n\n  - name: Custom headers\n    request:\n      url: /admin\n      headers:\n        Authorization: Basic aHR0cHdhdGNoOmY=\n        X-Foo: Bar\n        X-Bar: Bar {{ memory.headers.token }}\n\n  - name: One request with a random item\n    request:\n      url: /api/users/{{ item }}\n    with_items:\n      - 70\n      - 73\n      - 75\n    shuffle: true\n    pick: 1\n\n  - name: Three requests with random items from a range\n    request:\n      url: /api/users/{{ item }}\n    with_items_range:\n      start: 1\n      stop: 1000\n    shuffle: true\n    pick: 3\n```\n\nAs you can see, you can play with interpolations in different ways. This\nwill let you specify a benchmark with different requests and\ndependencies between them.\n\nIf you want to know more about the benchmark file syntax, [read this](./SYNTAX.md)\n\n## Install\n\nRight now, the easiest way to get `drill` is to go to the\n[latest release](https://github.com/fcsonline/drill/releases/latest)\npage and download the binary file for your platform.\n\n\nAnother way to install `drill`, if you have [Rust](https://rustup.rs/) available in\nyour system, is with [cargo](https://doc.rust-lang.org/cargo/getting-started/installation.html):\n\n```\ncargo install drill\ndrill --benchmark benchmark.yml --stats\n```\n\nor download the source code and compile it:\n\n```\ngit clone git@github.com:fcsonline/drill.git \u0026\u0026 cd drill\ncargo build --release\n./target/release/drill --benchmark benchmark.yml --stats\n```\n\n### Dependencies\n\nOpenSSL is needed in order to compile Drill, whether it is through `cargo install`\nor when compiling from source with `cargo build`.\n\nDepending on your platform, the name of the dependencies may differ.\n\n#### Linux\n\nInstall `libssl-dev` and `pkg-config` packages with your favorite package manager\n(if `libssl-dev` is not found, try other names like `openssl` or `openssl-devel`).\n\n#### macOS\n\nFirst, install the [Homebrew](https://brew.sh/) package manager.\n\nAnd then install `openssl` with Homebrew.\n\n#### Windows\n\nFirst, install [vcpkg](https://vcpkg.io/en/getting-started.html).\n\nAnd then run `vcpkg install openssl:x64-windows-static-md`.\n\n## Demo\n\n[![demo](https://asciinema.org/a/164615.png)](https://asciinema.org/a/164615?autoplay=1)\n\n## Features\n\nThis is the list of all features supported by the current version of `drill`:\n\n- **Concurrency:** run your benchmarks choosing the number of concurrent iterations.\n- **Multi iterations:** specify the number of iterations you want to run the benchmark.\n- **Ramp-up:** specify the amount of time, in seconds, that it will take `drill` to start all iterations.\n- **Delay:** introduce controlled delay between requests. Example: [delay.yml](./example/delay.yml)\n- **Dynamic urls:** execute requests with dynamic interpolations in the url, like `/api/users/{{ item }}`\n- **Dynamic headers:** execute requests with dynamic headers. Example: [headers.yml](./example/headers.yml)\n- **Interpolate environment variables:** set environment variables, like `/api/users/{{ EDITOR }}`\n- **Executions:** execute remote commands with test plan data.\n- **Assertions:** assert values during the test plan. Example: [iterations.yml](./example/iterations.yml)\n- **Request dependencies:** create dependencies between requests with `assign` and url interpolations.\n- **Split files:** organize your benchmarks in multiple files and include them.\n- **CSV support:** read CSV files and build N requests fill dynamic interpolations with CSV data.\n- **HTTP methods:** build request with different http methods like GET, POST, PUT, PATCH, HEAD or DELETE.\n- **Cookie support:** create benchmarks with sessions because cookies are propagates between requests.\n- **Stats:** get nice statistics about all the requests. Example: [cookies.yml](./example/cookies.yml)\n- **Thresholds:** compare the current benchmark performance against a stored one session and fail if a threshold is exceeded.\n- **Tags:** specify test plan items by tags.\n\n## Test it\n\nGo to the `example` directory and you'll find a [README](./example) how\nto test it in a safe environment.\n\n**Disclaimer**: We really recommend not to run intensive benchmarks against\nproduction environments.\n\n## Command line interface\n\nFull list of cli options, which is available under `drill --help`\n\n```\ndrill 0.9.0\nHTTP load testing application written in Rust inspired by Ansible syntax\n\nUSAGE:\n    drill [FLAGS] [OPTIONS] --benchmark \u003cbenchmark\u003e\n\nFLAGS:\n    -h, --help                      Prints help information\n        --list-tags                 List all benchmark tags\n        --list-tasks                List benchmark tasks (executes --tags/--skip-tags filter)\n    -n, --nanosec                   Shows statistics in nanoseconds\n        --no-check-certificate      Disables SSL certification check. (Not recommended)\n    -q, --quiet                     Disables output\n        --relaxed-interpolations    Do not panic if an interpolation is not present. (Not recommended)\n    -s, --stats                     Shows request statistics\n    -V, --version                   Prints version information\n    -v, --verbose                   Toggle verbose output\n\nOPTIONS:\n    -b, --benchmark \u003cbenchmark\u003e    Sets the benchmark file\n    -c, --compare \u003ccompare\u003e        Sets a compare file\n    -r, --report \u003creport\u003e          Sets a report file\n        --skip-tags \u003cskip-tags\u003e    Tags to exclude\n        --tags \u003ctags\u003e              Tags to include\n    -t, --threshold \u003cthreshold\u003e    Sets a threshold value in ms amongst the compared file\n    -o, --timeout \u003ctimeout\u003e        Set timeout in seconds for all requests\n```\n\n## Roadmap\n\n- Complete and improve the interpolation engine\n- Add writing to a file support\n\n## Donations\n\nIf you appreciate all the job done in this project, a small donation is always welcome:\n\n[![\"Buy Me A Coffee\"](https://www.buymeacoffee.com/assets/img/custom_images/orange_img.png)](https://www.buymeacoffee.com/fcsonline)\n\n## Contribute\n\nThis project started as a side project to learn Rust, so I'm sure that is full\nof mistakes and areas to be improve. If you think you can tweak the code to\nmake it better, I'll really appreciate a pull request. ;)\n\n","funding_links":["https://www.buymeacoffee.com/fcsonline"],"categories":["PGO Showcases","Applications","Rust","\u003ca name=\"performance\"\u003e\u003c/a\u003eperformance","Testing","应用","应用 Applications","应用程序 Applications","rust"],"sub_categories":["Other","Load Testing","贡献","Performance"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffcsonline%2Fdrill","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffcsonline%2Fdrill","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffcsonline%2Fdrill/lists"}