Utiliser Stackdriver Logging et Stackdriver Trace pour Cloud Functions

1. Introduction

Dans cet atelier de programmation, vous apprendrez à exploiter les outils de journalisation et de surveillance disponibles pour tous les développeurs qui travaillent avec Cloud Functions. Ces outils sont fournis avec chaque fonction Cloud que vous déployez dans tous les langages compatibles. Ils devraient vous permettre d'être plus productif lors de l'écriture et de l'exploitation de votre code sans serveur.

5815064fec87444b.png

Vous allez utiliser une fonction Cloud déclenchée par HTTP, mais tout ce que vous aborderez s'applique également à d'autres langages et à Cloud Functions déclenchés par d'autres événements.

2. Préparation

Configuration de l'environnement au rythme de chacun

  1. Connectez-vous à Cloud Console, puis créez un projet ou réutilisez un projet existant. (Si vous n'avez pas encore de compte Gmail ou G Suite, vous devez en créer un.)

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

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.

  1. Vous devez ensuite activer la facturation dans Cloud Console pour pouvoir utiliser les ressources Google Cloud.

L'exécution de cet atelier de programmation est très peu coûteuse, voire gratuite. Veillez à suivre les instructions de la section "Nettoyer" qui indique comment désactiver les ressources afin d'éviter les frais une fois ce tutoriel terminé. Les nouveaux utilisateurs de Google Cloud peuvent participer au programme d'essai sans frais pour bénéficier d'un crédit de 300 $.

Cloud Shell

Si Cloud Functions et ses fonctionnalités de journalisation et de surveillance peuvent être utilisés à distance depuis votre ordinateur portable, vous allez utiliser Cloud Shell, un environnement de ligne de commande exécuté dans Google 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).

  1. Pour activer Cloud Shell à partir de Cloud Console, cliquez simplement sur Activer Cloud Shell fEbHefbRynwXpq1vj2wJw6Dr17O0np8l-WOekxAZYlZQIORsWQE_xJl-cNhogjATLn-YxLVz8CgLvIW1Ncc0yXKJsfzJGMYgUeLsVB7zSwz7p6ItNgx4tXqQjag7BfWPcZN5kP-X3Q (l'opération de provisionnement et la connexion à l'environnement ne devraient prendre que quelques minutes).

I5aEsuNurCxHoDFjZRZrKBdarPPKPoKuExYpdagmdaOLKe7eig3DAKJitIKyuOpuwmrMAyZhp5AXpmD_k66cBuc1aUnWlJeSfo_aTKPY9aNMurhfegg1CYaE11jdpSTYNNIYARe01A

Capture d'écran du 2017-06-14 à 10.13.43 PM.png

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 Cloud Console :

R7chO4PKQfLC3bvFBNZJALLTUiCgyLEq_67ECX7ohs_0ZnSjC7GxDNxWrJJUaoM53LnqABYamrBJhCuXF-J9XBzuUgaz7VvaxNrkP2TAn93Drxccyj2-5zz4AxL-G3hzxZ4PsM5HHQ

Par défaut, Cloud Shell définit certaines variables d'environnement qui pourront s'avérer utiles pour exécuter certaines commandes dans le futur.

echo $GOOGLE_CLOUD_PROJECT

Résultat de la commande

<PROJECT_ID>
  1. 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 page Régions et zones.

3. Déployer une fonction Cloud simple

Pour avoir un élément à surveiller, créez une application "Hello, World" Cloud Functions. Dans le menu de gauche de la console Google Cloud, cliquez sur Cloud Functions, puis sur Créer une fonction.

3c13aa20af602aa7.png

Saisissez "hello-monitor" comme nom de votre nouvelle fonction Cloud.

fa6816c96d6d5b94.png

