Быстрый Старт


Что такое 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.


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



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


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

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