Usa Cloud Logging como servidor de registro para servidores dedicados de videojuegos

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

Este instructivo se enfoca en las instancias de servidores dedicados de videojuegos (DGS) y usa el objeto binario del servidor de Unreal Tournament (UT) de Epic Games como ejemplo. En un caso práctico típico, un sistema de aprovisionamiento conectado a los servicios de la plataforma del juego crea una máquina virtual (VM) para ejecutar un DGS antes de la demanda del jugador. El DGS genera registros y tenerlos indexados y almacenados de manera central proporciona ventajas significativas a la hora de identificar y depurar problemas.

Objetivos

  • Crea una instancia de DGS y, luego, instala el agente de Cloud Logging en la instancia.
  • Configura el DGS o el flujo de trabajo para enviar registros al agente de Cloud Logging.
  • Envía registros directamente a Cloud Logging mediante la biblioteca cliente de Python.
  • Visualiza, filtra y busca registros en Cloud Logging.
  • Exporta registros de Cloud Logging a un almacenamiento accesible a largo plazo.

Costos

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

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.

Antes de comenzar

  1. En la página del selector de proyectos de Google Cloud Console, selecciona o crea un proyecto de Google Cloud.

    Ir al selector de proyectos

  2. Comprueba que la facturación esté habilitada en tu proyecto.

    Descubre cómo puedes habilitar la facturación

  3. Habilita la API Compute Engine.

    Habilita la API

  4. Instala e inicializa el SDK de Cloud.
  5. Instala el componente de comandos gcloud beta:

    gcloud components install beta
  6. Configura tu 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 Logging funciona en la máquina virtual (VM) de Compute Engine y en las instancias de VM de Amazon EC2. Si quieres obtener más información sobre el agente y las instancias de VM que admite, consulta la documentación sobre el agente de Logging. A los efectos de este instructivo, puedes crear una instancia con un tipo de VM n1-standard-8. En un sistema de producción, debes decidir cuántas instancias de DGS planeas ejecutar en cada VM y elegir el tipo de máquina que corresponda.

  1. En Google Cloud Console, 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 opciones de configuración avanzadas, expande la sección Administración, seguridad, discos, herramientas de redes, usuario único.
  3. Haz clic en Crear para crear la instancia.

La creación de la instancia nueva tarda solo unos minutos.

Configura la instancia de Compute Engine

