Analiza registros en tiempo real con Fluentd y BigQuery

En este instructivo, se muestra cómo registrar el tráfico del navegador y analizarlo en tiempo real. Esto es útil cuando tienes una cantidad significativa de registros de varias fuentes y deseas depurar problemas o generar estadísticas actualizadas de los registros.

El instructivo describe cómo enviar información de registro generada por un servidor web NGINX a BigQuery mediante Fluentd, y luego usar BigQuery para analizar la información de registro. Se supone que tienes conocimientos básicos de Google Cloud Platform (GCP), las líneas de comandos de Linux, la recopilación de registros de aplicaciones y el análisis de registros.

Introducción

Los registros son una herramienta poderosa para ver cómo funcionan las aplicaciones y los sistemas a gran escala. Sin embargo, con el aumento de la escala y la complejidad de esos sistemas, la administración de diversos registros que se encuentran distribuidos en una flota de recursos de procesamiento se convirtió en un desafío.

Fluentd es un colector de registros de código abierto popular que apunta a unificar la recopilación de registros de muchas fuentes de datos y sistemas en una capa de registro unificada. Debido a que es difícil saber de antemano qué datos podrían ser útiles para analizar, un enfoque común es registrar todos los datos y clasificarlos más tarde. Sin embargo, recopilar y almacenar todos estos datos puede ser una tarea difícil de manejar, lo que hace que sea lento y difícil obtener las respuestas que buscas.

Es aquí donde las fortalezas de BigQuery se vuelven útiles para las estadísticas de registro. BigQuery es el motor analítico y almacén de datos en la nube completamente administrado y altamente escalable de Google. Puede realizar consultas en terabytes de registros en decenas de segundos. Este rendimiento te permite obtener rápidamente las respuestas que necesitas para corregir o mejorar tus sistemas.

De forma predeterminada, puedes transmitir 100,000 filas de datos de registros por segundo en BigQuery, y puedes incrementar este límite mediante una solicitud de cuota adicional.

Fluentd tiene un complemento de salida que puede usar BigQuery como destino para almacenar los registros recopilados. El complemento te permite cargar registros directamente en BigQuery casi en tiempo real desde muchos servidores. Por lo tanto, puedes visualizar estos datos de modo sencillo mediante la creación de un panel que se actualiza frecuentemente en Hojas de cálculo de Google o Google Data Studio.

Objetivos

  • Ejecutar un servidor web NGINX en una instancia de Compute Engine
  • Instalar un agente de recopilación de registros de Fluentd
  • Configurar Fluentd para completar las tareas siguientes:
    • Recopilar registros de tráfico NGINX
    • Reenviar los registros a BigQuery
  • Consultar los mensajes de registro mediante la IU web de BigQuery
  • Ejecutar una consulta de estadísticas de los registros mediante BigQuery

Costos

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

  • Compute Engine
  • BigQuery

Usa la calculadora de precios para generar una estimación de los costos según el uso previsto.

Antes de comenzar

  1. Accede a tu Cuenta de Google.

    Si todavía no tienes una cuenta, regístrate para obtener una nueva.

  2. Selecciona o crea un proyecto de GCP.

    Ir a la página Administrar recursos

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

    Descubre cómo puedes habilitar la facturación

Cuando finalices este instructivo, puedes borrar los recursos creados para evitar que se te siga facturando. Para obtener más detalles, consulta Realiza una limpieza.

Crea una VM de servidor web NGINX

