Docker Auto-Hospedado


O que é o Bencher?

Bencher é um conjunto de ferramentas de benchmarking contínuas. Já teve algum impacto de regressão de desempenho nos seus usuários? Bencher poderia ter prevenido isso. Bencher permite que você detecte e previna regressões de desempenho antes que cheguem à produção.

  • Execute: Execute seus benchmarks localmente ou no CI usando suas ferramentas de benchmarking favoritas. O CLI bencher simplesmente envolve seu harness de benchmark existente e armazena seus resultados.
  • Rastreie: Acompanhe os resultados de seus benchmarks ao longo do tempo. Monitore, consulte e faça gráficos dos resultados usando o console web do Bencher baseado na branch de origem, testbed e medida.
  • Capture: Capture regressões de desempenho no CI. Bencher usa análises personalizáveis e de última geração para detectar regressões de desempenho antes que elas cheguem à produção.

Pelos mesmos motivos que os testes de unidade são executados no CI para prevenir regressões de funcionalidades, benchmarks deveriam ser executados no CI com o Bencher para prevenir regressões de desempenho. Bugs de desempenho são bugs!


Bencher é de código aberto e auto-hospedável. Se você estiver interessado em usar o Bencher Cloud, confira o tutorial Bencher Cloud Quick Start. Este tutorial irá ajudá-lo a configurar o Bencher Self-Hosted com Docker.

🐰 Uma vez que você se sinta confortável usando o Bencher Self-Hosted, considere verificar os seguintes recursos:


Instale o Docker

Para executar os servidores de UI e API neste tutorial, você precisará ter o docker instalado. Verifique se você tem o docker instalado.

Execute: docker --version

Você deve ver algo como:

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

Tudo bem se o número da sua versão for diferente. O importante é que este comando funcione. Se não, siga as instruções para instalar o docker.


Instale o CLI bencher

Linux, Mac, & Unix

Para Linux, Mac e outros sistemas semelhantes a Unix, execute o seguinte no seu terminal:

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

Windows

Para sistemas Windows, execute o seguinte em um terminal PowerShell:

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

🐰 Se você recebe um erro que diz a execução de scripts está desativada neste sistema:

  • Abrir Powershell com Executar como Administrador
  • Execute: Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
  • Entre: Y
  • Rode o script novamente

Para opções adicionais de instalação, veja como instalar o CLI bencher.

Agora, vamos testar se temos o CLI bencher instalado.

Execute: bencher --version

Você deve ver:

$ bencher --version
bencher 0.3.26

Execute os Servidores Bencher UI & API

Com o docker instalado, agora podemos executar os servidores UI e API.

Execute: bencher up

Você deve ver algo como:

$ 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
...

Novamente, está tudo bem se a sua saída for diferente. É apenas importante que este comando funcione.

🐰 Se você receber um erro de ghcr.io dizendo: "authentication required" Tente executar: docker logout ghcr.io

🐰 No Windows, se você receber um erro dizendo: image operating system "linux" cannot be used on this platform: operating system is not supported Tente executar: & 'C:\Program Files\Docker\Docker\DockerCli.exe' -SwitchLinuxEngine

Logs do Servidor API Bencher

Como ainda não configuramos o email/SMTP no servidor API, os códigos de confirmação que você receberá mais tarde no tutorial estarão nos logs do servidor, como mostrado acima. Ou seja, as credenciais de autenticação serão mostradas na saída de bencher up.


Definir Host Bencher

