Ce tutoriel vous présente Google Stackdriver, qui vous permet d'effectuer les opérations suivantes avec vos applications Google Cloud Platform :
- Prendre un instantané de débogage dans vos applications s'exécutant sur App Engine, Compute Engine et Container Engine
- Afficher les journaux d'application
- Configurez des métriques, surveillez-les et recevez des alertes.
- Suivre vos appels d'API, et obtenir une analyse des temps de réponse et des goulots d'étranglement éventuels dans votre code
- Ajoutez des points de journalisation à une application en cours d'exécution sans avoir à la déployer. Il s'agit d'une fonctionnalité vraiment unique (et, espérons-le, utile).
Dans ce tutoriel, nous allons effectuer les opérations suivantes à partir de zéro :
- Créer un projet Google Cloud Platform (App Engine en particulier)
- Configurer le dépôt source du projet Google Cloud Platform
- Utilisez la source standard de l'application Python Guestbook disponible sur GitHub.
- Déployer le code
- Découvrez comment obtenir des instantanés de débogage de l'application en cours d'exécution.
- Examiner les journaux et les traces d'appels d'application
- Ajoutez des points de journalisation à l'application en cours d'exécution. Cette fonctionnalité a été présentée dans cet article de blog : Ajouter des journaux à une application sans redémarrage.
C'est parti !
Ce contenu a été initialement créé par Romin Irani et publié ici.
Configuration de l'environnement au rythme de chacun
Si vous ne possédez pas encore de compte Google (Gmail ou Google Apps), vous devez en créer un. Connectez-vous à la console Google Cloud Platform (console.cloud.google.com) et créez un projet :
Mémorisez l'ID du projet. Il s'agit d'un nom unique permettant de différencier chaque projet Google Cloud (le nom ci-dessus est déjà pris ; vous devez en trouver un autre). Il sera désigné par le nom PROJECT_ID
tout au long de cet atelier de programmation.
Vous devez ensuite activer la facturation dans la console Cloud pour pouvoir utiliser les ressources Google Cloud.
Suivre cet atelier de programmation ne devrait pas vous coûter plus d'un euro. Cependant, cela peut s'avérer plus coûteux si vous décidez d'utiliser davantage de ressources ou si vous n'interrompez pas les ressources (voir la section "Effectuer un nettoyage" à la fin du présent document).
Les nouveaux utilisateurs de Google Cloud Platform peuvent bénéficier d'un essai sans frais avec 300$de crédits.
Google Cloud Shell
Dans cet atelier de programmation, nous allons utiliser Google Cloud Shell, un environnement de ligne de commande exécuté dans le cloud.
Cette machine virtuelle basée sur Debian contient tous les outils de développement dont vous aurez besoin. Elle intègre un répertoire d'accueil persistant de 5 Go et s'exécute sur Google Cloud, ce qui améliore nettement les performances du réseau et l'authentification. Cela signifie que tout ce dont vous avez besoin pour cet atelier de programmation est un navigateur (oui, tout fonctionne sur un Chromebook).
Pour activer Google Cloud Shell, cliquez simplement sur le bouton en haut à droite de la console de développement (le provisionnement de l'environnement et la connexion ne devraient prendre que quelques minutes) :
Acceptez ensuite les conditions d'utilisation, puis cliquez sur le lien "Démarrer Cloud Shell" :
Une fois connecté à Cloud Shell, vous êtes normalement déjà authentifié et le projet PROJECT_ID
est sélectionné :
gcloud auth list
Résultat de la commande
Credentialed accounts: - <myaccount>@<mydomain>.com (active)
gcloud config list project
Résultat de la commande
[core] project = <PROJECT_ID>
Si, pour une raison quelconque, le projet n'est pas défini, exécutez simplement la commande suivante :
gcloud config set project <PROJECT_ID>
Vous recherchez votre PROJECT_ID
? Vérifiez l'ID que vous avez utilisé pendant les étapes de configuration ou recherchez-le dans le tableau de bord de la console :
IMPORTANT : Pour finir, définissez la configuration du projet et de la zone par défaut :
gcloud config set compute/zone us-central1-f
Vous pouvez choisir parmi différentes zones. Pour en savoir plus, consultez la documentation sur les régions et les zones.
Consulter les API Stackdriver activées
Examinons les API qui ont été activées pour votre projet. Utilisez la barre de recherche pour trouver le tableau de bord des API, comme indiqué ci-dessous.
Observez les API spécifiques qui ont été activées pour votre projet :
Chaque projet Google Cloud Platform propose un hébergement Git privé, mais nous devons d'abord créer un dépôt par défaut pour pouvoir travailler. Accédez à Source Repositories à l'aide du champ de recherche de la console :
Cliquez sur "CREATE REPOSITORY" (CRÉER UN DÉPÔT) pour créer un dépôt de code nommé "default" :
À l'aide de Cloud Shell, nous allons cloner ce répertoire dans notre instance Google Cloud Shell. Pour ce faire, commençons par créer un répertoire dans notre instance Google Cloud Shell et accédons-y, comme indiqué ci-dessous (exemple de résultat) :
mkdir stackdriver-demo
cd stackdriver-demo/
Nous pouvons maintenant cloner le dépôt par défaut à l'aide de la commande gcloud, comme indiqué ci-dessous :
gcloud source repos clone default
La console doit afficher le résultat suivant :
Cloning into '/home/gcp123_student/default'...
warning: You appear to have cloned an empty repository.
Project [qwiklabs-gcp-1234abc1234] repository [default] was cloned to [/home/gcp123_student/default].
Parfait ! Prenons un moment pour examiner plus en détail les dépôts Git distants qui ont été configurés. Il ne s'agit pas d'une obligation, mais d'une information qui vous aidera à mieux comprendre ce qui s'est passé en coulisses.
Accédez au répertoire par défaut créé et exécutez la commande git remote -v
comme indiqué ci-dessous.
cd default
git remote -v
La console doit afficher un résultat semblable à celui-ci :
origin https://source.developers.google.com/p/qwiklabs-gcp-1234abc1234/r/default (fetch)
origin https://source.developers.google.com/p/qwiklabs-gcp-1234abc1234/r/default (push)
Vous pouvez constater que cela pointe correctement vers le dépôt Git associé à notre projet GCP.
Extraire l'application Guestbook depuis GitHub
L'application que nous allons utiliser est une application App Engine standard nommée Guestbook. Elle est disponible dans le dépôt GitHub officiel de Google Cloud Platform. Cette application fait également partie de la documentation officielle pour vous aider à vous lancer. Le projet GitHub est disponible à l'adresse suivante : https://github.com/GoogleCloudPlatform/appengine-guestbook-python.
Nous allons maintenant extraire ce code dans notre instance Cloud Shell. La commande et son résultat sont indiqués ci-dessous :
git pull https://github.com/GoogleCloudPlatform/appengine-guestbook-python
La console doit afficher le résultat suivant :
remote: Counting objects: 485, done. remote: Total 485 (delta 0), reused 0 (delta 0), pack-reused 485 Receiving objects: 100% (485/485), 436.42 KiB | 163.00 KiB/s, done. Resolving deltas: 100% (195/195), done. From https://github.com/GoogleCloudPlatform/appengine-guestbook-python * branch HEAD -> FETCH_HEAD
Tout le code est désormais présent localement dans notre instance Google Cloud Shell. Vous pouvez voir les différents fichiers extraits du projet GitHub.
Transférer le code actuel à l'aide de Cloud Shell vers le dépôt Git du projet
Nous allons maintenant transférer ce code dans le dépôt Git du projet GCP afin de pouvoir définir des points d'arrêt, des points de trace et plus encore pour notre code. Notez que cette étape n'est pas obligatoire, car vous pouvez intégrer directement GitHub, votre machine locale et d'autres méthodes pour associer votre code source.
Toutefois, pour notre objectif ici, nous allons transférer ce code dans le dépôt Git du projet GCP. Pour ce faire, utilisez la commande git push standard, comme indiqué ci-dessous :
git push origin master
La console doit afficher le résultat suivant :
Counting objects: 485, done. Compressing objects: 100% (280/280), done. Writing objects: 100% (485/485), 436.42 KiB | 0 bytes/s, done. Total 485 (delta 195), reused 485 (delta 195) remote: Storing objects: 100% (485/485), done. remote: Processing commits: 100% (152/152), done. To https://source.developers.google.com/p/qwiklabs-gcp-1234abc1234/r/default * [new branch] master -> master
Revenez maintenant à la console GCP Cloud, plus précisément à la section "Développement". Cliquez sur "Code source". Vous devriez pouvoir voir tous les fichiers du projet pour le dépôt par défaut. Voici un exemple de résultat :
Nous sommes maintenant prêts à déployer notre application Livre d'or App Engine. Pour déployer l'application, assurez-vous d'être dans Google Cloud Shell et dans le répertoire par défaut, comme nous l'avons fait jusqu'à présent. Utilisez la commande gcloud app deploy
comme indiqué ci-dessous :
gcloud app deploy --version 1
Lorsque vous êtes invité à choisir une région, sélectionnez [1] us-east1.
La console doit afficher le résultat suivant :
You are about to deploy the following services: — qwiklabs-gcp-1234abc1234/default/1 (from [/home/gcp123-student/default/app.yaml]) Deployed URL: [https://qwiklabs-gcp-1234abc1234.appspot.com] Do you want to continue (Y/n)? Y Beginning deployment of service [default]... File upload done. Updating service [default]...done. Deployed service [default] to https://qwiklabs-gcp-1234abc1234.appspot.com]
Notez que nous avons fourni un paramètre de version à la commande de déploiement de l'application. Nous lui avons attribué la valeur "1"
.
Étant donné que l'application Guestbook utilise Google Cloud Datastore pour la persistance, nous devons mettre à jour les index Datastore. Les index sont spécifiés dans le fichier index.yaml
. Nous utilisons simplement la commande gcloud datastore create-indexes
comme indiqué ci-dessous :
gcloud datastore create-indexes index.yaml
La console doit afficher le résultat suivant :
You are about to update the following configurations: — qwiklabs-gcp-1234abc1234/index From: [/home/gcp123_student/default/index.yaml] Do you want to continue (Y/n)? Y
La mise à jour des index Datastore peut prendre un certain temps. Pour vérifier l'état, recherchez "Index Datastore", puis cliquez sur "Index". Pendant la création des index, l'état "Indexation" s'affiche, comme indiqué ci-dessous :
Pour vérifier si notre application avec la version 1 est déployée et disponible, accédez à Compute → App Engine, puis cliquez sur "Versions", comme indiqué ci-dessous :
Tout devrait maintenant être en ordre. Vous pouvez consulter votre projet en accédant à https://<PROJECT_ID>.appspot.com
. Là encore, quelques minutes peuvent être nécessaires pour que les index du datastore soient prêts. Si l'application affiche une erreur (par exemple, "Erreur interne du serveur"), réessayez quelques minutes plus tard.
Connectons-nous à l'application et créons quelques entrées dans le livre d'or, comme indiqué ci-dessous :
Parfait ! Nous sommes maintenant prêts à explorer les fonctionnalités de Stackdriver.
Commençons par voir comment prendre des instantanés de notre application en cours d'exécution. Les instantanés sont utiles si vous souhaitez déboguer un élément de code spécifique, inspecter les variables, etc. Tout cela se produit pendant que votre application est toujours diffusée. Cela peut être très utile si vous recevez des rapports faisant état d'un problème avec votre application et que vous souhaitez essayer de déboguer et de voir ce qui se passe avec votre application, inspecter un ensemble de variables, prendre l'instantané de manière conditionnelle, etc.
Faisons-le maintenant pour l'application Livre d'or. Nous allons demander un instantané si quelqu'un demande la page d'accueil, et plus précisément là où il récupère la liste des salutations qui se trouvent actuellement dans Datastore.
Le code correspondant se trouve dans le fichier guestbook.py
. Plus précisément, nous souhaitons commencer à inspecter le code au moment de l'exécution, une fois qu'il a récupéré la liste des salutations à partir du datastore. Cette opération est effectuée sur la ligne 72. Nous pouvons simplement placer un point d'arrêt sur la ligne 74 pour savoir si la ligne 72 a été exécutée.
Pour ce faire, cliquez sur "Debug" (Déboguer) dans la vue de la version App Engine ou accédez à Stackdriver → Debug (Déboguer). L'écran ci-dessous s'affiche. Pour ce faire, sélectionnez le fichier (guestbook.py
) à gauche, puis cliquez sur le numéro de ligne comme indiqué.
Un message s'affiche (il est mis en évidence dans l'encadré rouge ci-dessus) pour indiquer que le système attend le déclenchement d'un instantané. Il ne nous reste plus qu'à accéder à notre page à l'adresse
https://<PROJECT_ID>.appspot.com
.
Une fois cette opération effectuée, l'instantané est activé et les sections "Variables" et "Pile d'appel" sont renseignées, comme illustré ci-dessous. Examinez la façon dont les variables sont affichées et développez-les pour vérifier les valeurs. C'est très utile.
Par exemple, si vous développez la variable "salutations", vous verrez qu'elle contient les enregistrements correspondant au nombre d'entrées de livre d'or que vous avez créées.
Une fonctionnalité très pratique vous permet de reprendre un instantané à tout moment. Il vous suffit de cliquer sur l'icône de l'appareil photo à tout moment pour que l'application attende à nouveau que l'instantané soit atteint, comme indiqué ci-dessous :
Vous pouvez utiliser le champ "Expressions" comme indiqué ci-dessous pour suivre des variables spécifiques. Par exemple, nous savons que nous avons une variable "greetings" et nous souhaitons inspecter sa valeur au moment où un instantané est atteint. Nous pouvons insérer la variable de salutation, comme indiqué dans la capture d'écran ci-dessous. Lorsque l'instantané est déclenché, il est rempli avec les valeurs indiquées.
Si vous souhaitez que le snapshot ne s'active que sous certaines conditions, vous pouvez utiliser le champ "Condition", comme indiqué ci-dessous. Ici, nous indiquons que le snapshot ne doit avoir lieu que si le nombre de salutations est supérieur à 1. Vous pouvez essayer si vous le souhaitez.
Il est très important de vérifier que les performances de votre application Web répondent aux exigences que vous avez définies. Stackdriver Trace est un outil essentiel qui vous aide à comprendre la latence dans vos applications.
Il est activé par défaut pour toutes les applications App Engine et nous fournit des informations très utiles sur les performances de tous nos points de terminaison, ainsi qu'une répartition des différents appels.
Dans notre cas, nous avons accédé à la page d'accueil ("/") et consulté / ajouté les entrées du livre d'or. Cela suffit pour que Trace nous en dise plus sur la latence. Il vous suffit d'accéder à la page "Présentation de Stackdriver Traces" pour voir une capture d'écran comme celle ci-dessous. Remarquez les traces récentes et leurs latences.
Si nous cliquons sur l'une des traces, c'est-à-dire sur le lien URI, les détails de la trace s'affichent comme indiqué ci-dessous :
Notez comment il est capable de nous donner une répartition de la latence et des appels qui prennent le plus de temps. La visualisation ci-dessus montre que la requête Datastore prend du temps. Une option à envisager pourrait être la mise en cache des données pour réduire ce goulot d'étranglement. Là encore, tout dépend de votre application. Cela devrait vous être très utile pour déterminer les zones de votre trace d'appel qui pourraient nécessiter une refactorisation.
Vous pouvez consulter les journaux de votre application à tout moment en accédant à Stackdriver Logging (comme indiqué ci-dessous). De nombreux filtres sont disponibles, à commencer par différents services GCP → Types de journaux → Niveau de journal → Date, etc.
La capture d'écran ci-dessous montre les journaux de notre application App Engine et la version 1 par défaut.
Enfin, intéressons-nous à une fonctionnalité qui devrait vous enthousiasmer par les possibilités qu'elle offre. En tant que développeurs, nous faisons généralement de notre mieux pour insérer des instructions de journalisation dans notre code, le déployer, puis espérer que le journal nous fournira toutes les informations dont nous avons besoin.
Mais nous savons que cela ne suffit pas. Ce n'est qu'au moment du débogage que nous réalisons que nous aurions peut-être dû ajouter quelques instructions de journalisation ici et là. Le workflow habituel consiste ensuite à modifier votre code, à insérer l'instruction de journalisation supplémentaire, à redéployer et à surveiller.
C'est bien, mais que se passerait-il si vous pouviez ajouter ces instructions de journalisation (appelons-les désormais points de journalisation) à votre application en cours d'exécution ? Cela signifie que nous n'avons pas besoin d'arrêter l'application, de modifier le code et de le redéployer. Au lieu de cela, nous pouvons gérer notre liste de points de journalisation en dehors de notre application à l'aide de la prise en charge des points de journalisation.
Toujours dans Cloud Shell, vérifions la liste actuelle des points de journalisation que nous avons configurés (qui devrait évidemment être vide). Pour ce faire, utilisez la commande gcloud
comme indiqué ci-dessous :
gcloud debug logpoints list
La console doit afficher le résultat suivant :
Debug target not specified. Using default target: default-1 Listed 0 items.
Nous allons maintenant ajouter un point de journalisation à l'application en cours d'exécution. Pour ajouter un point de journalisation, nous devons procéder comme suit :
- Identifiez le fichier de code source et le numéro de ligne où vous souhaitez ajouter le point de journalisation.
- Identifier le message de journal, qui peut être codé en dur ou correspondre à une expression
Dans notre cas, nous allons ajouter un point de journalisation au fichier guestbook.py à la ligne 74 à l'aide de la commande logpoints create, comme indiqué ci-dessous :
gcloud debug logpoints create guestbook.py:74 "Fetched greetings from Datastore. Count of greetings : {len(greetings)}"
La console doit afficher le résultat suivant :
Debug target not specified. Using default target: default-1 — id: 53538243519d4-f9a0-bdbce location: guestbook.py:74 logLevel: INFO logMessageFormat: Fetched greetings from Datastore. Count of greetings : {len(greetings)} condition: None status: ACTIVE
Nous avons fourni le filename:linenumber
et le message de journal ci-dessus. Notez que notre message de journal contient également une expression qui affichera le nombre de salutations que nous avons récupérées du datastore.
La commande renvoie un message indiquant que le point de journalisation a été ajouté. Voici une capture d'écran de notre Cloud Shell :
À présent, si vous exécutez la commande de liste des points de journalisation, vous obtenez le résultat suivant :
gcloud debug logpoints list
La console doit afficher le résultat suivant :
Debug target not specified. Using default target: default-1 STATUS LOCATION CONDITION LOG_LEVEL LOG_MESSAGE_FORMAT ID ACTIVE guestbook.py:74 INFO Fetched greetings from Datastore. Count of greetings : {len(greetings)} 53538243519d4-f9a0-bdbce
Pour voir une démonstration, nous pouvons de nouveau accéder à la page d'accueil à l'adresse https://<PROJECT_ID>.appspot.com
. Cela appellera le code et, par conséquent, notre point de journalisation. N'oubliez pas que cette opération sera enregistrée par défaut dans nos journaux d'application. Il suffit donc de consulter Stackdriver Logging une fois de plus, comme indiqué ci-dessous :
Cliquez sur la demande en question, et le tour est joué ! Dans les détails, vous verrez que notre point de journalisation est déclenché et que le message de journalisation s'affiche.
Nous espérons que ce tutoriel vous a plu. Il n'aborde que quelques-unes des fonctionnalités offertes par la plate-forme Stackdriver. Il y a encore beaucoup à découvrir. Consultez le blog de Romin Irani (l'auteur original de cet atelier de programmation) à l'adresse https://rominirani.com/ pour découvrir d'autres tutoriels sur Google Cloud Platform.
Vous pouvez également consulter l'atelier de programmation "Utiliser le monitoring et la journalisation de Stackdriver pour obtenir une meilleure visibilité de l'état de votre application".
Si vous avez des commentaires ou si vous souhaitez signaler des problèmes concernant cet atelier de programmation, veuillez utiliser le lien "Signaler un bug" en bas à gauche de cette page.