Social

Introducción

Con el objetivo de recibir notificaciones dependiendo de que eventos sucedieran y se registraran en ElasticSearch, he hecho una prueba de con la herramienta ElastAlert, que puede ser muy potente gracias a la facilidad de configuración de las reglas. El repositorio es el siguiente:

https://github.com/Yelp/elastalert

Esta se conecta con ElasticSearch a través de la API y consulta los indices que le indiquemos en las reglas, para comprobar determinados comportamientos, como frecuencia de repetición, logs concretos, etc.

Para hacer la prueba, se puede lanzar ElastAlert dockerizado en cualquier equipo que tenga acceso a la API de tu Elasticsearch.

Configuración

Lo primero que necesitamos, es descargar el repositorio del proyecto (no es el mismo que el anterior, este está listo para dockerizar):

git clone https://github.com/bitsensor/elastalert.git

Una vez lo tengamos descargado, podemos configurar las opciones principales en el fichero config/elastalert.yml:

es_host: ELASTICSEARCH_URL

es_port: ELASTICSEARCH_PORT

rules_folder: rules

run_every:
seconds: 5

buffer_time:
minutes: 1

use_ssl: True

verify_certs: True

ca_certs: /opt/elastalert/cacert.pem

es_send_get_body_as: GET

es_username: admin
es_password: N******3

writeback_index: elastalert_status

alert_time_limit:
days: 2

Es importante que desde el host pueda llegar al cluster de ELK por el puerto indicado, y si es necesaria la conexión por HTTPS, tener el certificado. La ruta del certificado es la de dentro del contenedor, que montaremos como volumen en el siguiente paso.

Configurar reglas

Las reglas se definen en ficheros yaml dentro del directorio rules. Por defecto las cargará todas.

Nosotros vamos a configurar una regla simple para que compruebe en un indice concreto (ejemplo-*) si dentro del campo mensaje (msg.message) si hace match con un string en concreto: “Error”.

En el apartado de include, indicaremos todos los campos que necesitamos para mostrarlos como titulo en la alerta, o como parte del propio mensaje.

También definiremos el método para enviar la notificación de alerta (alert), en este caso, un Webhook de MSTeams, pero puede ser cualquier otro, como email, Jira, slack, etc. Puedes ver las diferentes alertas aquí: https://elastalert.readthedocs.io/en/latest/ruletypes.html#alerts

Quedaría así:

name: Alert on any error

index: ejemplo-*
timestamp_field: "@timestamp"

type: any

filter:
- query:
query_string:
query: "ERROR"

include:
- msg.message
- agent.hostname
- fields.Component


match_enhancements:
- "elastalert_modules.bitsensor_enhancement.AlertTextEnhancement"
run_enhancements_first: true


alert_subject: "Found error on {}"
alert_subject_args:
- fields.Component

alert_text_type: alert_text_only
alert_text: "Found error in: {}"
alert_text_args:
- msg.message

alert:
- ms_teams

ms_teams_webhook_url: "https://xxx.webhook.office.com/webhookb2/*********"
ms_teams_alert_summary: "Error message"

alert_text_type: alert_text_only

Puedes encontrar como configurar reglas aquí. https://elastalert.readthedocs.io/en/latest/ruletypes.html#

Ejecutar contenedor Docker

Ahora ejecutaremos el contenedor de Docker, montando como volumen los directorios con las reglas y la configuración, sin olvidar del certificado. Es importante que lo lancemos desde dentro del directorio (o modifiquemos el comando).

Para la prueba que hemos hecho, debido a la versión de ElasticSearch, solo podemos utilizar la versión 3.0.0-beta0 como máximo, ya que la ultima no es compatible, pero en cada caso puede ser distinto. Puedes ver en los tags las versiones compatibles.

Así crearíamos el contenedor:

docker run -d -p 3030:3030 -v `pwd`/config/elastalert.yaml:/opt/elastalert/config.yaml -v `pwd`/config/config.json:/opt/elastalert-server/config/config.json -v `pwd`/rules:/opt/elastalert/rules -v `pwd`/rule_templates:/opt/elastalert/rule_templates -v `pwd`/cacert.pem:/opt/elastalert/cacert.pem --net="host" --name elastalert bitsensor/elastalert:3.0.0-beta.0

En los logs, podemos ver como arranca el servidor, y utiliza las reglas:

13:10:49.616Z INFO elastalert-server: ProcessController: Starting ElastAlert
13:10:49.616Z INFO elastalert-server: ProcessController: Creating index
13:10:50.579Z INFO elastalert-server:
ProcessController: Elastic Version: 7.10.0
Reading Elastic 6 index mappings:
Reading index mapping 'es_mappings/6/silence.json'
Reading index mapping 'es_mappings/6/elastalert_status.json'
Reading index mapping 'es_mappings/6/elastalert.json'
Reading index mapping 'es_mappings/6/past_elastalert.json'
Reading index mapping 'es_mappings/6/elastalert_error.json'
Index elastalert_status already exists. Skipping index creation.

13:10:50.579Z INFO elastalert-server: ProcessController: Index create exited with code 0
13:10:50.580Z INFO elastalert-server: ProcessController: Starting elastalert with arguments [none]
13:10:50.593Z INFO elastalert-server: ProcessController: Started Elastalert (PID: 38)
13:10:50.594Z INFO elastalert-server: Server: Server listening on port 3030
13:10:50.595Z INFO elastalert-server: Server: Websocket listening on port 3333
13:10:50.596Z INFO elastalert-server: Server: Server started
13:10:51.880Z INFO elastalert-server:
ProcessController: 1 rules loaded


También crea indices del estado (para saber que alertas ha enviado ya y cuales quedan pendientes, por ejemplo) llamados elastalert-*.

Si todo funciona correctamente, ya recibiremos las alertas.

Si te ha gustado, compartelo en tu red social favorita, ¡gracias!


Xavi Gonzalez

Actualmente DevOps Engineer en MotoGP (Dorna Sports). Apasionado de GNU/Linux y del software libre. Me gusta trastear con cualquier gadget, y rodar en moto.

0 comentarios

Deja una respuesta

Marcador de posición del avatar

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*