Docker Autoalojado


¿Qué es Bencher?

Bencher es un conjunto de herramientas de benchmarking continuo. ¿Alguna vez has tenido un impacto de regresión de rendimiento en tus usuarios? Bencher podría haber evitado que eso sucediera. Bencher te permite detectar y prevenir las regresiones de rendimiento antes de que lleguen a producción.

  • Ejecutar: Ejecute sus benchmarks localmente o en CI usando sus herramientas de benchmarking favoritas. La CLI bencher simplemente envuelve su arnés de benchmarks existente y almacena sus resultados.
  • Seguir: Sigue los resultados de tus benchmarks con el tiempo. Monitoriza, realiza consultas y representa gráficamente los resultados utilizando la consola web de Bencher basándose en la rama de origen, el banco de pruebas y la medida.
  • Capturar: Captura las regresiones de rendimiento en CI. Bencher utiliza analíticas de vanguardia y personalizables para detectar regresiones de rendimiento antes de que lleguen a producción.

Por las mismas razones que las pruebas unitarias se ejecutan en CI para prevenir regresiones funcionales, los benchmarks deberían ejecutarse en CI con Bencher para prevenir regresiones de rendimiento. ¡Los errores de rendimiento son errores!


Bencher es de código abierto y autoalojable. Si estás interesado en usar Bencher Cloud, consulta el tutorial rápido de inicio de Bencher Cloud. Este tutorial te permitirá configurar Bencher Self-Hosted con Docker.

🐰 Una vez que te sientas cómodo usando Bencher Self-Hosted, considera revisar los siguientes recursos:


Instala Docker

Para ejecutar los servidores de UI y API en este tutorial necesitarás tener docker instalado. Verifica si tienes docker instalado.

Ejecuta: docker --version

Deberías ver algo como:

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

Está bien si tu número de versión es diferente. Lo importante es que este comando funcione. Si no es así, sigue las instrucciones para instalar docker.


Instala bencher CLI

Linux, Mac, & Unix

Para Linux, Mac y otros sistemas similares a Unix, ejecuta lo siguiente en tu terminal:

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

Windows

Para los sistemas Windows, ejecuta lo siguiente en una terminal PowerShell:

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

🐰 Si obtienes un error que dice running scripts is disabled on this system:

  • Abre Powershell con Ejecutar como Administrador
  • Ejecuta: Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
  • Introduce: Y
  • Vuelve a ejecutar este script

Para opciones de instalación adicionales, consulta cómo instalar bencher CLI.

Ahora, probemos que tenemos instalado el bencher CLI.

Ejecuta: bencher --version

Deberías ver:

$ bencher --version
bencher 0.3.26

Ejecuta los servidores de Bencher UI & API

Con docker instalado, ahora podemos ejecutar los servidores de UI y API.

Ejecuta: bencher up

Deberías ver algo así:

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

De nuevo, está bien si tu salida es diferente. Solo es importante que este comando funcione.

🐰 Si recibes un error de ghcr.io que dice: "se requiere autenticación" Intenta ejecutar: docker logout ghcr.io

🐰 En Windows, si recibes un error que dice: el sistema operativo de la imagen "linux" no puede ser utilizado en esta plataforma: el sistema operativo no es compatible Intenta ejecutar: & 'C:\Program Files\Docker\Docker\DockerCli.exe' -SwitchLinuxEngine

Registros del servidor API de Bencher

Como aún no hemos configurado el correo electrónico/SMTP en el servidor de la API, los códigos de confirmación que recibirás más tarde en el tutorial van a estar en los registros del servidor, como se muestra arriba. Es decir, las credenciales de autenticación se mostrarán en la salida de bencher up.


Configurar Bencher Host

El host predeterminado del CLI bencher es Bencher Cloud (es decir https://api.bencher.dev). Por lo tanto, necesitamos establecer tu nombre de host. La forma más fácil de hacer esto es con la variable de entorno BENCHER_HOST.

Abre una nueva ventana de terminal.

En Linux, Mac y otros sistemas tipo Unix, ejecuta: export BENCHER_HOST=http://localhost:61016

En Windows ejecuta: $env:BENCHER_HOST = "http://localhost:61016"

Si luego ejecutas echo $BENCHER_HOST o Write-Output $env:BENCHER_HOST respectivamente.

Deberías ver:

$ echo $BENCHER_HOST
http://localhost:61016

Crea una cuenta de Bencher Auto-alojada

Regístrate para Bencher Auto-alojada


Crea una cuenta en tu instancia local de Bencher Auto-alojada navegando a: http://localhost:3000/auth/signup

Una vez que hayas creado una cuenta, regresa a la ventana del terminal donde ejecutaste bencher up. Deberías 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)

Navega al enlace Confirmar Email en tu navegador o copia el Token de Confirmación en el campo Confirmar Token en: http://localhost:3000/auth/confirm

