Usa Cloud Logging como servidor de registros de una canalización de renderizado de VFX

En este instructivo, se explica cómo usar Cloud Logging en lugar de un servidor de registro para generar registros específicos de la aplicación. De forma predeterminada, Cloud Logging agrega registros del sistema y de muchas aplicaciones comunes. En el instructivo, también se muestra cómo obtener registros en Cloud Logging desde flujos de trabajo personalizados o aplicaciones que no están en la lista de aplicaciones comunes.

Los trabajadores de corta duración son comunes en varias cargas de trabajo de procesamiento, como en las canalizaciones de renderizado de efectos visuales (VFX) y los sistemas de compilación. Este instructivo se enfoca en las cargas de trabajo de VFX y usa el motor de renderizado de VFX independiente V-Ray como ejemplo. En un caso práctico típico, las instancias de VM se crean según la demanda mediante un sistema de colas, se les asigna un trabajo (como uno o más marcos para procesar) y se terminan una vez que se completa el trabajo. Debes capturar los registros no solo del proceso de renderizado, sino también de cualquier trabajo anterior o posterior al renderizado que realice la instancia, como la conversión de archivos o la copia de marcos renderizados de forma local en el almacenamiento común.

Objetivos

  • Crear una instancia e instalar el agente de Cloud Logging en la instancia
  • Configurar la aplicación o flujo de trabajo personalizado para enviar registros al agente de Cloud Logging
  • Usar la biblioteca cliente de Python para enviar registros directamente a Logging
  • Ver, filtrar y buscar registros en Logging
  • Exportar registros de Logging a un almacenamiento accesible a largo plazo

Costos

En este instructivo, se usan los siguientes componentes facturables de Google Cloud:

  • Compute Engine

Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios. Es posible que los usuarios nuevos de Google Cloud sean aptos para obtener una prueba gratuita.

Consulta Precios de Logging para comprender los costos relacionados con el uso de Cloud Logging en este instructivo.

Antes de comenzar

  1. En la página de selección de proyectos de Cloud Console, selecciona o crea un proyecto de Cloud.

    Ir a la página Selector de proyectos

  2. Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud. Obtén información sobre cómo confirmar que tienes habilitada la facturación para tu proyecto.

  3. Habilita la API Compute Engine.

    Habilita la API

  4. Instala el componente de comandos gcloud beta:

    gcloud components install beta
  5. Configura el proyecto predeterminado para que no tengas que proporcionar la marca --project con cada comando:

    gcloud config set project PROJECT_ID

Crea una instancia de Compute Engine

El agente de Cloud Logging funciona en instancias de máquina virtual (VM) de Compute Engine y en instancias de VM de Amazon Elastic Compute Cloud (Amazon EC2). Si deseas obtener más información sobre el agente y las instancias de VM que admite, consulta Agente de registro en la documentación del producto.

A los fines de este instructivo, puedes crear una instancia con un tipo de VM predeterminado. Sin embargo, en producción, debes decidir cuánta potencia de procesamiento requiere la aplicación y elegir una VM en consecuencia.

  1. En Cloud Console ve a la página Instancias de VM.

    Ir a la página Instancias de VM

  2. Haz clic en Crear instancia.
  3. En la página Crear una instancia nueva, completa las propiedades que quieras para tu instancia. Para opciones de configuración avanzadas, expande la sección Administración, seguridad, discos, herramientas de redes, usuario único.
  4. Haz clic en Crear para crear la instancia.

La creación de la instancia nueva toma solo unos minutos. En este instructivo, la instancia de VM se llama sd-tutorial.

Configura la instancia de Compute Engine

Una vez creada la instancia de VM, con una cuenta que tenga permisos de superusuario, completa estos pasos:

  1. Usa SSH para conectarte a la instancia sd-tutorial.

    gcloud compute ssh sd-tutorial
  2. Instala el agente de Cloud Logging. Para obtener instrucciones detalladas, consulta Instala el agente de Cloud Logging.

  3. Descarga y, luego, instala pip.

    sudo yum install python-pip
  4. Descarga e instala la biblioteca de Python para Cloud Logging:

    pip install --user --upgrade google-cloud-logging
  5. Crea el archivo de configuración del agente de Cloud Logging para V-Ray en /etc/google-fluentd/config.d/vray.conf con el siguiente contenido:

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

    Para obtener más información sobre la configuración de fluentd, consulta Sintaxis del archivo de configuración.

  6. Vuelve a cargar la configuración del agente de Cloud Logging:

    sudo service google-fluentd reload

    En una configuración de producción, podrías convertir esta VM configurada en una imagen de VM personalizada que tu canalización podría iniciar según demanda.