O host padrão do CLI bencher é o Bencher Cloud (ou seja, https://api.bencher.dev). Então, precisamos definir seu nome de host. A maneira mais fácil de fazer isso é com a variável de ambiente BENCHER_HOST.

Abra uma nova janela do terminal.

No Linux, Mac e outros sistemas semelhantes ao Unix, execute: export BENCHER_HOST=http://localhost:61016

No Windows, execute: $env:BENCHER_HOST = "http://localhost:61016"

Se você então executar echo $BENCHER_HOST ou Write-Output $env:BENCHER_HOST, respectivamente.

Você deverá ver:

$ echo $BENCHER_HOST
http://localhost:61016

Crie uma Conta Autônoma Bencher

Cadastre-se para Bencher Autônomo


Crie uma conta na sua instância local autônoma do Bencher navegando para: http://localhost:3000/auth/signup

Uma vez que você tenha criado uma conta, volte para a janela do terminal onde você executou bencher up. Você deverá ver algo como:

To: Saul Goodman <saul@bettercallsaul.com>>
Subject: Confirm Bencher Signup
Body:
Ahoy Saul Goodman,
Please, click the button below or use the provided token to signup for Bencher.
Confirm Email: http://localhost:3000/auth/confirm?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)

Navegue até o link Confirmar Email em seu navegador ou copie o Token de Confirmação no campo Confirmar Token em: http://localhost:3000/auth/confirm

Depois disso, você deverá estar conectado à sua conta autônoma Bencher!


Crie um Token de API

Para usar a API do Bencher, você precisará criar um token de API. Navegue para o Console do Bencher. Passe o cursor sobre o seu nome no canto superior direito. Um menu suspenso deve aparecer. Selecione Tokens. Uma vez na página Tokens de API, clique no botão ➕ Add.

Adicionar um Token de API


Depois de criar o seu novo token de API, você precisará copiá-lo para sua área de transferência. No terminal que você planeja trabalhar, exporte o token de API como uma variável de ambiente.

Em sistemas Linux, Mac e outros sistemas semelhantes a Unix, execute: export BENCHER_API_TOKEN=SEU_TOKEN

No Windows, execute: $env:BENCHER_API_TOKEN = "SEU_TOKEN"

Depois execute echo $BENCHER_API_TOKEN ou Write-Output $env:BENCHER_API_TOKEN respectivamente.

Você deverá ver:

$ echo $BENCHER_API_TOKEN
SEU_TOKEN

🐰 Nota: Se você mudar para um terminal diferente, precisará exportar o token de API novamente.


Crie um Projeto

Agora que temos uma conta de usuário e um token da API, podemos criar um Projeto. Primeiro, precisamos saber a qual organização nosso novo projeto pertencerá.

Execute: bencher org list

You should see something like:

$ bencher org list
[
{
"name": "Saul Goodman",
"slug": "saul-goodman",
"uuid": "4581feb0-6cac-40a9-bd8a-d7865183b01e"
"created": "2022-07-06T11:24:36Z",
"modified": "2022-07-06T11:24:36Z"
}
]

Sua saída deve ser ligeiramente diferente da acima:

  • O uuid é pseudoaleatório
  • O name e slug serão baseados em seu nome de usuário
  • Os timestamps created e modified serão de quando você acabou de se inscrever

Agora podemos criar um novo Projeto dentro de sua Organização. Substitua seu slug da Organização pelo argumento organization (ou seja, YOUR_ORG_SLUG) no comando abaixo.

Execute: bencher project create YOUR_ORG_SLUG --name "Save Walter White" --url http://www.savewalterwhite.com

Você deve ver algo como:

$ bencher project create saul-goodman --name "Save Walter White" --url http://www.savewalterwhite.com
{
"organization": "4581feb0-6cac-40a9-bd8a-d7865183b01e",
"name": "Save Walter White",
"slug": "save-walter-white-1234abcd",
"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"
}

Novamente, sua saída deve ser ligeiramente diferente da acima. É apenas importante que esse comando funcione. Anote o campo slug do Projeto (ou seja, save-walter-white-1234abcd).


Execute um Relatório

Finalmente estamos prontos para coletar algumas métricas de benchmark! Para simplificar, vamos usar dados fictícios neste tutorial.

Execute: bencher mock

Você deverá ver algo como:

$ 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
}
}
}

Sua saída deve ser ligeiramente diferente da acima, pois os dados são pseudoaleatórios. É apenas importante que esse comando funcione.