Conservez les valeurs par défaut du code source. (Vous pouvez toutefois choisir un autre langage/environnement d'exécution si vous le souhaitez.)

7aadf164450484e.png

Pour finir, cliquez sur Créer.

dc74cd21000d6c91.png

Votre fonction Cloud doit être listée avec une coche verte à côté, ce qui signifie qu'elle est prête à être appelée.

5363a34eb001d5ed.png

4. Tester la fonction Cloud et envoyer du trafic à l'aide d'un générateur de charge

Maintenant que la fonction Cloud a été déployée, testez-la à partir de la ligne de commande.

Tout d'abord, à l'aide de Cloud Shell, émettez la commande suivante:

$ gcloud functions describe hello-monitor

Cela devrait renvoyer une description de la fonction Cloud, y compris une URL pour httpsTrigger, qui est le point de terminaison HTTP(S) permettant d'appeler la fonction Cloud. Il doit se présenter comme suit: https://<region>-<project-id>.cloudfunctions.net/hello-monitor.

Pour déclencher la fonction Cloud, il suffit désormais d'utiliser la commande curl sur cette URL.

$ curl https://<region>-<project-id>.cloudfunctions.net/hello-monitor
Hello World!

Utilisez maintenant Vegeta, un simple outil de test de charge HTTP. Pour l'installer, saisissez simplement la commande suivante à partir de Cloud Shell :

$ go get -u github.com/tsenart/vegeta

Pour envoyer du trafic vers votre fonction Cloud (cinq requêtes par seconde pendant quelques minutes), utilisez la commande suivante:

$ echo "GET https://<region>-<project-id>.cloudfunctions.net/hello-monitor" \
   | vegeta attack -rate=5 -duration=120s \
   > results.bin

5. Parcourir les journaux

Dans la vue détaillée de la fonction Cloud, cliquez sur Afficher les journaux.

b24157fd3376e6a8.png

Vous devriez être redirigé vers la section Stackdriver Logging de votre projet, qui n'affiche que vos journaux Cloud Functions.

5a36fa75d2fb0165.png

Toutes les requêtes adressées à votre fonction Cloud doivent renvoyer un code d'état 200.

Lorsque vous affichez les journaux, vous pouvez effectuer les opérations suivantes:

  • Filtrez par niveau de journalisation (dans votre cas, tous les journaux sont au niveau debug).
  • Sélectionnez une période spécifique (relative ou absolue).
  • Activez la diffusion des journaux (avec Lecture 751a4600016f34a7.png en haut de l'écran).
  • Copiez un lien vers l'entrée de journal (pour le partager avec les membres de l'équipe).
  • Afficher une entrée de journal dans le contexte d'une ressource
  • Épinglez une entrée de journal (en tant que repère visuel).
  • Exportez les journaux vers BigQuery, Cloud Storage ou Pub/Sub (ou téléchargez-les simplement sous forme de fichiers JSON ou CSV).

6. Mettre à jour la fonction

Dans la console Cloud, accédez à la vue Informations sur la fonction et observez le pic que vous avez créé avec votre testeur de charge concernant le nombre d'appels par seconde et leur durée d'exécution.

aaee3159bbe395d3.png 7ed347101da5eca0.png

Stackdriver Trace est un autre outil plus détaillé permettant d'observer la latence et les appels RPC. Toutefois, avant de pouvoir l'utiliser, vous devez apporter quelques modifications à vos fonctions Cloud. Procédez comme suit :

  1. Ajoutez le package node-emoji qui sauve des vies en tant que dépendance.
  2. Mettez à jour le code de la fonction pour utiliser le module node-emoji et introduire une certaine latence.
  3. Ajoutez une variable d'environnement afin d'activer Stackdriver Trace pour Cloud Functions.

Dans Informations sur la fonction, cliquez sur Modifier pour modifier la fonction.

39b0f8f98b18a6c0.png

Modifiez le fichier package.json afin d'ajouter une dépendance pour le package node-emoji.

{
  "name": "sample-http",
  "version": "0.0.1",
  "dependencies": {
    "node-emoji": "^1.8.1"
  }
}

Modifiez la fonction en remplaçant le contenu de index.js par ce qui suit:

const emoji = require('node-emoji');

exports.helloWorld = (req, res) => {
  let message = req.query.message || req.body.message || 'Hello World!';

  // add some latency, functions are too quick!
  setTimeout(function() {
     message += emoji.random().emoji;  
     res.status(200).send(message);
  }, (3 * 100));  // 300ms
  
};

Cela ajoute un emoji aléatoire au message renvoyé par la fonction Cloud après une pause de 300 millisecondes.

Enfin, ajoutez une variable d'environnement de la fonction Cloud appelée GOOGLE_CLOUD_TRACE_ENABLED et définissez-la sur true comme suit:

9205bd277b76aa21.png

Cliquez sur Enregistrer.

Retournez dans Cloud Shell et rappelez la commande permettant de générer une charge sur la fonction Cloud que vous venez de déployer:

$ echo "GET https://<region>-<project-id>.cloudfunctions.net/hello-monitor" \
   | vegeta attack -rate=5 -duration=120s \
   > results.bin

Vous êtes maintenant prêt à observer la liste des traces produites sans aucune autre configuration ni bibliothèque de traçage spécifique dans votre code.

7. Tracer la fonction Cloud mise à jour

Dans le menu de gauche, accédez à Liste de traces (sous Stackdriver Trace).

576373f38cad6f8.png

La capture d'écran suivante doit s'afficher:

44a36b758b49f88f.png

Il est donc évident que la latence introduite dans votre fonction Cloud est en effet mesurée à 300 millisecondes.

Chaque point du graphique est une requête pour laquelle vous pouvez afficher des informations détaillées, telles que l'horodatage, la méthode et l'état HTTP, ses étiquettes, un lien vers l'entrée de journal correspondante et tout appel RPC ultérieur effectué par la fonction Cloud.

5815064fec87444b.png

Pour effectuer un zoom avant, il vous suffit de cliquer sur le graphique et de le faire glisser. Sélectionner une période personnalisée dans le graphique des traces

Pour faire un zoom arrière, cliquez sur Annuler le zoom en haut de la page.

Comme vous avez déployé une seule fonction Cloud, le graphique n'affiche que les requêtes GET sur l'URI hello-monitor, mais vous pouvez filtrer les traces par méthode HTTP (GET, POST, DELETE) par état HTTP (2XX, 3XX) ou à l'aide du filtre de requête.

Accédez à Vue d'ensemble dans le menu de gauche:

e920cfca2a50899e.png

Sur cette page de présentation, vous trouverez les traces récentes et d'autres insights.

ef5a45647967d275.png

Vous pouvez également créer des rapports personnalisés en fonction d'un filtre de requête URI, d'une méthode HTTP, d'un état HTTP et d'une période. Il vous permet même de comparer les valeurs générées à une référence temporelle.

5bd34e9d13b47fb6.png

Si vous parvenez à configurer les bonnes périodes avec suffisamment de points de données, vous pouvez générer un rapport indiquant le changement de latence important entre la fonction Cloud initiale et la nouvelle.

2cc0e9a3212b91bb.png

2e7b1ebf2f0a2b4f.png

Ce rapport personnalisé permet de déterminer quand un problème de performances a été introduit et de suivre un indicateur de niveau de service (SLI), comme la latence des requêtes de l'utilisateur final.

8. Il est temps de nettoyer les ressources

Voilà qui conclut cet atelier de programmation.

Bien que Cloud Functions et les outils Stackdriver soient des plates-formes sans serveur qui n'entraînent aucun coût lorsqu'ils ne sont pas utilisés, soyez un bon citoyen du cloud et supprimez votre fonction Cloud. Il suffit de sélectionner hello-monitor dans Overview (Aperçu) sous Cloud Functions, puis de cliquer sur Delete (Supprimer).

aceb633cf70a4a27.png

9. Étape suivante

Voici quelques lectures complémentaires:

/