En este instructivo, puedes usar GCP Marketplace para crear una instancia de Compute Engine preconfigurada a fin de ejecutar el servidor web NGINX.

  1. En GCP Console, ve a la página de detalles de Marketplace correspondiente a la imagen Nginx (implementación en un clic de Google).

    Ir a la página de detalles de NGINX

  2. Haz clic en Iniciar en Compute Engine.

  3. Cuando el sistema lo solicite, selecciona el proyecto de GCP que deseas usar.

  4. Espera a que la API requerida se habilite.

  5. Asigna a la implementación el nombre nginx.

  6. Selecciona una zona que esté en una región de EE.UU. o Europa.

  7. En Firewall, en la sección Herramientas de redes, asegúrate de que la opción Permitir tráfico HTTP esté seleccionada.

  8. Lee los términos que se detallan en Condiciones del Servicio.

  9. Si aceptas los términos, haz clic en Implementar.

    La pantalla de detalles de la implementación muestra la creación de una nueva VM en la zona que especificaste, y la instalación del servidor web NGINX.

  10. Espera a que se complete la implementación antes de continuar.

Agrega permisos

La máquina virtual necesita permisos adicionales para escribir en BigQuery. Para modificar los permisos de la VM, primero debes cerrarla.

  1. En GCP Console, ve a la página de instancias de VM de Compute Engine.

    Ir a la página de instancias de VM

    Verás una nueva instancia de VM llamada nginx-vm.

  2. Para abrir la página de detalles de la VM, haz clic en el nombre de la VM.

  3. Haz clic en el botón Detener en la parte superior de la página.

    El cierre de la VM demora solo unos instantes.

  4. Haz clic en Editar en la parte superior de la página.

  5. Desplázate hacia abajo y cambia el acceso a BigQuery por Habilitado.

  6. Haz clic en Guardar en la parte inferior de la página.

  7. Haz clic en Iniciar en la parte superior de la página para reiniciar la VM con los nuevos permisos.

No cierres esta página aún; continuarás trabajando en ella en la sección siguiente.

Instala el conector de Fluentd y BigQuery

En esta sección del instructivo, instalas el colector de registros de Fluentd y el complemento de salida de Fluentd para BigQuery en la VM.

  1. En la página de detalles de la instancia de VM, haz clic en el botón SSH para abrir una conexión con la instancia.
  2. En la ventana del shell de la VM, verifica la versión de Debian:

    lsb_release -rdc
    

    El resultado muestra la versión de Debian que se ejecuta en la VM y su nombre interno:

    Description:    Debian GNU/Linux 9.6 (stretch)
    Release:        9.6
    Codename:       stretch
    
  3. Ve a la página de descarga de Fluentd para Debian y busca la línea de comandos de instalación correspondiente a la versión del nombre interno de Debian.

    Por ejemplo, para Debian Stretch, encontrarás el comando siguiente:

    curl -L
       https://toolbelt.treasuredata.com/sh/install-debian-stretch-td-agent3.sh
       | sh
    
  4. Copia el comando en la ventana del shell de tu VM.

    Este comando instala el paquete td-agent en tu VM. El paquete contiene la distribución de Fluentd.

  5. Instala el complemento Fluentd-to-BigQuery:

    sudo /usr/sbin/td-agent-gem install fluent-plugin-bigquery
    

Crea un conjunto de datos y una tabla de BigQuery como un destino de registros

Fluentd usa complementos de entrada para recopilar registros generados por otras aplicaciones y servicios. Analiza estos datos en registros JSON estructurados, que luego se reenvían a cualquier complemento de salida configurado.

El analizador de registros de acceso de Fluentd NGINX lee los archivos access.log de NGINX. En la siguiente lista, se muestra un ejemplo de registro con campos y ejemplos de valores.

time: 1362020400
record:
{
  "remote"              : "127.0.0.1",
  "host"                : "192.168.0.1",
  "user"                : "-",
  "method"              : "GET",
  "path"                : "/",
  "code"                : "200",
  "size"                : "777",
  "referer"             : "-",
  "agent"               : "Opera/12.0",
  "http_x_forwarded_for": "-"
}

