Utiliser Cloud Logging en tant que serveur de journalisation pour un pipeline de rendu VFX

Ce tutoriel explique comment utiliser Cloud Logging à la place d'un serveur de journalisation afin d'effectuer une journalisation spécifique à une application. Par défaut, Cloud Logging regroupe les journaux du système et de nombreuses applications courantes. Le tutoriel explique également comment obtenir des journaux dans Cloud Logging à partir de workflows personnalisés ou d'applications qui ne figurent pas dans la liste des applications courantes.

Les nœuds de calcul à courte durée de vie sont fréquents dans de nombreuses charges de travail de calcul, comme les pipelines de rendu d'effets visuels (VFX) et les systèmes de compilation. Ce tutoriel se concentre sur les charges de travail VFX et prend pour exemple le moteur de rendu VFX autonome V-Ray. Dans un cas d'utilisation classique, des instances de VM sont créées à la demande par un système de mise en file d'attente, se voient attribuer une tâche (telle qu'une ou plusieurs images à afficher) et s'arrêtent une fois la tâche terminée. Vous devez capturer les journaux générés non seulement par le processus de rendu, mais également par les tâches effectuées par l'instance avant ou après le rendu, telles que la conversion de fichiers ou la copie d'images affichées en local dans un espace de stockage commun.

Objectifs

  • Créer une instance et installer l'agent Cloud Logging sur celle-ci
  • Configurer votre application ou votre workflow personnalisé pour envoyer des journaux à l'agent Cloud Logging
  • Utiliser la bibliothèque cliente Python pour envoyer des journaux directement à Logging
  • Afficher, filtrer et rechercher des journaux dans Logging
  • Exporter des journaux depuis Logging vers un espace de stockage accessible à long terme

Coûts

Ce tutoriel utilise les composants facturables suivants de Google Cloud :

  • Compute Engine

Obtenez une estimation des coûts en fonction de votre utilisation prévue à l'aide du simulateur de coût. Les nouveaux utilisateurs de Google Cloud peuvent bénéficier d'un essai gratuit.

Consultez la page Tarifs de Logging pour comprendre les coûts liés à l'utilisation de Cloud Logging dans le cadre de ce tutoriel.

Avant de commencer

  1. Dans Google Cloud Console, sur la page de sélection du projet, sélectionnez ou créez un projet Google Cloud.

    Accéder à la page de sélection du projet

  2. Assurez-vous que la facturation est activée pour votre projet Cloud. Découvrez comment vérifier que la facturation est activée pour votre projet.

  3. Activez l'API Compute Engine.

    Activer l'API

  4. Installez le composant de commandes gcloud beta :

    gcloud components install beta
  5. Définissez votre projet par défaut afin de ne pas avoir à fournir l'option --project dans chaque commande :

    gcloud config set project PROJECT_ID

Créer une instance Compute Engine

L'agent Cloud Logging fonctionne sur les instances de machines virtuelles (VM) Compute Engine et les instances de VM Amazon Elastic Compute Cloud (Amazon EC2). Pour en savoir plus sur l'agent et sur les instances de VM compatibles, consultez la page Agent Logging dans la documentation du produit.

Pour les besoins de ce tutoriel, vous pouvez créer une instance avec un type de VM par défaut. En production, toutefois, vous devez décider de la puissance de calcul requise par votre application et choisir une VM en conséquence.

  1. Dans Cloud Console, accédez à la page Instances de VM.

    Accéder à la page Instances de VM

  2. Cliquez sur Créer une instance.
  3. Sur la page Créer une instance, renseignez les propriétés de votre instance. Pour afficher les options de configuration avancées, développez la section Gestion, sécurité, disques, réseau et location unique.
  4. Cliquez sur Créer pour créer l'instance.

La création de l'instance prend quelques instants. Dans ce tutoriel, l'instance de VM est nommée sd-tutorial.

Configurer l'instance Compute Engine