Consideraciones especiales para VFX

Cada paquete de software de renderizado genera su propio resultado de registro. Aunque en este instructivo se usa el motor de renderizado independiente V-Ray, puedes adaptar el instructivo a otros motores o aplicaciones que generen stdout/stderr en el resultado. En este instructivo, se usa una configuración fluentd generalizada y se espera que el sistema de colas redireccione el resultado del motor de renderizado a un nombre de archivo con un formato específico de búsqueda. Si ejecutas varios trabajos en una sola VM, deberás garantizar nombres de archivo únicos.

Asigna un nombre a los archivos de registro en Logging

Cuando definas la convención de nombres de los registros de Logging, sigue las prácticas recomendadas para las convenciones de nombres en uso en tu estudio. Logging puede buscar en todos los recursos, por lo que usar una convención de nombres coherente garantiza que puedas buscar registros generados a partir de recursos diferentes etiquetados con los mismos datos o similares. En este instructivo, el administrador de colas propaga los siguientes valores en las variables de entorno antes de iniciar el proceso de trabajador de renderizado, que luego se usan para etiquetar los registros y generar un nombre de archivo único:

Nombre del campo Variable de entorno Valor
Mostrar nombre (proyecto) SHOW myfilm
Nombre de la secuencia SEQ fba
Número de corte SHOT 0050
Función ROLE render

En el ejemplo, estos valores se reúnen en una convención de nombre típica para los flujos de trabajo de efectos visuales:

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

Por ejemplo, los registros de renderizado para la toma fba0050 se etiquetarían de la siguiente manera:

myfilm.fba.0050.render.log

En este instructivo, se espera que el administrador de colas establezca el nombre de archivo de registro de acuerdo con esta convención, pero se puede modificar con facilidad para que se ajuste a las diferentes necesidades del estudio.

Prueba la configuración de Logging de forma manual

Para verificar tu configuración sin usar un motor de renderizado o un administrador de colas, copia una entrada de registro de muestra en un registro de prueba. Desde tu directorio principal, ingresa los siguientes comandos:

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

Esta línea debería aparecer brevemente en el visor de registro.

Verifica la entrega del registro

  1. En Cloud Console, ve a la página Visor de registros.

    Ir a la página Visor de registros

    En el menú Registros, deberías ver una entrada etiquetada con el nombre de registro que creaste (en este caso, testshow.testseq.testshot.testrole).

  2. Observa este registro para ver el resultado:

    Visor de registros de Cloud Logging

    También puedes leer registros si usas el comando Beta de la herramienta de gcloud y reemplazas [project-id] y [log-name] según corresponda:

    # 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]
    

Para obtener más información sobre el registro mediante la herramienta de línea de comandos de gcloud, consulta la documentación sobre la lectura de entradas de registro.

Accede a Logging desde un proceso de renderizado

Con la configuración establecida de forma correcta y verificada, puedes usar una línea de comandos independiente V-Ray como la siguiente para enviar registros a Logging. En este ejemplo, las marcas de línea de comandos inician el proceso de V-Ray con un resultado optimizado para redireccionar a un archivo. Se espera que el administrador de colas reemplace SCENE_FILE por la ruta de archivo local correspondiente. También debe propagar las cuatro variables de entorno (SHOW, SEQ, SHOT y ROLE) que se usan para generar el nombre del registro, como se describe en la sección Nombra los archivos de registro.

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

Accede directamente a la API de Cloud Logging

La mayoría de las canalizaciones de VFX usan algún tipo de lenguaje de programación para realizar tareas programáticas, como la preparación de activos, la publicación, la transferencia de datos, el renderizado o la transcodificación. Puedes registrar el resultado de estas tareas en Logging mediante una biblioteca cliente. En este instructivo, se usa Python, porque es muy conocido en la industria de VFX.

Puedes enviar registros a Logging desde estaciones de trabajo locales y basadas en la nube. No instalas el agente de Logging para escribir registros de esta manera porque te comunicas con Logging a través de la API de Python.

Escribe un registro en Cloud Logging mediante la biblioteca de Python

Para acceder a Cloud Logging mediante una secuencia de comandos de Python, primero debes hacer lo siguiente:

  • Compila los metadatos de registro.
  • Proporciona el nivel de severidad.
  • Decide a qué tipo de recurso acceder.