Agora vamos executar um relatório usando dados fictícios de métricas de benchmark. Substitua seu slug do Projeto pelo argumento --project (ou seja, YOUR_PROJECT_SLUG) no comando abaixo.

Execute: bencher run --project YOUR_PROJECT_SLUG "bencher mock"

Você deverá ver algo como:

$ bencher run save-walter-white-1234abcd "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-1234abcd/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-1234abcd/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-1234abcd/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-1234abcd/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-1234abcd/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

Agora você pode ver os resultados de cada um dos benchmarks no navegador. Clique ou copie e cole os links de View results. Deve haver apenas um único ponto de dados para cada benchmark, então vamos adicionar mais dados!


Primeiro, vamos definir nosso slug do Projeto como uma variável de ambiente, para que não precisemos fornecê-lo com o --project em cada execução.

Execute: export BENCHER_PROJECT=save-walter-white-1234abcd

Se você executar: echo $BENCHER_PROJECT

Você deve ver:

$ echo $BENCHER_PROJECT
save-walter-white-1234abcd

Vamos executar o mesmo comando novamente sem --project para gerar mais dados.

Execute: bencher run "bencher mock"


Agora, vamos gerar mais dados, mas desta vez vamos canalizar nossos resultados para bencher run.

Execute: bencher mock | bencher run


Às vezes, você pode querer salvar seus resultados em um arquivo e ter o bencher run buscá-los.

Execute: bencher run --file results.json "bencher mock > results.json"


Da mesma forma, você pode ter um processo separado para executar seus benchmarks e salvar seus resultados em um arquivo. Então bencher run apenas os pegará.

Execute: bencher mock > results.json && bencher run --file results.json


Finalmente, vamos preencher muitos dados usando o argumento --iter de bencher run.

Execute: bencher run --iter 16 "bencher mock"


🐰 Dica: Confira a documentação do subcomando bencher run CLI para uma visão completa de tudo que bencher run pode fazer!


Gerar um Alerta

Agora que temos alguns dados históricos para nossos benchmarks, vamos gerar um Alerta! Os alertas são gerados quando o resultado de um benchmark é considerado uma regressão de desempenho. Então, vamos simular uma regressão de desempenho!

Execute: bencher run "bencher mock --pow 8"


Deve haver uma nova seção no final da saída chamada View alerts:

View alerts:
- bencher::mock_0: https://bencher.dev/console/projects/save-walter-white-1234abcd/alerts/b2329d5a-4471-48ab-bfbd-959d46ba1aa6
- bencher::mock_1: https://bencher.dev/console/projects/save-walter-white-1234abcd/alerts/181b1cf5-d984-402a-b0f1-68f6f119fa66
- bencher::mock_2: https://bencher.dev/console/projects/save-walter-white-1234abcd/alerts/b9b6c904-c657-4908-97db-dbeca40f8782
- bencher::mock_3: https://bencher.dev/console/projects/save-walter-white-1234abcd/alerts/5567ff32-2829-4b6a-969a-af33ce3828db
- bencher::mock_4: https://bencher.dev/console/projects/save-walter-white-1234abcd/alerts/49f2768f-ccda-4933-8e1d-08948f57a74d

Agora você pode ver os alertas para cada benchmark no navegador. Clique ou copie e cole os links de View alerts.


🐰 Dica: Confira a documentação sobre Limiares & Alertas para uma visão completa de como regressões de desempenho são detectadas!



🐰 Parabéns! Você capturou sua primeira regressão de desempenho! 🎉


Continue: Visão Geral do Benchmarking ➡

🤖 Este documento foi gerado automaticamente pelo OpenAI GPT-4. Pode não ser preciso e pode conter erros. Se você encontrar algum erro, abra um problema no GitHub.


Published: Fri, October 27, 2023 at 8:40:00 AM UTC | Last Updated: Wed, March 27, 2024 at 7:50:00 AM UTC