Docker Самостоятельное Развертывание


Что такое Bencher?

Bencher - это набор инструментов для непрерывного тестирования производительности. Когда-нибудь регрессия производительности влияла на ваших пользователей? Bencher мог бы предотвратить это. Bencher позволяет вам обнаруживать и предотвращать регрессии производительности до того, как они попадут в продакшн.

  • Запустить: Запустите свои тесты производительности локально или в CI, используя ваши любимые инструменты для этого. CLI bencher просто оборачивает ваш существующий аппарат тестирования и сохраняет его результаты.
  • Отслеживать: Отслеживайте результаты ваших тестов производительности со временем. Мониторите, запрашивайте и строите графики результатов с помощью веб-консоли Bencher на основе ветки исходного кода, испытательного стенда и меры.
  • Поймать: Отлавливайте регрессии производительности в CI. Bencher использует инструменты аналитики, работающие по последнему слову техники, чтобы обнаружить регрессии производительности, прежде чем они попадут в продакшн.

По тем же причинам, по которым модульные тесты запускаются в CI, чтобы предотвратить регрессии функций, тесты производительности должны быть запущены в CI с Bencher, чтобы предотвратить регрессии производительности. Ошибки производительности – это тоже ошибки!


Bencher - это открытое и самоустанавливаемое программное обеспечение. Если вы заинтересованы в использовании Bencher Cloud, ознакомьтесь с руководством по быстрому старту Bencher Cloud. Это руководство поможет вам настроить Bencher Self-Hosted с использованием Docker.

🐰 Как только вы будете чувствовать себя уверенно при использовании Bencher Self-Hosted, рекомендуем ознакомиться с следующими ресурсами:


Установка Docker

Для запуска серверов UI и API в этом руководстве вам потребуется установленный docker. Проверьте, установлен ли у вас docker.

Выполните: docker --version

Вы должны увидеть что-то вроде:

$ docker --version
Docker version 20.10.17, build 100c701

Вполне нормально, если номер вашей версии отличается. Главное, чтобы эта команда работала. Если нет, следуйте инструкциям по установке docker.


Установка CLI bencher

Linux, Mac и Unix

Для систем Linux, Mac и других систем, подобных Unix, выполните следующее в вашем терминале:

Terminal window
curl --proto '=https' --tlsv1.2 -sSfL https://bencher.dev/download/install-cli.sh | sh

Windows

Для систем Windows выполните следующее в терминале PowerShell:

Terminal window
irm https://bencher.dev/download/install-cli.ps1 | iex

🐰 Если вы получаете ошибку, которая говорит запуск скриптов отключен на этой системе:

  • Откройте Powershell с Запуск от имени администратора
  • Выполните: Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
  • Введите: Y
  • Запустите этот скрипт заново

Для дополнительных вариантов установки смотрите как установить CLI bencher.

Теперь давайте проверим, что у нас установлен CLI bencher.

Запустите: bencher --version

Вы должны увидеть:

$ bencher --version
bencher 0.3.26

Запуск серверов Bencher UI & API

С установленным docker, мы можем теперь запустить серверы UI и API.

Выполнить: bencher up

Вы должны увидеть что-то вроде:

$ bencher up
Pulling `ghcr.io/bencherdev/bencher-api:latest` image...
Creating `bencher_api` container...
Starting `bencher_api` container...
Pulling `ghcr.io/bencherdev/bencher-console:latest` image...
Creating `bencher_console` container...
Starting `bencher_console` container...
🐰 Bencher Self-Hosted is up and running!
Web Console: http://localhost:3000
API Server: http://localhost:61016
Press Ctrl+C to stop Bencher Self-Hosted.
🐰 Bencher Self-Hosted logs...
Jan 08 16:49:07.727 INFO 🐰 Bencher API Server v0.4.2
...

Еще раз, это нормально, если ваш вывод отличается. Главное, что эта команда работает.

🐰 Если вы получите ошибку от ghcr.io с сообщением: "authentication required" Попробуйте выполнить: docker logout ghcr.io

🐰 На Windows, если вы получите ошибку с сообщением: image operating system "linux" cannot be used on this platform: operating system is not supported Попробуйте выполнить: & 'C:\Program Files\Docker\Docker\DockerCli.exe' -SwitchLinuxEngine

Логи сервера Bencher API

