Cómo usar Stackdriver como un servidor de registro para una canalización de procesamiento de VFX.

En este instructivo, se describe cómo utilizar Stackdriver Logging en lugar de un servidor de registro para el registro específico de la aplicación. De forma predeterminada, Stackdriver Logging agrega registros del sistema y de varias aplicaciones comunes. En este instructivo, también se muestra cómo obtener registros en Stackdriver 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 procesador de VFX autónomo 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 procesamiento, sino también de cualquier trabajo anterior o posterior al procesamiento que realice la instancia, como la conversión de archivos o la copia de marcos procesados de forma local en el almacenamiento común.

Objetivos

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

Costos

Consulta Stackdriver Pricing para comprender los costos relacionados con el uso de Stackdriver en este instructivo.

Antes de comenzar

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

    Ir a la página de selección de proyecto

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

  3. Habilita lasCompute EngineAPI.

    Habilita lasAPI

  4. Instala el componente de comandos de gcloud beta:

    gcloud components install beta
  5. Establece tu proyecto predeterminado para que no tengas que proporcionar el marcador --project con cada comando:

    gcloud config set project PROJECT_ID

Cómo crear una instancia de Compute Engine

El agente de Stackdriver Logging funciona en las instancias de la máquina virtual (VM) de Google Compute Engine y las 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 GCP 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, instancia única.
  4. Haz clic en Create para crear la instancia.

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

Cómo configurar 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 de sd-tutorial.

    gcloud compute ssh sd-tutorial
  2. Instala el agente de Stackdriver Logging. Si deseas obtener instrucciones detalladas, consulta Instalación del agente de Stackdriver Logging.

  3. Descarga y, luego, instala pip:

    sudo yum install python-pip
  4. Descarga y, luego, instala la biblioteca de Python de Stackdriver Logging:

    sudo pip install --upgrade google-cloud-logging
  5. Crea el archivo de configuración del agente de Stackdriver 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 Stackdriver.
        # 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>
    

    Si deseas obtener más información sobre la configuración de fluentd, consulta la sintaxis del archivo de configuración.

  6. Vuelve a cargar la configuración del agente de Stackdriver 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 la demanda.

Consideraciones especiales para VFX

Cada paquete de software de procesamiento genera su propio resultado de registro. Aunque en este instructivo se utiliza el procesador independiente de V-Ray, puedes adaptarlo a otros procesadores o aplicaciones que produzcan stdout/stderr. En este instructivo, se usa una configuración fluentd generalizada y se espera que tu sistema de listas redireccione el resultado del procesador a un nombre de archivo con un formato específico y fácil de buscar. Si ejecutas varios trabajos en una sola VM, deberás garantizar nombres de archivo únicos.

Cómo nombrar tus archivos de registro en Stackdriver

Cuando defines la convención de nombres para tus registros de Stackdriver, sigue las recomendaciones sobre convenciones de nombres que se usan en tu estudio. Stackdriver puede buscar en todos los recursos, por lo que el uso de una convención de nombre coherente garantiza que puedes buscar registros generados a partir de diferentes recursos etiquetados con la misma información o similar. En este instructivo, el administrador de colas propaga los siguientes valores en las variables del entorno antes de iniciar el proceso de trabajo de procesamiento, que luego se usan para etiquetar los registros y generar un nombre de archivo único:

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

Este ejemplo reúne estos valores 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 procesamiento para el corte 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 modificarlo para que se ajuste a las diferentes necesidades del estudio es sencillo.

Cómo probar la configuración de Stackdriver manualmente

Para verificar tu configuración sin usar un procesador 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.

Cómo verificar la entrega del registro

  1. En GCP 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 del registro que se creó; en este caso, testshow.testseq.testshot.testrole.

  2. Observa este registro para ver tu resultado:

    Visor de registros de Stackdriver

    También puedes leer los registros con el comando Beta de la herramienta gcloud; reemplaza [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]
    

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

Cómo acceder a Stackdriver a partir de un proceso de procesamiento

Con la configuración establecida correctamente y verificada, puedes usar una línea de comandos independiente de V-Ray como la siguiente para enviar registros a Stackdriver. En este ejemplo, las marcas de línea de comandos inician el proceso de V-Ray con un resultado optimizado para la redirección 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 del entorno (SHOW, SEQ, SHOT y ROLE) que se utilizan para generar el nombre del registro, tal como se describe en la sección Cómo nombrar tus archivos de registro.

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

Cómo acceder directamente a la API de Stackdriver

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 Stackdriver mediante una biblioteca cliente. En este instructivo, se usa Python, porque es muy utilizado en la industria de VFX.

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

Cómo escribir un registro en Stackdriver mediante la biblioteca de Python

Para acceder a Stackdriver mediante una secuencia de comandos de Python, primero debes realizar los siguientes pasos:

  • 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 en el nivel de recursos del proyecto de Google.

Si accedes desde una estación de trabajo o servidor local, debes autenticar antes de acceder a Stackdriver. 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 del “proyecto”, el cual puedes encontrar en Google GCP Console, en Stackdriver Logging > Registros > Proyecto de Google:

Stackdriver Logging > Registros > Proyecto de Google

Cómo exportar registros

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

A fin de obtener un almacenamiento económico a largo plazo, exporta tus registros a los depósitos de Google Cloud Storage. Para realizar un análisis de macrodatos en ellos, exporta a un conjunto de datos de BigQuery. En cualquier caso, primero creas un objeto llamado receptor. El receptor te permite crear un filtro que selecciona las entradas de registro que deseas exportar y elige Cloud Storage 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 Stackdriver Logging, o directamente con la herramienta de línea de comandos de gcloud logging.

Cómo exportar a BigQuery

Puedes usar la semántica de SQL para consultar los registros almacenados en BigQuery. Muchas herramientas de análisis 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 exportar registros a esa tabla. Ten en cuenta que [PROJECT_ID] en la siguiente línea de comandos se refiere a tu proyecto de GCP.

    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, a continuación, en Compartir conjunto de datos.

El siguiente registro enviado a Stackdriver 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 sobre Cómo funcionan los receptores.

Cómo exportar 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 correspondiente a archivos con acceso menos frecuente, o aprovechar la asignación de uso gratis. Cloud Storage proporciona un acceso fácil ya sea mediante HTTP o la integración directa con muchos otros productos de GCP.

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

  1. Crea un depósito de Cloud Storage.
  2. En Stackdriver, 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 Stackdriver 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 sobre 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, haz lo siguiente:

  1. En GCP Console, dirígete a la página Administrar recursos.

    Ir a la página Administración de 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, luego, haz clic en Cerrar para borrar el proyecto.

Cómo borrar tus instancias de Compute Engine

Para borrar una instancia de Compute Engine, haz lo siguiente:

  1. En GCP 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. Haga clic en Borrar para borrar la instancia.

Cómo borrar tu depósito de Cloud Storage

Para borrar un depósito de Cloud Storage, haz lo siguiente:

  1. En GCP 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 deseas borrar.
  3. Haz clic en Borrar para borrar el depósito.

¿Qué sigue?