Después de eso, ¡deberías haber ingresado a tu cuenta de Bencher Auto-alojada!


Crear un token de API

Para utilizar la API de Bencher, necesitarás crear un token de API. Navega a la Consola de Bencher. Sitúa el cursor sobre tu nombre en la esquina superior derecha. Debería aparecer un menú desplegable. Selecciona Tokens. Una vez en la página de tokens de API, haz clic en el botón ➕ Add.

Añade un token de API


Una vez que hayas creado tu nuevo token de API, tendrás que copiarlo al portapapeles. En la terminal en la que planeas trabajar, exporta el token de API como una variable de entorno.

En Linux, Mac y otros sistemas similares a Unix, ejecuta: export BENCHER_API_TOKEN=TU_TOKEN

En Windows ejecuta: $env:BENCHER_API_TOKEN = "TU_TOKEN"

Si luego ejecutas echo $BENCHER_API_TOKEN o Write-Output $env:BENCHER_API_TOKEN respectivamente.

Deberías ver:

$ echo $BENCHER_API_TOKEN
TU_TOKEN

🐰 Nota: Si te mueves a una terminal diferente, tendrás que exportar el token de API nuevamente.


Crea un Proyecto

Ahora que tenemos una cuenta de usuario y un token de API, podemos crear un Proyecto. Primero, necesitamos saber a qué organización pertenecerá nuestro nuevo proyecto.

Ejecuta: bencher org list

Deberías ver algo como:

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

Tu salida debería ser ligeramente diferente a la anterior:

  • El uuid es pseudorandom.
  • El name y slug estarán basados en tu nombre de usuario.
  • Las marcas de tiempo created y modified serán de cuando te acabas de registrar.

Ahora podemos crear un nuevo Proyecto dentro de tu Organización. Sustituye el slug de tu Organización por el argumento organization (es decir, YOUR_ORG_SLUG) en el comando de abajo.

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

Deberías 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"
}

De nuevo, tu resultado debe ser ligeramente diferente al anterior. Lo importante es que este comando funcione. Toma nota del campo slug del Proyecto (es decir, save-walter-white-1234abcd).


Ejecuta un Informe

¡Finalmente estamos listos para recoger algunas métricas de benchmark! Por simplicidad, vamos a usar datos simulados en este tutorial.

Ejecuta: bencher mock

Deberías 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
}
}
}

Tu salida debe ser ligeramente diferente a la anterior, ya que los datos son pseudorandom. Lo importante es que este comando funcione.


Ahora ejecutemos un informe utilizando datos simulados de métricas benchmark. Sustituye el slug de tu Proyecto por el argumento --project (es decir, YOUR_PROJECT_SLUG) en el comando de abajo.

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

Deberías 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

Ahora puedes ver los resultados de cada una de las pruebas benchmark en el navegador. Haz clic o copia y pega los enlaces desde View results. Solo debería haber un único punto de datos para cada benchmark, ¡así que añadamos más datos!


Primero, establezcamos nuestro slug de Proyecto como una variable de entorno, para que no tengamos que proporcionarlo con el --project en cada ejecución.

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

Si luego ejecutas: echo $BENCHER_PROJECT

Deberías ver:

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

Vamos a ejecutar el mismo comando de nuevo sin --project para generar más datos.

Ejecuta: bencher run "bencher mock"


Ahora, vamos a generar más datos, pero esta vez canalizaremos nuestros resultados en bencher run.

Ejecuta: bencher mock | bencher run


A veces es posible que desees guardar tus resultados en un archivo y que bencher run los recoja.

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


De igual manera, puedes tener un proceso separado que ejecute tus benchmarks y guarde tus resultados en un archivo. Entonces bencher run simplemente los recogerá.

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


Finalmente, generemos muchos datos usando el argumento --iter de bencher run.

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


🐰 Consejo: Consulta los documentos CLI Subcommand de bencher run para obtener una descripción completa de todo lo que bencher run puede hacer!


Generar una Alerta

Ahora que tenemos algunos datos históricos para nuestras pruebas benchmark, ¡generemos una Alerta! Las alertas se generan cuando se determina que el resultado de una prueba benchmark es una regresión de rendimiento. ¡Así que simulemos una regresión de rendimiento!

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


Debería haber una nueva sección al final de la salida llamada 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

Ahora puedes ver las Alertas para cada prueba benchmark en el navegador. Haz clic o copia y pega los enlaces desde View alerts.


🐰 Consejo: Consulta los documentos de Threshold & Alerts para obtener una descripción completa de cómo se detectan las regresiones de rendimiento!



🐰 ¡Felicidades! ¡Atrapaste tu primer regresión de rendimiento! 🎉


Continúa: Descripción General de Benchmarking ➡

🤖 Este documento fue generado automáticamente por OpenAI GPT-4. Puede que no sea exacto y contenga errores. Si encuentra algún error, abra un problema en GitHub.


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