Estructuración de datos no estructurados con GROK
Si utilizas El Stack de Elastic (ELK) y estás interesado en mapear registros de usuario de Logstash con Elasticsearch, entonces esta publicación es para ti.

El stack ELK es un acrónimo para tres proyectos de código abierto: Elasticsearch, Logstash y Kibana. Juntos forman una plataforma de gestión de registros.
- Elasticsearch – es un sistema de búsqueda y análisis.
- Logstash – es un canal de procesamiento de datos del lado del servidor que recibe datos de múltiples fuentes simultáneamente, los transforma y luego los envía a un 'depósito', como Elasticsearch.
- Kibana permite a los usuarios visualizar datos mediante gráficos y tablas en Elasticsearch.
Beats apareció más tarde y es un ligero transportador de datos. La introducción de Beats transformó el Elk Stack en Elastic Stack, pero eso no es lo principal.
Este artículo se centra en Grok, que es una función en Logstash que puede convertir tus registros antes de que sean enviados al depósito. Para nuestros propósitos, solo hablaré sobre el procesamiento de datos de Logstash a Elasticsearch.

Grok es un filtro dentro de Logstash que se utiliza para analizar datos no estructurados en algo estructurado y que puede ser consultado. Se encuentra por encima de las expresiones regulares (regex) y utiliza patrones de texto para hacer coincidir líneas en archivos de registro.
Como veremos en las siguientes secciones, el uso de Grok es muy importante cuando se trata de gestionar registros de manera efectiva.
Sin Grok, tus datos de registro están no estructurados.

Sin Grok, cuando los registros se envían desde Logstash a Elasticsearch y se visualizan en Kibana, solo aparecen en el valor del mensaje.
Solicitar información significativa en esta situación es complicado, ya que todos los datos de los registros se almacenan en una sola clave. Sería mejor si los mensajes de los registros estuvieran organizados de manera más eficaz.
Datos no estructurados de registros
localhost GET /v2/applink/5c2f4bb3e9fda1234edc64d 400 46ms 5bc6e716b5d6cb35fc9687c0Si miras detenidamente los datos sin procesar, verás que en realidad están compuestos de diferentes partes, cada una de las cuales está separada por un espacio.
Para los desarrolladores más experimentados, probablemente puedan adivinar lo que significa cada una de las partes y que este es un mensaje de registro de una llamada a la API. La representación de cada elemento se detalla a continuación.
Vista estructurada de nuestros datos
- localhost == entorno
- GET == método
- /v2/applink/5c2f4bb3e9fda1234edc64d == url
- 400 == estado_respuesta
- 46ms == tiempo_respuesta
- 5bc6e716b5d6cb35fc9687c0 == id_usuario
Como podemos ver en los datos estructurados, existe un orden para los registros no estructurados. El siguiente paso es el procesamiento programático de los datos en bruto. Aquí es donde Grok brilla.
Plantillas Grok
Plantillas Grok integradas
Logstash viene con más de 100 plantillas integradas para estructurar datos no estructurados. Definitivamente debes aprovechar esta ventaja cuando sea posible para registros del sistema común, como apache, linux, haproxy, aws, y así sucesivamente.
Sin embargo, ¿qué sucede cuando tienes registros personalizados, como en el ejemplo anterior? Debes construir tu propia plantilla Grok.
Plantillas Grok personalizadas
Necesitas experimentar para construir tu propia plantilla Grok. Utilicé y .
Ten en cuenta que la sintaxis de las plantillas Grok es la siguiente: %{SYNTAX:SEMANTIC}
Lo primero que intenté hacer fue ir a la pestaña Descubrir en el depurador de Grok. Pensé que sería genial si esta herramienta pudiera generar automáticamente una plantilla Grok, pero no fue muy útil, ya que solo encontró dos coincidencias.

Usando este descubrimiento, comencé a crear mi propia plantilla en el depurador de Grok, utilizando la sintaxis encontrada en la página de Github de Elastic.

Jugando con diferentes sintaxis, finalmente pude estructurar los datos del registro como quería.

Enlace al depurador de Grok
Texto original:
localhost GET /v2/applink/5c2f4bb3e9fda1234edc64d 400 46ms 5bc6e716b5d6cb35fc9687c0Patrón:
%{WORD:entorno} %{WORD:método} %{URIPATH:url} %{NUMBER:estado_respuesta} %{WORD:tiempo_respuesta} %{USERNAME:id_usuario}Esto es lo que resultó al final
{
"entorno": [
[
"localhost"
]
],
"método": [
[
"GET"
]
],
"url": [
[
"/v2/applink/5c2f4bb3e9fda1234edc64d"
]
],
"estado_respuesta": [
[
"400"
]
],
"BASE10NUM": [
[
"400"
]
],
"tiempo_respuesta": [
[
"46ms"
]
],
"id_usuario": [
[
"5bc6e716b5d6cb35fc9687c0"
]
]
}Teniendo en mano la plantilla Grok y los datos mapeados, el último paso es agregarlo a Logstash.
Actualizar el archivo de configuración Logstash.conf
En el servidor donde has instalado el stack ELK, dirígete a la configuración de Logstash:
sudo vi /etc/logstash/conf.d/logstash.confInserte los cambios.
input {
file {
path => "/your_logs/*.log"
}
}
filter{
grok {
match => { "message" => "%{WORD:environment} %{WORD:method} %{URIPATH:url} %{NUMBER:response_status} %{WORD:response_time} %{USERNAME:user_id}"}
}
}
output {
elasticsearch {
hosts => [ "localhost:9200" ]
}
}Después de guardar los cambios, reinicie Logstash y verifique su estado para asegurarse de que siga funcionando.
sudo service logstash restart
sudo service logstash statusFinalmente, para asegurarse de que los cambios surtan efecto, asegúrese de actualizar el índice de Elasticsearch para Logstash en Kibana.

¡Con Grok, sus datos de registros están estructurados!

Como podemos ver en la imagen anterior, Grok puede asignar automáticamente los datos de registro a Elasticsearch. Esto facilita la gestión de registros y la rápida consulta de información. En lugar de buscar en los archivos de registro para depurar, puede simplemente filtrar lo que está buscando, como el entorno o la URL.
¡Intente darle una oportunidad a las expresiones de Grok! Si tiene otra forma de hacerlo o si tiene problemas con los ejemplos anteriores, simplemente deje un comentario abajo para hacérmelo saber.
Gracias por leer — y, por favor, sígame aquí en Medium para más artículos interesantes sobre ingeniería de software.
Recursos
P.D
Canal de Telegram sobre
Fuente: habr.com