Поскольку мы еще не настроили email/SMTP на сервере API, коды подтверждения, которые вы получите позже в уроке, будут в логах сервера, как показано выше. То есть, учетные данные для аутентификации будут показаны в выводе bencher up.


Установка хоста Bencher

Хост CLIbencher по умолчанию - это Bencher Cloud (т.е. https://api.bencher.dev). Поэтому нам нужно установить ваше имя хоста. Самый простой способ это сделать - с помощью переменной окружения BENCHER_HOST.

Откройте новое окно терминала.

На Linux, Mac и других подобных Unix системах выполните: export BENCHER_HOST=http://localhost:61016

На Windows выполните: $env:BENCHER_HOST = "http://localhost:61016"

Если вы затем выполните echo $BENCHER_HOST или Write-Output $env:BENCHER_HOST соответственно.

Вы должны увидеть:

$ echo $BENCHER_HOST
http://localhost:61016

Создание аккаунта Bencher Self-Hosted

Регистрация на Bencher Self-Hosted


Создайте аккаунт на вашем локальном экземпляре Bencher Self-Hosted, перейдя по следующей ссылке: http://localhost:3000/auth/signup

После создания аккаунта вернитесь в терминал, где вы запускали bencher up. Вы должны увидеть что-то похожее:

To: Saul Goodman <saul@bettercallsaul.com>>
Subject: Confirm Bencher Signup
Body:
Ahoy Saul Goodman,
Please, click the button below or use the provided code to signup for Bencher.
Confirm Email: http://localhost:3000/auth/confirm?plan=free&token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJhdWQiOiJhdXRoIiwiZXhwIjoxNzA0ODIwODIxLCJpYXQiOjE3MDQ4MTkwMjEsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3Q6MzAwMC8iLCJzdWIiOiJzYXVsQGJldHRlcmNhbGxzYXVsLmNvbSIsIm9yZyI6bnVsbH0.CKW4-MyOqY0AnRbs9h8tBtyAB6ck51PytytTsZSBOiA
Confirmation Token: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJhdWQiOiJhdXRoIiwiZXhwIjoxNzA0ODIwODIxLCJpYXQiOjE3MDQ4MTkwMjEsImlzcyI6Imh0dHA6Ly9sb2NhbGhvc3Q6MzAwMC8iLCJzdWIiOiJzYXVsQGJldHRlcmNhbGxzYXVsLmNvbSIsIm9yZyI6bnVsbH0.CKW4-MyOqY0AnRbs9h8tBtyAB6ck51PytytTsZSBOiA
See you soon,
The Bencher Team
Bencher - Continuous Benchmarking
Manage email settings (http://localhost:3000/help)

Перейдите по ссылке Подтвердить Email в вашем браузере или скопируйте Токен подтверждения в поле Подтвердить токен на следующей странице: http://localhost:3000/auth/confirm

После этого вы должны быть войти в свой аккаунт на Bencher Self-Hosted!


Создание токена API

Чтобы использовать API Bencher, вам нужно создать токен API. Перейдите в Bencher Console. Наведите указатель мыши на свое имя в правом верхнем углу. Появится выпадающее меню. Выберите Токены. На странице Токены API нажмите кнопку ➕ Добавить.

Добавить токен API


После создания вашего нового токена API, вам нужно скопировать его в буфер обмена. В терминале, в котором вы планируете работать, экспортируйте токен API как переменную окружения.

На Linux, Mac и других системах типа Unix выполните: export BENCHER_API_TOKEN=YOUR_TOKEN

На Windows выполните: $env:BENCHER_API_TOKEN = "YOUR_TOKEN"

Если вы затем выполните echo $BENCHER_API_TOKEN или Write-Output $env:BENCHER_API_TOKEN соответственно.

Вы должны увидеть:

$ echo $BENCHER_API_TOKEN
YOUR_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": [
[
{
"measure": { ... },
"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?measures=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?measures=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?measures=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?measures=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?measures=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.


🐰 Совет: Ознакомьтесь с документацией по порогам и оповещениям для полного обзора того, как обнаруживаются регрессии производительности!



🐰 Поздравляем! Вы поймали свою первую регрессию производительности! 🎉


Продолжить: Обзор нагрузочного тестирования ➡

🤖 Этот документ был автоматически создан OpenAI GPT-4. Оно может быть неточным и содержать ошибки. Если вы обнаружите какие-либо ошибки, откройте проблему на GitHub.