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

Last reviewed 2017-08-28 UTC

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 canalizaciones de procesamiento de efectos visuales (VFX) y compilación de sistemas. 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
  • Enrutar registros de Logging a un almacenamiento accesible a largo plazo

Costos

En este documento, usarás 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 califiquen 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 del selector de proyectos de la consola de Google Cloud, selecciona o crea un proyecto de Google Cloud.

    Ir al selector de proyectos

  2. Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud.

  3. Habilita la API de 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 la consola de Google Cloud, ve a la página Crear una instancia.

    Ir a Crear una instancia

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

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 la consola, ve a la página Explorador de registros.

    Ir a la página Explorador 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 CLI 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 Google Cloud CLI, 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 utilizan algún tipo de lenguaje de programación para realizar tareas programáticas, como preparación de activos, publicación, transferencia de datos, procesamiento o 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 la consola, en Logging > Registros > Proyecto de Google:

 Registros > Proyecto de Google" class="l10n-absolute-url-src screenshot border" l10n-attrs-original-order="src,alt,class" src="https://cloud.google.com/static/architecture/images/stackdriver-project-resource.png" />

Enruta registros

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

Para obtener un almacenamiento económico a largo plazo, enruta los registros a los depósitos de Compute Engine. Para realizarles un análisis de macrodatos, enrútalos 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 enrutar y elige Compute Engine o BigQuery como destino. La creación de un receptor comienza inmediatamente a enrutar los registros especificados al destino indicado. Para obtener más información sobre los registros de enrutamiento en el explorador de registros, consulta Configura y administra receptores.

Enruta 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. Realiza los siguientes pasos:

  1. Crea un conjunto de datos de BigQuery.

  2. Crea el receptor con un filtro para enrutar 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.

Enruta a Cloud Storage

Para guardar tus registros en un archivo, debes enrutarlos a un bucket 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 enrutar a Cloud Storage:

  1. Crear un bucket de Cloud Storage
  2. En Logging, crea un receptor con un filtro para enrutar 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 bucket, con una leve demora. Puedes obtener más información en la documentación Cómo funcionan los receptores.

Limpia

Para evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos usados en este instructivo, borra el proyecto que contiene los recursos o conserva el proyecto y borra los recursos individuales.

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 la consola de Google Cloud, ve a la página Administrar recursos.

    Ir a Administrar recursos

  2. En la lista de proyectos, elige el proyecto que quieres borrar y haz clic en Borrar.
  3. En el diálogo, escribe el ID del proyecto y, luego, 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 la consola de Google Cloud, ve a la página Instancias de VM.

    Ir a Instancias de VM

  2. Selecciona tu instancia en la casilla de verificación de es la instancia que deseas borrar.
  3. Para borrar la instancia, haz clic en Más acciones, haz clic en Borrar y, luego, sigue las instrucciones.

Borra el bucket de Cloud Storage

Para borrar un bucket de Cloud Storage, sigue estos pasos:

  1. En la consola de Google Cloud, ve a la página Buckets de Cloud Storage.

    Ir a Buckets

  2. Haz clic en la casilla de verificación del bucket que deseas borrar.
  3. Para borrar el bucket, haz clic en Borrar y sigue las instrucciones.

Próximos pasos