Auto-hébergement Docker


Qu’est-ce que Bencher?

Bencher est une suite d’outils de benchmarking continu. Avez-vous déjà eu une régression de performance qui a impacté vos utilisateurs ? Bencher aurait pu empêcher cela de se produire. Bencher vous permet de détecter et de prévenir les régressions de performance avant qu’elles n’arrivent en production.

  • Exécuter: Exécutez vos benchmarks localement ou en CI en utilisant vos outils de benchmarking préférés. La CLI bencher enveloppe simplement votre harnais de benchmarking existant et stocke ses résultats.
  • Suivre: Suivez les résultats de vos benchmarks au fil du temps. Surveillez, interrogez et graphiquez les résultats à l’aide de la console web Bencher en fonction de la branche source, du banc d’essai et de la mesure.
  • Détecter: Détectez les régressions de performances en CI. Bencher utilise des analyses de pointe et personnalisables pour détecter les régressions de performances avant qu’elles n’arrivent en production.

Pour les mêmes raisons que les tests unitaires sont exécutés en CI pour prévenir les régressions de fonctionnalités, les benchmarks devraient être exécutés en CI avec Bencher pour prévenir les régressions de performance. Les bugs de performance sont des bugs !


Bencher est open source et peut être hébergé par soi-même. Si vous êtes intéressé par l’utilisation de Bencher Cloud, consultez le tutoriel de démarrage rapide de Bencher Cloud. Ce tutoriel vous aidera à vous installer en utilisant Bencher auto-hébergé avec Docker.

🐰 Une fois que vous vous sentez à l’aise avec Bencher Self-Hosted, envisagez de consulter les ressources suivantes :


Installer Docker

Pour exécuter les serveurs d’interface utilisateur et d’API dans ce tutoriel, vous devrez avoir docker installé. Vérifiez si vous avez docker installé.

Exécutez: docker --version

Vous devriez voir quelque chose comme :

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

Il est acceptable que votre numéro de version soit différent. Il est juste important que cette commande fonctionne. Si ce n’est pas le cas, suivez les instructions pour installer docker.


Installer le CLI bencher

Linux, Mac, & Unix

Pour Linux, Mac, et autres systèmes de type Unix, exécutez ce qui suit dans votre terminal :

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

Windows

Pour les systèmes Windows, exécutez ce qui suit dans un terminal PowerShell :

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

🐰 Si vous recevez une erreur qui dit running scripts is disabled on this system:

  • Ouvrez Powershell en utilisant Exécuter en tant qu'administrateur
  • Exécutez: Set-ExecutionPolicy -ExecutionPolicy RemoteSigned
  • Tapez: Y
  • Réexécutez ce script

Pour des options d’installation supplémentaires, consultez comment installer le CLI bencher.

Maintenant, testons si nous avons installé le CLI bencher.

Exécutez : bencher --version

Vous devriez voir :

$ bencher --version
bencher 0.3.26

Exécution de Bencher UI & API Servers

Avec docker installé, nous pouvons maintenant exécuter les serveurs UI et API.

Exécutez : bencher up

Vous devriez voir quelque chose comme :

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

Encore une fois, ce n’est pas grave si votre sortie est différente. L’important est que cette commande fonctionne.

🐰 Si vous recevez une erreur de ghcr.io disant : "authentication required" Essayez d’exécuter : docker logout ghcr.io

🐰 Sur Windows, si vous recevez une erreur disant : image operating system "linux" cannot be used on this platform: operating system is not supported Essayez exécuter : & 'C:\Program Files\Docker\Docker\DockerCli.exe' -SwitchLinuxEngine

Logs du serveur API Bencher

Parce que nous n’avons pas encore configuré l’email/SMTP sur le serveur API, les codes de confirmation que vous recevrez plus tard dans le tutoriel vont être dans les journaux du serveur, comme indiqué ci-dessus. C’est-à-dire, les informations d’authentification vont être montrées dans la sortie de bencher up.


Définir l’Hôte Bencher

L’hôte par défaut de l’interface en ligne de commande bencher est Bencher Cloud (c’est-à-dire https://api.bencher.dev). Nous avons donc besoin de définir votre nom d’hôte. La manière la plus simple de le faire est avec la variable d’environnement BENCHER_HOST.

Ouvrez une nouvelle fenêtre de terminal.

Sur Linux, Mac, et les autres systèmes de type Unix, exécutez : export BENCHER_HOST=http://localhost:61016

Sur Windows, exécutez : $env:BENCHER_HOST = "http://localhost:61016"

Si ensuite vous exécutez echo $BENCHER_HOST ou Write-Output $env:BENCHER_HOST respectivement.

Vous devriez voir :

$ echo $BENCHER_HOST
http://localhost:61016

Créez un compte Bencher Auto-Hébergé

Inscrivez-vous pour Bencher Auto-Hébergé


Créez un compte sur votre instance locale de Bencher Auto-Hébergé en naviguant sur : http://localhost:3000/auth/signup

Une fois que vous avez créé un compte, revenez à la fenêtre du terminal où vous avez exécuté bencher up. Vous devriez voir quelque chose comme :

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)

Naviguez vers le lien Confirmer Email dans votre navigateur ou copiez le Token de Confirmation dans le champ Confirmez Token sur : http://localhost:3000/auth/confirm

Après cela, vous devriez être connecté à votre compte Bencher Auto-Hébergé !


Créer un jeton API

