Tutorial de Logstash: Uso de Logstash para agilizar las notificaciones por correo electrónico

Publicado: 2022-03-11

Las aplicaciones que usan correos electrónicos como mecanismo principal para informar errores y excepciones siempre parecen una buena idea al principio. Como desarrolladores de Java, pensamos: "Oye, ¡sabré de inmediato cuando algo salga mal!"

Sin embargo, en algún momento se dará cuenta de que los correos electrónicos de error se le están escapando y necesita limpiar su bandeja de entrada de correo electrónico. Puede ignorar los 404 (la mayor parte del tiempo) y puede ser bueno recibir notificaciones de nuevos registros, pero al final del día puede volverse demasiado agitado o consumir mucho tiempo.

Tarde o temprano, distinguir los correos electrónicos "procesables" de las notificaciones sin sentido se vuelve difícil. Puede configurar reglas y filtros en su correo, pero incluso estos pueden volverse inmanejables.

tutorial de logstash

Este tutorial de Java analizará la posibilidad de usar Logstash para recuperar el control y limpiar su bandeja de entrada de correo electrónico y hacer que sus correos electrónicos de error sean manejables nuevamente, todo sin cambiar nada en su aplicación.

Configuración y entrada de Logstash

El primer paso en nuestro tutorial de Logstash es asegurarse de que todo el correo electrónico que recibe de su sistema vaya a una carpeta. Dado que estamos sacando toda la clasificación y administración de su bandeja de entrada, ya no importará que sea una carpeta grande. Continúe y elimine todas las carpetas y filtros que ya ha configurado, y redúzcalo a una carpeta y un filtro.

Mueva todos los correos electrónicos de "[email protected]" a la carpeta "MyAwesomeAppEmails". Si tiene un buzón separado para estos correos electrónicos, será aún más fácil.

Ahora podemos configurar Logstash para sondear esa carpeta y analizar los correos usando el complemento IMAP. La versión 1.4.2 solo admite la extracción de correos electrónicos de la bandeja de entrada, pero hay una solución relativamente simple que se aplicó en la versión 1.5 para permitir el sondeo de una carpeta específica. Si no tiene un buzón de correo separado, aplique el parche al complemento IMAP en su instancia de Logstash antes de continuar.

 # /etc/logstash/conf.d/01-imap-input.conf input { imap { host => "imap.yourmailserver.com" user => "username" password => "password" secure => true fetch_count => 15 folder => "MyAwesomeAppEmails" # This line will only work if you apply the above mentioned patch } }

Esto comenzará a revisar los nuevos correos electrónicos y a analizarlos en eventos de Logstash.

eventos logstash

Filtro Logstash

Se analiza una gran cantidad de datos útiles de los correos electrónicos en diferentes propiedades de eventos; observe que la marca de tiempo del correo electrónico se usa como "@marca de tiempo" para el evento. Aún más, solo desde los encabezados podemos hacer cosas como identificar el host desde el que se originó el error:

 filter { mutate { replace => [ "received", "%{[received][-1]}" ] } grok { match => [ "received", "from %{HOSTNAME:hostname} \(%{HOSTNAME:full_hostname} \[%{IP:ip}\]\)" ] } mutate { remove_field => [ "received" ] } }

Esto, sin embargo, no es suficiente para controlar sus correos electrónicos de error. Necesitamos un poco más, específicamente los siguientes tres pasos que describen:

  • El tipo de error
  • La gravedad del error
  • Cualquier detalle de error incluido en el correo electrónico

Supongamos que colocó el nombre del error, por ejemplo, "Widget Failed", así como la gravedad del error "ERROR" en el asunto del correo electrónico de esta manera: "ERROR: Widget Failed in /var/www/myapp/foobar .php 20”.

Usaremos esto para establecer varias propiedades del evento:

 filter { grok { match => [ "subject", "%{WORD:severity}: %{DATA:type} in %{PATH:path} %{POSINT:line}" ] } }

Logstash viene con una serie de patrones predefinidos que puede esperar ver en los registros y otros lugares. Úselos para construir sus patrones de Grok y hacerlos más fáciles de leer. Hemos usado "PALABRA" (una sola palabra), "DATOS" (cajón de sastre no codicioso), "RUTA" (una ruta de archivo de Unix o Windows) y "POSINT" (un número entero positivo). También puede usar Grok Debugger para depurar sus patrones de Grok. Los mensajes que no coincidan con el patrón se etiquetarán con la etiqueta "_grokparsefailure".

Eso se ocupa del tipo, la gravedad, el archivo de origen y la línea del error, básicamente todos los metadatos relevantes del evento. Ahora en los detalles.

Ajuste fino de Logstash

Es posible que haya agregado previamente una bonita firma de encabezado o pie de página a su correo electrónico, siendo la persona cortés que es, pero ahora está en el camino. Eliminémoslo del mensaje, así como cualquier espacio en blanco final para que podamos analizar el resto del correo electrónico en busca del error stacktrace:

 filter { mutate { # gsub takes 3 elements per substitution: field, regular expression and substitution gsub => [ "message", "Your Dev Team", "", "message", "More error details:", "" ] } mutate { strip => "message" } # Split the message into an array of lines, each containing a line of the stacktrace mutate { split => [ "message", "\n" ] } }

La mutación "gsub" usa el objeto Ruby Regexp estándar, por lo que todas las opciones y funciones también están disponibles en logstash.

Salida a través de Elasticsearch y Amazon SNS

Apliquemos esto a nuestra instancia de Elasticsearch usando la salida de Logstash Elasticsearch para que podamos buscar y cuantificar fácilmente los datos que recopilamos:

 output { if "_grokparsefailure" not in [tags] { elasticsearch { } } }

Excluimos todos los mensajes que no funcionaron correctamente al buscar la etiqueta "_grokparsefailure". La suposición es que solo los correos electrónicos cuyo asunto coincida con el asunto especificado deben interpretarse como correos electrónicos de error. De lo contrario, es simple y directo.

Logstash viene con una gran cantidad de salidas, así que mejoremos esto aún más usando la salida SNS para notificarnos de errores significativos usando el Servicio de notificación simple (SNS) de Amazon. Supondremos que todos los errores de tipo “notificable” necesitan generar una notificación. Si no está en una instancia EC2, deberá especificar una clave y un secreto de AWS.

 output { if "notifiable" in [tags] { sns { region => "us-east-1" arn => "arn:aws:sns:us-east-1:1234567890123456:mytopic" access_key_id => "AWS ACCESS_KEY" # Only specify these if you're not on an EC2 instance secret_access_key => "AWS ACCESS SECRET" # Only specify these if you're not on an EC2 instance } } }

Etiquetar los errores como "notificables" depende de usted. Puede hacerlo observando la gravedad del error o el tipo de error.

Ahora puede volver a leer los correos electrónicos importantes y puede estar seguro de que no se perderá los correos electrónicos con errores importantes. También puede tomar decisiones informadas sobre qué errores corregir, ya que puede ver con qué frecuencia ocurre un error y cuándo ocurrió por última vez. Buscar un error específico también es más fácil y rápido, gracias a los asombrosos poderes de búsqueda de Elasticsearch descritos en este tutorial de Logstash.