Cuando creas una tabla de destino de registros en BigQuery, los nombres de columna deben coincidir exactamente con los nombres de campo en el registro. En el procedimiento siguiente, asegúrate de usar los nombres que se sugieren a fin de que los nombres de las columnas de la tabla sean correctos para más adelante.

  1. Abre la IU web de BigQuery:

    Ir a la IU web de BigQuery

  2. En el panel de navegación, en Recursos, haz clic en el nombre de tu proyecto.

  3. En el panel de detalles que está debajo del Editor de consultas, haz clic en Crear conjunto de datos.

  4. En ID de conjunto de datos, ingresa fluentd.

  5. En Ubicación de los datos, selecciona la ubicación multirregional (EE.UU. o Europa) en la que creaste la instancia de NGINX.

  6. Haz clic en Crear conjunto de datos.

  7. En el panel de navegación, en Recursos, haz clic en el conjunto de datos fluentd.

  8. En el panel de detalles que está debajo del Editor de consultas, haz clic en Crear tabla.

  9. Para el nombre de la tabla, ingresa nginx_access.

  10. Selecciona la opción Editar como texto.

  11. Copia la definición de columna JSON siguiente en el cuadro de texto.

    [  { "type": "TIMESTAMP", "name": "time" },
       { "type": "STRING",    "name": "remote" },
       { "type": "STRING",    "name": "host" },
       { "type": "STRING",    "name": "user" },
       { "type": "STRING",    "name": "method" },
       { "type": "STRING",    "name": "path" },
       { "type": "STRING",    "name": "code" },
       { "type": "INTEGER",   "name": "size" },
       { "type": "STRING",    "name": "referer" },
       { "type": "STRING",    "name": "agent" },
       { "type": "STRING",    "name": "http_x_forwarded_for" } ]
    

    Observa que los nombres de columna coinciden exactamente con los nombres de campo del registro de Fluentd. El valor de columna time se agrega al registro mediante la conversión de la marca de tiempo del registro en una string de marca de tiempo compatible con BigQuery.

  12. En la lista Partición, selecciona Particionar por campo: tiempo.

    Las tablas particionadas dividen las tablas grandes en segmentos más pequeños para mejorar el rendimiento de las consultas y controlan los costos mediante la reducción de la cantidad de datos que lee una consulta. Para obtener más información, consulta Introducción a las tablas de partición en la documentación de BigQuery.

  13. Haz clic en Crear tabla en la parte inferior de la página.

    La tabla fluentd.nginx_access de BigQuery ya está disponible para recibir los registros.

  14. Para ver los detalles de la tabla, en Recursos > Detalles, haz clic en el nombre de la tabla.

    Los detalles te permiten ver información como la cantidad de filas y el almacenamiento que usa la tabla.

Configura una colección de registros y reenvíala a BigQuery

El archivo de configuración de Fluentd /etc/td-agent/td-agent.conf define las fuentes de las que se recopilan los datos de registro, las salidas para los registros recopilados y los filtros. También te permite aplicar etiquetas a los registros recopilados para definir cómo se procesan y a qué complemento de salida se deben enviar.

En el procedimiento siguiente, configuras Fluentd para que complete las tareas que se detallan a continuación:

Para configurar la recopilación y el reenvío de registros, haz lo siguiente:

  1. Usa SSH para conectarte a la VM en la que está instalado NGINX.
  2. En la ventana del shell, abre un editor de texto como un usuario raíz (por ejemplo, abre Vim o Nano) y edita el archivo de configuración de agente de Fluentd /etc/td-agent/td-agent.conf. Por ejemplo, usa el comando siguiente para abrir el archivo en Vim:

    sudo vim /etc/td-agent/td-agent.conf
    
  3. En la parte inferior del archivo, agrega las líneas siguientes para configurar el complemento de entrada de cola a fin de que lea los registros de NGINX, los analice con el analizador de NGINX y los etiquete con nginx.access:

    <source>
      @type tail
      @id input_tail
      <parse>
        @type nginx
      </parse>
      path /var/log/nginx/access.log
      pos_file /var/log/td-agent/httpd-access.log.pos
      tag nginx.access
    </source>
    
  4. Agrega las líneas siguientes para configurar el complemento de salida de BigQuery. Reemplaza [MY_PROJECT_NAME] por el nombre de tu proyecto de GCP.

    <match nginx.access>
      @type bigquery_insert
    
      # Authenticate with BigQuery using the VM's service account.
      auth_method compute_engine
      project [MY_PROJECT_NAME]
      dataset fluentd
      table nginx_access
      fetch_schema true
    
      <inject>
        # Convert fluentd timestamp into TIMESTAMP string
        time_key time
        time_type string
        time_format %Y-%m-%dT%H:%M:%S.%NZ
      </inject>
    </match>
    

    Esto configura Fluentd para que realice las tareas siguientes:

    • En cada entrada de registro con la etiqueta nginx.access, Fluentd debe usar el complemento bigquery_insert para escribir el registro en la tabla de BigQuery.
    • La autenticación se lleva a cabo mediante la cuenta de servicio de la VM.
    • La marca de tiempo original se agrega al registro como una string con un formato que BigQuery puede convertir en una marca de tiempo.
  5. Guarda el archivo y cierra el editor.

  6. Reinicia el agente de Fluentd para aplicar la nueva configuración.

    sudo systemctl restart td-agent
    

Si deseas obtener más información sobre los parámetros de este archivo de configuración, incluidos los métodos alternativos de autenticación, consulta el sitio del complemento de Fluentd para BigQuery y la documentación del complemento de Fluentd.

Visualiza registros en BigQuery

Ahora que ya configuraste Fluentd, puedes generar algunos datos de registro de NGINX y verlos con BigQuery.

  1. En GCP Console, ve a la página de instancias de VM de Compute Engine.

    Ir a la página de instancias de VM

  2. Copia la dirección IP externa de la instancia de VM nginx-vm.

  3. En otra pestaña del navegador, pega la dirección IP en el cuadro de dirección.

    Verás la página predeterminada ¡Bienvenido a nginx!

  4. En GCP Console, ve a la página de BigQuery.

  5. Copia esta consulta en el panel Editor de consultas y haz clic en Ejecutar:

    SELECT * FROM `fluentd.nginx_access`
    

    En el panel Resultados de la consulta verás una fila que muestra el registro de acceso de tu navegador. Dado que a tu VM se puede acceder desde Internet, es posible que veas filas de registro de acceso de otros hosts remotos.

Simula una carga y calcula estadísticas de los registros

En esta sección, ejecutas cargas de muestra y, luego, visualizas las métricas para esas cargas con BigQuery. Estos pasos te demuestran que BigQuery se puede usar, no solo para leer los registros, sino también para ejecutar análisis en ellos.

  1. En GCP Console, inicia Cloud Shell.
  2. Instala la herramienta comparativa y las herramientas relacionadas del servidor web ApacheBench (ab):

     sudo apt install -y apache2-utils
    
  3. En Cloud Shell, genera una carga de prueba para ejecutar en el servidor de NGINX. Reemplaza [IP_ADDRESS] por la dirección IP de tu VM.

    ab -t 20 -c 1 http://[IP_ADDRESS]/
    

    Este comando usa la herramienta ApacheBench para generar 20 segundos de carga en tu servidor de NGINX.

  4. En GCP Console, ve a la página de BigQuery.

    Ir a la página de BigQuery

  5. En el panel Editor de consultas, usa la consulta siguiente para obtener una lista de solicitudes de ApacheBench:

    SELECT * FROM `fluentd.nginx_access` limit 100
    
  6. Ejecuta el comando de SQL siguiente a fin de calcular la cantidad de solicitudes de cada código de respuesta para cada segundo.

    SELECT
      time_sec, code, COUNT(*) as count
    FROM (
      SELECT
        TIMESTAMP_TRUNC(time, SECOND)AS time_sec, code
      FROM
        `fluentd.nginx_access`)
    GROUP BY
      time_sec, code
    ORDER BY
      time_sec DESC
    

    Los valores para cada segundo deberían ser aproximadamente iguales a la línea Solicitudes por segundo en la salida de ApacheBench que viste antes.