Pour utiliser l’API Bencher, vous devrez créer un jeton API. Allez à la console Bencher. Passez votre souris sur votre nom dans le coin supérieur droit. Un menu déroulant devrait apparaître. Sélectionnez Tokens. Une fois sur la page des jetons API, cliquez sur le bouton ➕ Ajouter.

Ajouter un jeton API


Une fois que vous avez créé votre nouveau jeton API, vous devrez le copier dans votre presse-papiers. Dans le terminal dans lequel vous prévoyez de travailler, exportez le jeton API comme une variable d’environnement.

Sur Linux, Mac et autres systèmes de type Unix, lancez : export BENCHER_API_TOKEN=YOUR_TOKEN

Sur Windows, lancez : $env:BENCHER_API_TOKEN = "YOUR_TOKEN"

Si vous exécutez ensuite echo $BENCHER_API_TOKEN ou Write-Output $env:BENCHER_API_TOKEN respectivement.

Vous devriez voir :

$ echo $BENCHER_API_TOKEN
YOUR_TOKEN

🐰 Note : Si vous passez à un autre terminal, vous devrez exporter à nouveau le jeton API.


Créez un Projet

Maintenant que nous avons un compte d’utilisateur et un jeton API, nous pouvons créer un Projet. D’abord, nous devons savoir à quelle organisation notre nouveau projet appartiendra.

Exécutez: bencher org ls

Vous devriez voir quelque chose comme:

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

Votre sortie devrait être légèrement différente de celle-ci:

  • Le uuid est pseudorandom
  • Le name et slug seront basés sur votre nom d’utilisateur
  • Les horodatages created et modified seront ceux de votre inscription récente

Nous pouvons maintenant créer un nouveau Projet à l’intérieur de votre Organisation. Substituez le slug de votre Organisation à l’argument --org (ie VOTRE_SLUG_ORG) dans la commande ci-dessous.

Exécuter: bencher project create --org VOTRE_SLUG_ORG --url http://www.savewalterwhite.com "Save Walter White"

Vous devriez voir quelque chose comme:

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

Encore une fois, votre sortie devrait être légèrement différente que celle-ci. Il est juste important que cette commande fonctionne. Prenez note du champ slug du Projet (ie save-walter-white-12345).


Exécutez un Rapport

Nous sommes enfin prêts à collecter quelques mesures de benchmark! Pour des raisons de simplicité, nous utiliserons des données fictives dans ce tutoriel.

Exécutez: bencher mock

Vous devriez voir quelque chose comme:

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

Votre sortie devrait être légèrement différente de celle-ci, car les données sont pseudorandom. Il est juste important que cette commande fonctionne.


Maintenant, exécutons un rapport en utilisant des données fictives de mesures de benchmark. Substituez votre slug de Projet à l’argument --project (ie VOTRE_SLUG_PROJET) dans la commande ci-dessous.

Exécutez: bencher run --project VOTRE_SLUG_PROJET "bencher mock"

Vous devriez voir quelque chose comme:

$ 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

Vous pouvez maintenant consulter les résultats de chacun des benchmarks dans le navigateur. Cliquez ou copiez et collez les liens de View results. Il ne devrait y avoir qu’un seul point de données pour chaque benchmark, alors ajoutons d’autres données!


D’abord, mettons notre slug de Projet en tant que variable d’environnement, de sorte que nous n’avons pas à le fournir avec le --project à chaque exécution.

Exécutez: export BENCHER_PROJECT=save-walter-white-12345

Si vous exécutez ensuite: echo $BENCHER_PROJECT

Vous devriez voir:

$ echo $BENCHER_PROJECT
save-walter-white-12345

Ré-exécutons la même commande encore sans --project pour générer plus de données.

Exécutez: bencher run "bencher mock"


Maintenant, générions plus de données, mais cette fois nous transmettrons nos résultats dans bencher run.

Exécutez: bencher mock | bencher run


Parfois, vous pouvez vouloir sauvegarder vos résultats dans un fichier et que bencher run les récupère.

Exécutez: bencher run "bencher mock > results.json" --file results.json


De même, vous pouvez avoir un processus séparé qui exécute vos benchmarks et sauvegardez vos résultats dans un fichier. Ensuite bencher run viendra simplement les récupérer.

Exécutez: bencher mock > results.json && bencher run --file results.json


Enfin, mettons en place beaucoup de données en utilisant l’argument --iter de bencher run.

Exécutez: bencher run --iter 16 "bencher mock"


🐰 Astuce: Consultez les doc CLI sous-commande bencher run pour un aperçu complet de tout ce que bencher run peut faire!


Générer une Alerte

Maintenant que nous avons des données historiques pour nos benchmarks, générons une Alerte! Les alertes sont générées lorsqu’un résultat de benchmark est déterminé comme une régression de performance. Alors simulons une régression de performance!

Exécutez: bencher run "bencher mock --pow 8"


Il devrait y avoir une nouvelle section à la fin de la sortie appelée 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

Vous pouvez maintenant voir les Alertes pour chaque benchmark dans le navigateur. Cliquez ou copiez et collez les liens de View alerts.


🐰 Astuce: Consultez les doc Seuil & Alertes pour un aperçu complet de comment sont détectées les régressions de performances!



🐰 Félicitations! Vous avez attrapé votre première régression de performance! 🎉


Continuez: Aperçu du Benchmarking ➡

🤖 Ce document a été automatiquement généré par OpenAI GPT-4. Il peut ne pas être précis et peut contenir des erreurs. Si vous trouvez des erreurs, veuillez ouvrir une issue sur GitHub.