La secuencia de comandos realiza las siguientes acciones:

  • Verifica para garantizar el uso de convenciones de nombres adecuadas.
  • Reúne los datos de registro.
  • Escribe el registro a nivel de recursos del proyecto de Google.

Si accedes desde una estación de trabajo o servidor local, debes autenticarte antes de acceder a Logging. Si accedes desde una instancia de nube, la autenticación ya está completa.

#!/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

Puedes importar el módulo en cualquier secuencia de comandos de Python en tu canalización y ejecutarlo en una estación de trabajo local o en una instancia en la nube:

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

De forma predeterminada, todos los registros escriben en el recurso “proyecto”, que puedes encontrar en Google Cloud Console, en Logging > Registros > Proyecto de Google:

Cloud Logging > Registros > Proyecto de Google

Exporta registros

Si deseas conservar los registros después del período de retención de registros, debes exportarlos.

Para obtener un almacenamiento económico a largo plazo, exporta los registros a los depósitos de Compute Engine. Para realizar un análisis de macrodatos en ellos, expórtalos a un conjunto de datos de BigQuery. En cualquier caso, primero debes crear un objeto llamado receptor. El receptor te permite crear un filtro que selecciona las entradas de registro que deseas exportar y elige Compute Engine o BigQuery como destino. La creación de un receptor comienza inmediatamente a exportar los registros especificados al destino indicado. Puedes exportar registros en el Visor de registros mediante la API de Cloud Logging o directamente con la herramienta de línea de comandos de gcloud logging.

Exporta a BigQuery

Puedes usar la semántica de SQL para consultar los registros almacenados en BigQuery. Muchas herramientas de estadísticas de terceros admiten estos registros de forma nativa. Sigue estos pasos:

  1. Crea un conjunto de datos de BigQuery.

  2. Crea el receptor con un filtro para exportar registros a esa tabla. Ten en cuenta que [PROJECT_ID] en la siguiente línea de comandos se refiere al proyecto de 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. Recibirás un mensaje con el nombre de la cuenta de servicio para agregar a tu conjunto de datos de BigQuery. Puedes usar la IU web. Haz clic en el menú desplegable junto al nombre del conjunto de datos y, luego, en Compartir conjunto de datos.

El siguiente registro enviado a Logging que coincida con este filtro se enviará al conjunto de datos, con una leve demora. Puedes obtener más información en la documentación Cómo funcionan los receptores.

Exporta a Cloud Storage

Para guardar tus registros en un archivo, debes exportarlos a un depósito de Cloud Storage. Para los depósitos de Cloud Storage, puedes seleccionar una clase de almacenamiento con precios más bajos destinada a archivos con acceso menos frecuente, o aprovechar la asignación de uso gratis. Cloud Storage proporciona un acceso fácil con HTTP o mediante la integración directa con muchos otros productos de Google Cloud.

En los siguientes pasos, se muestra cómo exportar a Cloud Storage:

  1. Crea un depósito de Cloud Storage.
  2. En Logging, crea un receptor con un filtro para exportar esos registros a 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"
    

El siguiente registro enviado a Logging que coincida con este filtro se enviará a un archivo en el depósito, con una leve demora. Puedes obtener más información en la documentación Cómo funcionan los receptores.

Limpieza

Sigue estos pasos para evitar que se apliquen cargos a tu cuenta de Google Cloud Platform por los recursos que usaste en este instructivo:

Borra el proyecto

La manera más fácil de eliminar la facturación es borrar el proyecto que creaste para el instructivo.

Para borrar el proyecto, sigue estos pasos:

  1. En Cloud Console, ve a la página Administrar recursos.

    Ir a la página Administrar recursos

  2. En la lista de proyectos, selecciona el proyecto que deseas borrar y haz clic en Borrar .
  3. En el cuadro de diálogo, escribe el ID del proyecto y haz clic en Cerrar para borrar el proyecto.

Borra tus instancias de Compute Engine

Para borrar una instancia de Compute Engine, sigue estos pasos:

  1. En Cloud Console, ve a la página Instancias de VM.

    Ir a la página Instancias de VM

  2. Haz clic en la casilla de verificación para La instancia que deseas borrar.
  3. Haz clic en Borrar  para borrar la instancia.

Borra el depósito de Cloud Storage

Para borrar un depósito de Cloud Storage, sigue estos pasos:

  1. En Cloud Console, ve a la página Navegador de Cloud Storage.

    Ir a la página Navegador de Cloud Storage

  2. Haz clic en la casilla de verificación del depósito que quieras borrar.
  3. Para borrar el depósito, haz clic en Borrar .

Próximos pasos