Opcional: Usa la carga por lotes para los registros de gran volumen

Tal como se mencionó, las inserciones de transmisión de BigQuery (como se usan en este instructivo) permiten que los datos estén disponibles para consultas en el término de unos pocos segundos. Este método tiene un pequeño cargo, y se aplican límites al tamaño y la frecuencia de las inserciones.

Para los grandes volúmenes de registros, es posible que desees usar la carga por lotes de BigQuery. Tal como lo sugiere el nombre, esta característica carga los datos mediante un trabajo por lotes de baja prioridad. Con este trabajo por lotes, los datos tardan más en cargarse y en estar disponibles que con las inserciones de transmisión. No obstante, la carga por lotes no tiene cargo.

Al igual que con las inserciones de transmisión, existen límites para la frecuencia de los trabajos de carga por lotes y, lo más importante, se admiten 1,000 trabajos de carga por tabla por día, y 50,000 trabajos de carga por proyecto por día.

Para implementar la carga por lotes, debes usar el complemento bigquery_load de Fluentd. Este complemento emplea un búfer de Fluentd para recopilar un conjunto de registros en archivos hasta un límite especificado de tiempo o tamaño antes de enviarlos como un lote a BigQuery.

Para usar la carga por lotes, sigue estos pasos:

  1. Edita el archivo de configuración de Fluentd /etc/td-agent/td-agent.conf como un usuario raíz.
  2. Reemplaza la configuración del complemento de salida de BigQuery que especificaste anteriormente por las líneas siguientes. Reemplaza [MY_PROJECT_NAME] por el nombre de tu proyecto de GCP.

    <match nginx.access>
      @type bigquery_load
    
      <buffer>
        @type file
        path /var/log/bigquery_nginx_access.*.buffer
        flush_at_shutdown true
        timekey_use_utc
        total_limit_size 1g
        flush_interval 3600
      </buffer>
    
      # Authenticate with BigQuery using the VM's service account.
      auth_method compute_engine
      project [MY_PROJECT_NAME]
      dataset fluentd
      table nginx_access
      fetch_schema true
    
      <inject>
        # Convert fluentd timestamp into TIMESTAMP string
        time_key time
        time_type string
        time_format %Y-%m-%dT%H:%M:%S.%NZ
      </inject>
    </match>
    

    Esta configuración especifica que el complemento de salida bigquery_load se debe usar en lugar del complemento bigquery_insert.

    En la sección buffer, se especifica que los datos de registro se almacenan en búfer en la VM hasta que se haya recopilado un máximo de 1 GB de registros o hasta que haya transcurrido una hora. A continuación, los datos almacenados en búfer se cargan en BigQuery. Para obtener más información sobre los parámetros de configuración, consulta la documentación del complemento.

Soluciona problemas

Si en algún momento sospechas que el agente no recopila ni entrega registros, ejecuta el siguiente comando en la ventana del shell de la VM de Fluentd para verificar su estado:

sudo systemctl status td-agent

La salida muestra el estado activo del servicio, y las últimas líneas de registro del servicio:

Active: active (running) since [DATE]

Si el agente no se inicia, la causa más probable es un error en el archivo de configuración de Fluentd. Esto se informa en el archivo de registro de Fluentd, que puedes ver mediante el siguiente comando en la ventana del shell de la VM:

sudo less /var/log/td-agent/td-agent.log

Por ejemplo, la siguiente salida muestra un error cuando el nombre de un complemento no es correcto:

[info]: parsing config file is succeeded path="/etc/td-agent/td-agent.conf"
[error]: config error file="/etc/td-agent/td-agent.conf" error_class=Fluent::ConfigError error="Unknown output plugin 'bad_plugin'. Run 'gem search -rd fluent-plugin' to find plugins"

Realiza una 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:

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

    Ir a la página Proyectos

  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.

Pasos siguientes

¿Te ha resultado útil esta página? Enviar comentarios:

Enviar comentarios sobre...