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.

En el instructivo, se describe cómo enviar la información de registro generada por un servidor web NGINX a BigQuery mediante Fluentd y, luego, usar BigQuery para analizar esa información. Se supone que tienes conocimientos básicos de Google Cloud, 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 popular colector de registros de código abierto 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 con rapidez las respuestas que necesitas para corregir o mejorar tus sistemas.

De forma predeterminada, puedes transmitir 100,000 filas de datos de registros por segundo a 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 realizar las siguientes tareas:
    • 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, que incluyen 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. 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

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

    Descubre cómo puedes habilitar la facturación

Cuando completes el instructivo puedes borrar los recursos que hayas creado para evitar que se te sigan facturando. Para obtener más detalles, consulta Realiza una limpieza.

Crea una VM de servidor web NGINX

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

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

    Ir a la página de detalles de NGINX

  2. Haz clic en Iniciar.

  3. Si se te solicita, selecciona el proyecto de Google Cloud que deseas usar.

  4. Espera a que las API necesarias se habiliten.

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

  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 Cloud Console, ve a la página Instancias de VM de Compute Engine:

    Ir a la página Instancias de VM

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

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

  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 de shell de la VM.

    Con este comando, se instala el paquete td-agent en la 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 NGINX de Fluentd 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 del 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 la 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 de BigQuery llamada fluentd.nginx_access ahora está disponible para recibir 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, los resultados de 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 siguiente procedimiento, debes configurar Fluentd para que realice estas tareas:

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 de shell, abre un editor de texto como un usuario raíz (por ejemplo, abre Vim o Nano) y edita el archivo de configuración /etc/td-agent/td-agent.conf del agente de Fluentd. Por ejemplo, usa el siguiente comando para abrir el archivo en Vim:

    sudo vim /etc/td-agent/td-agent.conf
    
  3. En la parte inferior del archivo, agrega las siguientes líneas a fin de configurar el complemento de entrada de cola para leer los registros de NGINX, analizarlos con el analizador de NGINX y etiquetarlos 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 siguientes líneas para configurar el complemento de salida de BigQuery. Reemplaza [MY_PROJECT_NAME] por el nombre del proyecto de Google Cloud.

    <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 siguientes tareas:

    • Para cada entrada de registro con la etiqueta nginx.access, Fluentd debe usar el complemento bigquery_insert a fin de 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 estos parámetros del 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 Cloud Console, ve a la página Instancias de VM de Compute Engine:

    Ir a la página 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 de bienvenida predeterminada de nginx.

  4. En Cloud 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 se puede acceder a la VM 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 para leer los registros y, también, ejecutar análisis en ellos.

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

     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 Cloud 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, usa el complemento bigquery_load de Fluentd. Este complemento usa un búfer de Fluentd para recopilar un conjunto de registros en archivos hasta un límite especificado de tiempo o de 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 /etc/td-agent/td-agent.conf de Fluentd como usuario raíz.
  2. Reemplaza la configuración del complemento de salida de BigQuery que especificaste antes por las siguientes líneas. Reemplaza [MY_PROJECT_NAME] por el nombre del proyecto de Google Cloud.

    <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 se debe usar el complemento de salida bigquery_load 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 recopile 1 GB de registros o hasta que transcurra una hora. Luego, 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 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.

Próximos pasos