Быстрый Старт
Что такое Bencher?
Bencher - это набор инструментов для непрерывного нагрузочного тестирования. Были ли у вас когда-нибудь проблемы с производительностью, влияющие на ваших пользователей? Bencher мог предотвратить это. Bencher позволяет вам обнаруживать и предотвращать регрессии производительности до того, как они попадут в продакшен.
- Запустите: Запустите ваши нагрузочные тесты локально или в CI с помощью ваших любимых инструментов для нагрузочного тестирования. CLI
bencher
просто оборачивает ваши существующие нагрузочные тесты и сохраняет их результаты. - Отслеживайте: Отслеживайте результаты ваших нагрузочных тестов со временем. Мониторьте, делайте запросы и стройте графики результатов с помощью веб-консоли Bencher на основе ветки исходного кода, нагрузочного тестового стенда и типа метрики.
- Поймайте: Ловите регрессии производительности в CI. Bencher использует передовые, настраиваемые аналитические инструменты, чтобы обнаруживать регрессии производительности, прежде чем они попадут в продакшен.
По тем же причинам, по которым модульные тесты запускаются в CI для предотвращения регрессий функций, нагрузочные тесты должны запускаться в CI с Bencher для предотвращения регрессий производительности. Баги производительности - это баги!
Установите CLI bencher
Для установки CLI bencher
вам нужно установить cargo
. Проверьте, установлен ли у вас cargo
.
Запустите: cargo --version
Вы должны увидеть что-то вроде:
$ cargo --version
cargo 1.65.0 (4bc8f24d3 2022-10-20)
Нормально, если ваш номер версии отличается. Главное, чтобы эта команда работала.
Если нет, следуйте инструкциям по установке cargo
через rustup
.
На Linux или macOS, запустите:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
С cargo
установленным, мы можем установить CLI bencher
.
Запустите:
cargo install --git https://github.com/bencherdev/bencher --tag v0.3.18 --locked bencher_cli
Вы должны увидеть что-то вроде:
$ cargo install --git https://github.com/bencherdev/bencher --tag 0.3.18 --locked bencher_cli
Installing bencher_cli v0.3.18 (/workspace/bencher/services/cli)
Updating crates.io index
…
Finished release [optimized] target(s) in 0.27s
Installing /workspace/.cargo/bin/bencher
Installed package `bencher_cli v0.3.18 (/workspace/bencher/services/cli)` (executable `bencher`)
Снова, нормально, если ваш вывод отличается. Главное, чтобы эта команда работала.
Наконец, давайте проверим, что у нас установлен CLI bencher
.
Запустите: bencher --version
Вы должны увидеть:
$ bencher —version
bencher 0.3.18
Создайте аккаунт в Bencher Cloud
Bencher - это открытое и само-хостимое программное обеспечение. Если вас интересует само-хостинг, ознакомьтесь с учебником по Docker для Bencher. Но для этого учебника мы будем использовать Bencher Cloud.
Зарегистрируйтесь в Bencher Cloud
После создания аккаунта, вам нужно будет подтвердить свой адрес электронной почты. Проверьте свою почту на наличие ссылки для подтверждения. После этого вы должны быть вошли в систему в Bencher Cloud.
Создайте API токен
Для использования API Bencher вам нужно создать API токен.
Перейдите к консоли Bencher.
Наведите мышью на свое имя в верхнем правом углу.
Должно появиться выпадающее меню. Выберите Tokens
.
На странице API Tokens нажмите кнопку ➕ Add
.
Добавить API токен
После создания нового API токена, вам нужно будет скопировать его в буфер обмена. В терминале, в котором вы планируете работать, экспортируйте API токен в виде переменной среды.
Запустите: export BENCHER_API_TOKEN=ВАШ_ТОКЕН
Если вы затем запустите: echo $BENCHER_API_TOKEN
Вы должны увидеть:
$ echo $BENCHER_API_TOKEN
ВАШ_ТОКЕН
🐰 Заметка: Если вы перейдете на другой терминал, вам нужно будет снова экспортировать API токен.
Создайте проект
Теперь, когда у нас есть учетная запись пользователя и API токен, мы можем создать проект. Сначала нам нужно знать, к какой организации принадлежит наш новый проект.
Запустите: bencher org ls
Вы должны увидеть что-то вроде:
$ bencher org ls
[
{
"name": "Saul Goodman",
"slug": "saul-goodman",
"uuid": "4581feb0-6cac-40a9-bd8a-d7865183b01e"
"created": "2022-07-06T11:24:36Z",
"modified": "2022-07-06T11:24:36Z"
}
]
Ваш вывод должен немного отличаться от приведенного выше:
uuid
является псевдослучайнымname
иslug
будут основаны на вашем имени пользователяcreated
иmodified
метки времени будут от того момента, когда вы только что зарегистрировались
Теперь мы можем создать новый проект внутри вашей организации.
Подставьте slug
вашей организации для аргумента --org
(например, ВАШ_ORG_SLUG
) в приведенную ниже команду.
Запустите: bencher project create --org ВАШ_ORG_SLUG --url http://www.savewalterwhite.com "Save Walter White"
Вы должны увидеть что-то вроде:
$ bencher project create --org saul-goodman --url http://www.savewalterwhite.com "Save Walter White"
{
"organization": "4581feb0-6cac-40a9-bd8a-d7865183b01e",
"name": "Save Walter White",
"slug": "save-walter-white-12345",
"uuid": "c6c2a8e8-685e-4413-9a19-5b79053a71b1"
"url": "http://www.savewalterwhite.com",
"public": true,
"created": "2022-07-06T11:36:24Z",
"modified": "2022-07-06T11:36:24Z"
}
Снова, ваш вывод должен немного отличаться от приведенного выше.
Главное, чтобы эта команда работала.
Отметьте поле slug
проекта (например, save-walter-white-12345
).
Запустите отчет
Наконец, мы готовы собрать некоторые показатели нагрузочных тестов! Для простоты в этом учебнике мы будем использовать фиктивные данные.
Запустите: bencher mock
Вы должны увидеть что-то вроде:
$ bencher mock
{
"bencher::mock_0": {
"latency": {
"value": 3.7865423396154463,
"lower_value": 3.4078881056539014,
"upper_value": 4.165196573576991
}
},
"bencher::mock_1": {
"latency": {
"value": 16.398332128878437,
"lower_value": 14.758498915990593,
"upper_value": 18.03816534176628
}
},
"bencher::mock_2": {
"latency": {
"value": 20.88091359871672,
"lower_value": 18.792822238845048,
"upper_value": 22.969004958588393
}
},
"bencher::mock_3": {
"latency": {
"value": 33.88103801203782,
"lower_value": 30.492934210834036,
"upper_value": 37.2691418132416
}
},
"bencher::mock_4": {
"latency": {
"value": 40.90515638867921,
"lower_value": 36.81464074981129,
"upper_value": 44.99567202754713
}
}
}
Ваш вывод должен отличаться от приведенного выше, так как данные псевдослучайные. Главное, чтобы эта команда работала.
Теперь давайте запустим отчет с использованием фиктивных данных нагрузочного измерения.
Подставьте slug
вашего проекта для аргумента --project
(то есть ВАШ_PROJECT_SLUG
) в команду ниже.
Запустите: bencher run --project ВАШ_PROJECT_SLUG "bencher mock"
Вы должны увидеть что-то вроде:
$ bencher run --project save-walter-white-12345 "bencher mock"
{
"bencher::mock_0": {
"latency": {
"value": 0.15496641529475275,
"lower_value": 0.13946977376527747,
"upper_value": 0.17046305682422802
}
},
"bencher::mock_1": {
"latency": {
"value": 18.648298578180437,
"lower_value": 16.783468720362393,
"upper_value": 20.513128435998482
}
},
"bencher::mock_2": {
"latency": {
"value": 28.20328182167366,
"lower_value": 25.382953639506294,
"upper_value": 31.023610003841025
}
},
"bencher::mock_3": {
"latency": {
"value": 34.45732560787596,
"lower_value": 31.01159304708836,
"upper_value": 37.903058168663556
}
},
"bencher::mock_4": {
"latency": {
"value": 44.9237520767597,
"lower_value": 40.43137686908373,
"upper_value": 49.41612728443567
}
}
}
{
"branch": "master",
"end_time": "2023-07-18T14:21:27.796871Z",
"results": [
"{\n \"bencher::mock_0\": {\n \"latency\": {\n \"value\": 0.15496641529475275,\n \"lower_value\": 0.13946977376527747,\n \"upper_value\": 0.17046305682422802\n }\n },\n \"bencher::mock_1\": {\n \"latency\": {\n \"value\": 18.648298578180437,\n \"lower_value\": 16.783468720362393,\n \"upper_value\": 20.513128435998482\n }\n },\n \"bencher::mock_2\": {\n \"latency\": {\n \"value\": 28.20328182167366,\n \"lower_value\": 25.382953639506294,\n \"upper_value\": 31.023610003841025\n }\n },\n \"bencher::mock_3\": {\n \"latency\": {\n \"value\": 34.45732560787596,\n \"lower_value\": 31.01159304708836,\n \"upper_value\": 37.903058168663556\n }\n },\n \"bencher::mock_4\": {\n \"latency\": {\n \"value\": 44.9237520767597,\n \"lower_value\": 40.43137686908373,\n \"upper_value\": 49.41612728443567\n }\n }\n}\n"
],
"settings": {},
"start_time": "2023-07-18T14:21:27.773930Z",
"testbed": "base"
}
{
"uuid": "5554a92c-6f5c-481d-bd47-990f0a9bac6d",
"user": { ... },
"project": { ... },
"branch": { ... },
"testbed": { ...},
"start_time": "2023-07-18T14:21:27Z",
"end_time": "2023-07-18T14:21:27Z",
"adapter": "magic",
"results": [
[
{
"metric_kind": { ... },
"threshold": null,
"benchmarks": [ ... ]
}
]
],
"alerts": [],
"created": "2023-07-18T14:21:27Z"
}
View results:
- bencher::mock_0: https://bencher.dev/console/projects/save-walter-white-12345/perf?metric_kinds=4358146b-b647-4869-9d24-bd22bb0c49b5&branches=95521eff-09fa-4c02-abe1-dd824108869d&testbeds=5b4a6f3e-a27d-4cc3-a2ce-851dc6421e6e&benchmarks=88375e7c-f1e0-4cbb-bde1-bdb7773022ae
- bencher::mock_1: https://bencher.dev/console/projects/save-walter-white-12345/perf?metric_kinds=4358146b-b647-4869-9d24-bd22bb0c49b5&branches=95521eff-09fa-4c02-abe1-dd824108869d&testbeds=5b4a6f3e-a27d-4cc3-a2ce-851dc6421e6e&benchmarks=e81c7863-cc4b-4e22-b507-c1e238871137
- bencher::mock_2: https://bencher.dev/console/projects/save-walter-white-12345/perf?metric_kinds=4358146b-b647-4869-9d24-bd22bb0c49b5&branches=95521eff-09fa-4c02-abe1-dd824108869d&testbeds=5b4a6f3e-a27d-4cc3-a2ce-851dc6421e6e&benchmarks=31dede44-d23a-4baf-b639-63f2ac742e42
- bencher::mock_3: https://bencher.dev/console/projects/save-walter-white-12345/perf?metric_kinds=4358146b-b647-4869-9d24-bd22bb0c49b5&branches=95521eff-09fa-4c02-abe1-dd824108869d&testbeds=5b4a6f3e-a27d-4cc3-a2ce-851dc6421e6e&benchmarks=c7e32369-f3dd-473d-99a3-6289ae32b38e
- bencher::mock_4: https://bencher.dev/console/projects/save-walter-white-12345/perf?metric_kinds=4358146b-b647-4869-9d24-bd22bb0c49b5&branches=95521eff-09fa-4c02-abe1-dd824108869d&testbeds=5b4a6f3e-a27d-4cc3-a2ce-851dc6421e6e&benchmarks=779bc477-4964-4bae-aa8c-4da3e388822c
Теперь вы можете увидеть результаты каждого теста в браузере.
Нажмите или скопируйте и вставьте ссылки из View results
.
Там должна быть только одна точка данных для каждого теста, поэтому давайте добавим больше данных!
Во-первых, давайте установим наш slug
проекта в качестве переменной среды, чтобы мы не должны были его предоставлять с --project
при каждом запуске.
Запустите: export BENCHER_PROJECT=save-walter-white-12345
Если вы затем запустите: echo $BENCHER_PROJECT
Вы должны увидеть:
$ echo $BENCHER_PROJECT
save-walter-white-12345
Давайте заново запустим ту же команду без --project
, чтобы сгенерировать больше данных.
Запустите: bencher run "bencher mock"
Теперь давайте сгенерируем больше данных, но на этот раз мы будем передавать наши результаты в bencher run
.
Запустите: bencher mock | bencher run
Иногда вы можете захотеть сохранить свои результаты в файл и позволить bencher run
их выбрать.
Запустите: bencher run "bencher mock > results.json" --file results.json
Также, вы можете иметь отдельный процесс, запускающий ваши тесты и сохраняющий ваши результаты в файл. Затем bencher run
просто их выберет.
Запустите: bencher mock > results.json && bencher run --file results.json
Наконец, давайте забьем много данных с использованием аргумента --iter
в bencher run
.
Запустите: bencher run --iter 16 "bencher mock"
🐰 Совет: Ознакомьтесь с документацией CLI подкоманды
bencher run
для полного обзора того, что может сделатьbencher run
!
Создайте оповещение
Теперь, когда у нас есть исторические данные для наших тестов, давайте создадим оповещение! Оповещения генерируются, когда результат теста определяется как регрессия производительности. Так что давайте моделируем регрессию производительности!
Запустите: bencher run "bencher mock --pow 8"
В конце вывода должен появиться новый раздел под названием View alerts
:
View alerts:
- bencher::mock_0: https://bencher.dev/console/projects/save-walter-white-12345/alerts/b2329d5a-4471-48ab-bfbd-959d46ba1aa6
- bencher::mock_1: https://bencher.dev/console/projects/save-walter-white-12345/alerts/181b1cf5-d984-402a-b0f1-68f6f119fa66
- bencher::mock_2: https://bencher.dev/console/projects/save-walter-white-12345/alerts/b9b6c904-c657-4908-97db-dbeca40f8782
- bencher::mock_3: https://bencher.dev/console/projects/save-walter-white-12345/alerts/5567ff32-2829-4b6a-969a-af33ce3828db
- bencher::mock_4: https://bencher.dev/console/projects/save-walter-white-12345/alerts/49f2768f-ccda-4933-8e1d-08948f57a74d
Теперь вы можете увидеть оповещения для каждого теста в браузере.
Нажмите или скопируйте и вставьте ссылки из View alerts
.
🐰 Совет: Ознакомьтесь с документацией по порогам и оповещениям для полного обзора того, как обнаруживаются регрессии производительности!
🐰 Поздравляем! Вы поймали свою первую регрессию производительности! 🎉