Después de haber usado una cuenta con permisos de superusuario para crear la instancia de VM, sigue los siguientes pasos del directorio principal:

  1. En tu terminal, usa SSH para conectarte a la instancia:

    gcloud compute ssh sd-tutorial
    
  2. Instala el agente de Logging.

  3. Descarga y, luego, instala pip.

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

    sudo pip install --upgrade google-cloud-logging
    
  5. En el directorio /etc/google-fluentd/config.d, crea el archivo de configuración del agente de Logging ut.conf para Unreal Tournament (UT) con el siguiente contenido:

    <source>
      @type tail
      read_from_head true
      format /^(\[(?<time>.*?):\d{3}\])?(\[[
    \d]+\])?(?<message>((?<component>\S*?):)((?<severity>\S*?):)?.*) /
      time_format %Y.%m.%d-%H.%M.%S
    
    # Log file names must be of the format ${ENV}.${VER}.${PORT}.log.
    # For example: prod.0112.8001.log
    path /home/*/LinuxServer/UnrealTournament/Saved/Logs/*.log
    exclude_path /home/*/LinuxServer/UnrealTournament/Saved/Logs/*backup*.log
    pos_file /var/lib/google-fluentd/pos/ut.pos
    tag ut.*
    </source>
    
    <filter ut.**>
      @type record_transformer
      <record>
        # Parse the log file name and add additional key:value records
        # to aid in filtering and searching logs.
        # Assumes you are following the convention in this tutorial.
       environment ${tag_parts[-4]}
       version ${tag_parts[-3]}
       port ${tag_parts[-2]}
       tag ${tag_suffix[1]} # Strip off the "ut." 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 Logging:

    sudo service google-fluentd reload
    

En este instructivo, se da por sentado que la compilación de UT se encuentra en el directorio principal del usuario, en su estructura de directorio estándar. Para obtener más información, consulta la sección de configuración del servidor de Linux de la wiki de UT.

En una configuración de producción, te recomendamos que guardes el disco de arranque de esta VM configurada como una imagen de VM personalizada que tu canalización podría iniciar a pedido.

Aspectos para tener en cuenta cuando accedes a Cloud Logging desde un servidor dedicado de videojuegos

Cada servidor del juego dedicado genera sus resultados del registro con su propio formato. Aunque en este instructivo se usa el DGS de UT, puedes adaptarlo a otros motores o aplicaciones con salida en la transmisión estándar stdout/stderr.

En este instructivo, se utiliza una sola configuración de fluentd para todas las instancias de DGS y espera que tu sistema de aprovisionamiento redireccione el resultado de cada instancia de DGS a un nombre de archivo con un formato específico de búsqueda. Si ejecutas varias instancias del DGS en una sola VM, deberás usar nombres de archivo únicos. Las secuencias de comandos de este instructivo, que se analizan en la siguiente sección, imponen restricciones sobre los nombres de archivos de registro, pero ninguna de estas restricciones se aplica a Cloud Logging en general.

De forma predeterminada, UT crea de manera automática copias de seguridad de los archivos de registro en el directorio de registros, que el agente de Logging lee como archivos nuevos. Recomendamos que inhabilites esto en producción para evitar la duplicación de registros en Cloud Logging.

Nombra los archivos de registro del servidor del juego dedicado

Cuando definas la convención de denominación para tus registros del DGS, sigue las prácticas recomendadas o convenciones que se usen en tu estudio. Cloud Logging puede buscar en recursos, por lo que usar una convención de nombres coherente ayuda a garantizar que puedas buscar registros generados a partir de instancias de DGS diferentes etiquetadas con los mismos datos o datos similares.

En este instructivo, el servicio de aprovisionamiento propaga los valores de la siguiente tabla en las variables de entorno antes de iniciar el proceso del trabajador de procesamiento, que luego se usan para etiquetar los registros y generar un nombre de archivo único.

Nombre del campo Variable de entorno Valores de ejemplo
Entorno ENV prod, qa, dev
Versión VER 0112
Puerto PORT 8001

El siguiente ejemplo reúne estos valores en una convención de denominación del DGS:

${ENV}.${VER}.${PORT}.log

Los registros de una instancia de producción del DGS en la versión 0.1.12 del juego se etiquetarán de la siguiente manera:

prod.0112.8001.log

En este instructivo, se espera que tu proceso de administración de instancias o el equipo de operaciones establezcan el nombre de archivo de registro de acuerdo con esta convención. Sin embargo, modificar el código proporcionado para que se adapte a las diferentes necesidades de tu estudio es sencillo.

Prueba la configuración de forma manual

  • Para verificar tu configuración sin ejecutar un DGS, desde tu directorio principal, copia una entrada del registro de muestra en un registro de prueba:

    mkdir -p LinuxServer/UnrealTournament/Saved/Logs
    export ENV='testenv' VER='testver' PORT='testport'
    echo "testlogger:debug: Test log line at `date` from ${HOSTNAME}" >>
    LinuxServer/UnrealTournament/Saved/Logs/${ENV}.${VER}.${PORT}.log 

La línea testlogger debería aparecer con la mayor brevedad en el visor de registros.

Verifica la entrega del registro

Para confirmar que el registro se entregó a Cloud Logging, sigue estos pasos:

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

    Ir a la página Visor de registros

    En la lista de registros, hay una entrada etiquetada con el nombre de registro que creaste (en este caso, PATH.testenv.testver.testid).

  2. Para ver el resultado, haz clic en el registro:

    Entrada de registro en la página Visor de registros.

Para obtener más información sobre el registro de gcloud, consulta la documentación de entradas de registro.

Envía registros desde un servidor dedicado de videojuegos

Con la configuración establecida y verificada de manera correcta, puedes usar un comando de DGS de UT para enviar registros a Cloud Logging.

  • En tu terminal, inicia la instancia del DGS y envía el resultado del registro a un archivo con el nombre correcto:

    ~/LinuxServer/Engine/Binaries/Linux/UE4Server-Linux-Shipping UnrealTournament \
    UT-Entry?Game=Lobby \
    -log=${ENV}.${VER}.${PORT}.log 

En este ejemplo, la capa de aprovisionamiento propaga las variables de entorno (ENV, VER y DGSID) que se usan para generar el nombre del registro, de acuerdo con la sección Nombra tus archivos de registro.

Accede directamente a la API desde aplicaciones y flujos de trabajo

La mayoría de las canalizaciones de implementación del DGS usan algún tipo de lenguaje de programación para realizar tareas programáticas como la preparación de recursos, las compilaciones, la transferencia de datos o la administración de instancias. Puedes registrar los resultados de estas tareas en Cloud Logging mediante el uso de una biblioteca cliente. En este instructivo, se usa Python porque es muy popular en la industria de juegos.

Puedes enviar registros a Cloud Logging desde estaciones de trabajo locales y basadas en la nube mediante la API de Cloud Logging. Cuando transmites registros de esta forma, no necesitas instalar el agente de Logging, ya que te comunicas con Cloud Logging a través de la API de Python.

Escribe un registro en Cloud Logging mediante la biblioteca de Python

Para realizar un registro desde una secuencia de comandos de Python en Cloud Logging, debes hacer lo siguiente:

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

Para escribir un registro en Cloud Logging, haz lo siguiente:

  1. Descarga la secuencia de comandos de Python desde GitHub para que realice las siguientes tareas:

    • Comprueba que se usen las convenciones de nombres adecuadas.
    • Recopila los datos de registro.
    • Escribe el registro en el nivel de los recursos del proyecto de Cloud.
  2. Si realizas el registro desde una estación de trabajo o un servidor local, debes autenticarte antes de acceder a Cloud Logging. Si accedes desde una instancia en la nube, la autenticación ya se realizó y puedes omitir este paso.

    #!/usr/bin/env python
    
    from google.cloud import logging
    from google.cloud.logging.resource import Resource
    import getpass
    import os
    import socket
    
    def write(text, severity='INFO', env=None, port=None, ver=None, **kwargs):
        '''Wrapper method for assembling the payload to send to logger.log_text.'''
    
        # Extract and build log id from environment.
        # For example: 'prod.0112.8001'
        if not env:
            env = os.getenv('ENV')
        if not port:
            port = os.getenv('port')
        if not ver:
            ver = os.getenv('VER')
    
        if not env or not port or not ver:
            raise Exception('One or more log name tokens are empty. Unable to log.')
        # end if
    
        # Assemble logger name.
        logger_name = '.'.join([
            env,
            port,
            ver
        ])
    
        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 = {
            "username" : getpass.getuser(),
            "hostname" : socket.gethostname(),
            "env" : env,
            "ver" : ver,
            "port" : port
        }
    
        # 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
    
  3. 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.', env='qa', ver='0117', port='8000')
    
  4. Para ver los registros, en Cloud Console, ve a la página Visor de registros.

    Ir a la página Visor de registros

    De forma predeterminada, todos los registros escriben en el recurso project.

Enruta registros

Si deseas conservar tus registros después de los períodos de retención de registros, debes enrutarlos mediante uno de los siguientes métodos:

  • Para realizarles un análisis de macrodatos, expórtalos a un conjunto de datos de BigQuery.
  • A fin de obtener un almacenamiento económico a largo plazo, exporta tus registros a los depósitos de Google Cloud Storage.

En cualquier caso, primero creas un objeto llamado receptor. El receptor te permite crear un filtro que selecciona las entradas de registro que deseas enrutar y la opción de elegir Cloud Storage o BigQuery como destino. Cuando creas un receptor, los registros que seleccionas se exportan al destino que elijas.

También puedes enrutar registros en el visor de registros mediante la API de Cloud Logging o directamente con la herramienta de línea de comandos gcloud logging.

Exporta a BigQuery

Puedes consultar los registros almacenados en BigQuery con semántica de SQL. Muchas herramientas de estadísticas de terceros están integradas en BigQuery.

Para exportar registros a BigQuery, sigue estos pasos:

  1. Crea un conjunto de datos de BigQuery y el receptor con un filtro para exportar registros a esa tabla.

       gcloud beta logging sinks create dgs-errors-bq  \
        bigquery.googleapis.com/projects/PROJECT_ID/datasets/DATASET \
        --log-filter "jsonPayload.environment=dev AND \
        jsonPayload.version=0112 AND severity>=WARNING"
    

    Reemplaza lo siguiente:

    • PROJECT_ID: Es tu proyecto de Cloud.
    • DATASET: Es tu nuevo conjunto de datos de BigQuery
  2. Agrega el nombre de la cuenta de servicio a tu conjunto de datos de BigQuery.

    El siguiente registro enviado a Cloud Logging que coincida con este filtro se exportará al conjunto de datos, después de una leve demora. Para obtener más información, consulta la documentación sobre cómo funcionan los receptores.

Exporta a Cloud Storage

Para guardar tus registros en un archivo, debes exportarlos a un bucket de Cloud Storage. Para los depósitos de Cloud Storage, puedes seleccionar una clase de almacenamiento con precios más bajos correspondiente a los archivos a los que accedes con menor frecuencia 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 Google Cloud.

Para exportar registros a Cloud Storage, sigue estos pasos:

  1. Crea un bucket de Cloud Storage y un receptor con un filtro en Cloud Logging para exportar esos registros a Cloud Storage:

    gcloud beta \
       logging sinks create dgs-errors-gcs \
       storage.googleapis.com/BUCKET_NAME \
       --log-filter "jsonPayload.environment=dev AND \
       jsonPayload.version=0112 AND severity>=WARNING"
    

    Reemplaza BUCKET-NAME por un nombre único para el bucket de Cloud Storage.

  2. Agrega el nombre de la cuenta de servicio a tu bucket de Cloud Storage.

    El siguiente registro enviado a Cloud Logging que coincida con este filtro se exportará a un archivo en el bucket, después de una leve demora. Para obtener más información, consulta 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 Cloud Console, 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 Cloud Console, 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, 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 Cloud Console, ve a la página Navegador de Cloud Storage.

    Ir al navegador

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

Próximos pasos

  • Explora arquitecturas de referencia, diagramas, instructivos y prácticas recomendadas sobre Google Cloud. Consulta nuestro Cloud Architecture Center.