Une fois que vous avez créé l'instance de VM à l'aide d'un compte disposant d'autorisations de super-utilisateur, procédez comme suit :

  1. Utilisez SSH pour vous connecter à l'instance sd-tutorial.

    gcloud compute ssh sd-tutorial
  2. Installez l'agent Cloud Logging. Pour obtenir des instructions détaillées, consultez la page Installer l'agent Cloud Logging.

  3. Téléchargez et installez pip :

    sudo yum install python-pip
  4. Téléchargez et installez la bibliothèque Python Cloud Logging :

    pip install --user --upgrade google-cloud-logging
  5. Créez le fichier de configuration de l'agent Cloud Logging pour V-Ray à l'emplacement /etc/google-fluentd/config.d/vray.conf avec le contenu suivant :

    <source>
      @type tail
      read_from_head true
      format /^(\[(?<time>.*?)\])?((?<severity> ?(debug|info|warning|error|critical)): )?(?<message>.*)$/
      time_format %Y/%b/%d|%H:%M:%S
        # Log file names must be of the format SH.SEQ.SHOT.ROLE.log.
        # For example: myfilm.fba.0050.render.log
      path /home/*/vray/logs/*.log
      pos_file /var/lib/google-fluentd/pos/vray.pos
      tag vray.*
    </source>
    <filter vray.**>
      @type record_transformer
      <record>
        # Parse the log file name and add additional key:value records
        # to aid in filtering and searching logs in Logging.
        # Assumes you are following the convention in this tutorial.
        show ${tag_parts[-5]}
        seq ${tag_parts[-4]}
        shot ${tag_parts[-3]}
        role ${tag_parts[-2]}
        tag ${tag_suffix[1]} # Strip off the "vray." prefix.
      </record>
    </filter>
    

    Pour en savoir plus sur la configuration de fluentd, consultez la page Config File Syntax.

  6. Actualisez la configuration de l'agent Cloud Logging :

    sudo service google-fluentd reload

    Dans un système de production, vous pouvez ensuite transformer cette VM configurée en image de VM personnalisée que votre pipeline pourrait démarrer à la demande.

Informations spécifiques aux effets visuels

Chaque package logiciel de rendu génère sa propre sortie de journal. Bien que ce tutoriel utilise le moteur de rendu autonome V-Ray, vous pouvez l'adapter à d'autres moteurs de rendu ou applications avec stdout/stderr en sortie. Le tutoriel utilise une configuration fluentd généralisée et implique que votre système de mise en file d'attente redirige la sortie du moteur de rendu vers un nom de fichier ayant un format spécifique et adapté pour la recherche. Si vous exécutez plusieurs tâches sur une même VM, vous devez vous assurer que les noms de fichiers sont uniques.

Nommer les fichiers journaux dans Logging

Lorsque vous définissez la convention de nommage de vos journaux Logging, suivez les bonnes pratiques concernant les conventions de nommage propres à votre studio. Logging peut effectuer une recherche sur plusieurs ressources. Par conséquent, l'utilisation d'une convention de nommage cohérente vous permet de rechercher des journaux générés à partir de différentes ressources dont les tags comportent des données identiques ou similaires. Dans ce tutoriel, le gestionnaire de files d'attente renseigne les valeurs suivantes dans des variables d'environnement avant de lancer le processus du nœud de calcul du rendu. Elles sont ensuite utilisées en tant que tags pour les journaux et pour générer un nom de fichier unique :

fieldName Variable d'environnement Valeur
Nom de la production (du projet) SHOW myfilm
Nom de la séquence SEQ fba
Numéro de plan SHOT 0050
Rôle ROLE render

Dans cet exemple, les valeurs sont assemblées dans une convention de nommage classique pour des workflows relatifs aux effets visuels :

<SHOW>.<SEQ>.<SHOT>.<ROLE>.log

Par exemple, les journaux de rendu du plan fba0050 présenteraient le tag suivant :

myfilm.fba.0050.render.log

Dans ce tutoriel, on s'attend à ce que le gestionnaire de files d'attente définisse le nom des fichiers journaux conformément à cette convention, mais vous pouvez facilement la modifier en fonction des besoins de votre studio.

Tester manuellement la configuration de Logging

Pour vérifier votre configuration sans utiliser de moteur de rendu ni de gestionnaire de files d'attente, copiez un exemple d'entrée de journal dans un journal de test. Depuis votre répertoire d'accueil, saisissez les commandes suivantes :

mkdir -p vray/logs/
export SHOW='testshow' SEQ='testseq' SHOT='testshot' ROLE='testrole'
echo "debug: Test log line at `date` from ${HOSTNAME}" >> vray/logs/${SHOW}.${SEQ}.${SHOT}.${ROLE}.log

Cette ligne devrait apparaître rapidement dans la visionneuse de journaux.

Vérifier la diffusion des journaux

  1. Dans Cloud Console, accédez à la page Visionneuse de journaux.

    Accéder à la page Visionneuse de journaux

    Dans le menu Journaux, vous devriez voir une entrée avec un tag comportant le nom du journal que vous avez créé (dans le cas présent, testshow.testseq.testshot.testrole).

  2. Consultez ce journal pour voir votre sortie :

    Visionneuse de journaux Cloud Logging

    Vous pouvez également lire les journaux à l'aide de la commande bêta de l'outil gcloud, en remplaçant [project-id] et [log-name] selon le cas :

    # List all logs.
    gcloud beta logging logs list
    
    # Read the contents of a specific log.
    gcloud beta logging read projects/[project-id]/logs/[log-name]
    

Pour plus d'informations sur la journalisation à l'aide de l'outil de ligne de commande gcloud, consultez la documentation sur la lecture des entrées de journal.

Envoyer des journaux à Logging à partir d'un processus de rendu

Une fois la configuration correctement configurée et vérifiée, vous pouvez envoyer des journaux à Logging à l'aide d'une ligne de commande autonome V-Ray semblable à celle indiquée ci-dessous. Dans cet exemple, les options de ligne de commande lancent le processus V-Ray et produisent un résultat optimisé pour la redirection vers un fichier. Le gestionnaire de files d'attente doit remplacer SCENE_FILE par le chemin d'accès au fichier local approprié. Il doit également renseigner les quatre variables d'environnement (SHOW, SEQ, SHOT et ROLE) permettant de générer le nom du journal, comme décrit dans la section Nommer les fichiers journaux.

vray \
   -display=0 \
   -showProgress=0 \
   -progressUseCR=0 \
   -progressUseColor=0 \
   -sceneFile SCENE_FILE > vray/logs/${SHOW}.${SEQ}.${SHOT}.${ROLE}.log 2>&1

Envoyer des journaux directement à l'API Cloud Logging

La plupart des pipelines VFX utilisent un langage de script pour effectuer automatiquement certaines tâches, telles que la préparation d'éléments, la publication, le transfert de données, le rendu ou le transcodage. Vous pouvez consigner le résultat de ces tâches dans Logging à l'aide d'une bibliothèque cliente. Ce tutoriel utilise Python du fait de sa large utilisation dans le secteur des effets visuels.

Vous pouvez envoyer des journaux à Logging à partir de postes de travail sur site ou dans le cloud. Vous n'installez pas l'agent Logging pour écrire des journaux de cette manière, car vous communiquez avec Logging via son API Python.

Écrire un journal sur Cloud Logging à l'aide de la bibliothèque Python

Pour écrire un journal dans Cloud Logging à l'aide d'un script Python, vous devez d'abord effectuer les opérations suivantes :

  • Compiler les métadonnées du journal
  • Indiquer le niveau de gravité
  • Décider sur quel type de ressource consigner les journaux

Le script effectue les opérations suivantes :

  • Vérification de l'utilisation des conventions de nommage appropriées
  • Assemblage des données du journal
  • Écriture du journal au niveau des ressources du projet Google

Si vous envoyez des journaux à Logging à partir d'un poste de travail ou d'un serveur sur site, vous devez d'abord vous authentifier. Si vous envoyez des journaux à partir d'une instance cloud, votre authentification a déjà été effectuée.

#!/usr/bin/python
#
# Copyright 2017 Google Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

from google.cloud import logging
from google.cloud.logging.resource import Resource
import getpass
import os
import socket

def write(text, severity='INFO', show=None, seq=None, shot=None, role=None, **kwargs):
    '''Wrapper method for assembling the payload to send to logger.log_text.'''

    # Extract and build LOG_ID from environment.
    # For example: 'myfilm.slb.0050.render'
    if not show:
        show = os.getenv('SHOW')
    if not seq:
        seq = os.getenv('SEQ')
    if not shot:
        shot = os.getenv('SHOT')
    if not role:
        role = os.getenv('ROLE')

    if not show or not seq or not shot or not role:
        raise Exception('One or more log name tokens are empty. Unable to log.')
    # end if

    # Assemble logger name.
    logger_name = '.'.join([
        show,
        seq,
        shot,
        role
    ])

    print '# Logging to %s...' % logger_name

    # Build logger object.
    logging_client = logging.Client()
    logger = logging_client.logger(logger_name)

    # Assemble the required log metadata.
    label_payload = {
        "artist" : getpass.getuser(),
        "hostname" : socket.gethostname(),
        "show" : show,
        "seq" : seq,
        "shot" : shot,
        "role" : role
    }

    # Add optional kwargs to payload.
    label_payload.update(kwargs)

    # Write log.
    logger.log_text(
        text,
        resource=Resource(type='project', labels={'project_id':show}),
        severity=severity,
        labels=label_payload
    )

# end write

Vous pouvez importer le module dans n'importe quel script Python de votre pipeline et l'exécuter sur un poste de travail local ou sur une instance cloud :

import logToStackdriver as lts
lts.write( 'This is the text to log.', show='myfilm', seq='slb', shot='0050', role='render' )

Par défaut, tous les journaux écrivent dans la ressource "projet", que vous pouvez trouver dans Google Cloud Console, sous Logging > Journaux > Projet Google :

Cloud Logging > Journaux > Projet Google

Exporter les journaux

Si vous souhaitez conserver vos journaux au-delà de la période de conservation en vigueur, vous devez les exporter.

Pour un stockage économique à long terme, exportez vos journaux vers des buckets Compute Engine. Pour effectuer une analyse big data sur vos journaux, exportez-les vers un ensemble de données BigQuery. Dans les deux cas, vous devez d'abord créer un objet appelé récepteur. Celui-ci vous permet de créer un filtre sélectionnant les entrées de journal que vous souhaitez exporter et de choisir Compute Engine ou BigQuery comme destination. Dès qu'un récepteur est créé, l'exportation des journaux spécifiés commence immédiatement vers la destination choisie. Vous pouvez exporter des journaux dans la visionneuse de journaux, à l'aide de l'API Cloud Logging, ou directement depuis l'outil de ligne de commande gcloud logging.

Exporter vers BigQuery

Vous pouvez interroger les journaux stockés dans BigQuery à l'aide de la sémantique SQL. De nombreux outils d'analyse tiers sont compatibles de manière native avec ces journaux. Pour ce faire, procédez comme suit :

  1. Créez un ensemble de données BigQuery.

  2. Créez un récepteur avec un filtre afin d'exporter les journaux dans cette table. Notez que dans la ligne de commande suivante, [PROJECT_ID] fait référence à votre projet Google Cloud.

    gcloud beta logging sinks create render-errors-bq  \
        bigquery.googleapis.com/projects/[PROJECT_ID]/datasets/[DATASET] \
        --log-filter "jsonPayload.SHOW=myfilm AND jsonPayload.SHOT=fba AND severity>=WARNING"
    
  3. Vous recevrez un message comportant le nom du compte de service à ajouter à votre ensemble de données BigQuery. Vous pouvez utiliser l'interface utilisateur Web en cliquant sur le menu déroulant à côté du nom de l'ensemble de données, puis sur Partager l'ensemble de données.

Le prochain journal transmis à Logging correspondant à ce filtre sera envoyé (après quelques instants) à l'ensemble de données. Vous trouverez plus de détails dans la documentation sur le fonctionnement des récepteurs.

Exporter vers Cloud Storage

Pour enregistrer vos journaux dans un fichier, exportez-les dans un bucket Cloud Storage. En ce qui concerne les buckets Cloud Storage, vous pouvez sélectionner une classe de stockage plus économique pour les fichiers moins fréquemment consultés, ou bénéficier des quotas d'utilisation gratuite. Cloud Storage offre un accès facile, soit par HTTP, soit par intégration directe avec de nombreux autres produits Google Cloud.

Les étapes suivantes montrent comment effectuer une exportation vers Cloud Storage :

  1. Créez un bucket Cloud Storage.
  2. Dans Logging, créez un récepteur avec un filtre pour exporter ces journaux vers Cloud Storage.

    gcloud beta logging sinks create render-errors-gcs  \
        storage.googleapis.com/my-gcs-bucket \
        --log-filter "jsonPayload.SHOW=myfilm AND jsonPayload.SHOT=fba AND severity>=WARNING"
    

Le prochain journal envoyé à Logging correspondant à ce filtre sera envoyé, après quelques instants, vers un fichier du bucket. Vous trouverez plus de détails dans la documentation sur le fonctionnement des récepteurs.

Nettoyer

Pour éviter que les ressources utilisées lors de ce tutoriel soient facturées sur votre compte Google Cloud, supprimez le projet contenant les ressources, ou conservez le projet et supprimez les ressources individuelles.

Supprimer le projet

Le moyen le plus simple d'empêcher la facturation est de supprimer le projet que vous avez créé pour ce tutoriel.

Pour supprimer le projet :

  1. Dans Cloud Console, accédez à la page Gérer les ressources.

    Accéder à la page Gérer les ressources

  2. Dans la liste des projets, sélectionnez le projet que vous souhaitez supprimer, puis cliquez sur Supprimer.
  3. Dans la boîte de dialogue, saisissez l'ID du projet, puis cliquez sur Arrêter pour supprimer le projet.

Supprimer vos instances Compute Engine

Pour supprimer une instance Compute Engine, procédez comme suit :

  1. Dans Cloud Console, accédez à la page Instances de VM.

    Accéder à la page Instances de VM

  2. Cochez la case correspondant à à l'instance que vous souhaitez supprimer.
  3. Cliquez sur Supprimer  pour supprimer l'instance.

Supprimer votre bucket Cloud Storage

Pour supprimer un bucket Cloud Storage, procédez comme suit :

  1. Dans Cloud Console, accédez à la page Navigateur Cloud Storage.

    Accéder au navigateur Cloud Storage

  2. Cochez la case correspondant au bucket que vous souhaitez supprimer.
  3. Pour supprimer le bucket, cliquez sur Supprimer .

Étape suivante