Hola Habr!
Actualmente estoy trabajando en un proyecto de mensajería blockchain con un equipo de mis colegas. A quién le importa: vea los enlaces en el perfil o pregunte en los comentarios.
El desarrollo de blockchain es un campo nuevo y desconocido, por lo que a veces tienes que usar herramientas muy no estándar. ¿Dónde está el microscopio y las uñas! Por lo tanto, decidí mantener este blog para contar varios casos interesantes de la práctica. La publicación de hoy trata sobre cómo configuro notificaciones instantáneas sobre el estado de mi nodo, en cuyo caso puedo revivirlo rápidamente.

El plan que seguí
La tarea que me propuse era esta: cada vez que un nodo falla o deja de funcionar, debería recibir notificaciones instantáneas al respecto. Pero vivimos en una era progresiva y estamos acostumbrados a recibir toda la información importante al instante, ¿verdad?
Decidí que para llevar a cabo esta tarea, uniré a Zabbix a Slack (tenemos una herramienta de proyecto en funcionamiento). Zabbix, en consecuencia, supervisará el nodo y me enviará mensajes de error en el PM de Slack.
Implementación: paso a paso
Paso 1: Zabbix
Por supuesto, Zabbix no tiene herramientas de monitoreo preconfiguradas estándar para nuestro nodo. Por lo tanto, el primer deseo era determinar la disponibilidad del puerto del nodo utilizando la clave
net.tcp.listen[port].
Pero hay un "pero": sucede que el nodo está activo, escucha en el puerto, pero no funciona correctamente. Y aquí me enfrenté con el hecho de que necesita determinar el signo principal del rendimiento de un nodo.
¿Qué debe hacer Noda? Bien, crece. Aquí el crecimiento será la señal principal. Por lo tanto, decidí usar la clave
system.run[command, mode]
.
Junto con
curl -s http://127.0.0.1:36666/api/blocks/getHeight
.
Como resultado, recibimos una cadena de formato JSON del formulario
{"success":true,"nodeTimestamp":XXXXXXX,"height":XXXXXXX}
El paquete jq (https://stedolan.imtqy.com/jq/) ayudó a resolver el problema de análisis JSON. Una transferencia de resultados simple a través de la
curl http://127.0.0.1:36666/api/blocks/getHeight | jq .height
tubería
curl http://127.0.0.1:36666/api/blocks/getHeight | jq .height
{6666 / api / blocks / getHeight
curl http://127.0.0.1:36666/api/blocks/getHeight | jq .height
curl http://127.0.0.1:36666/api/blocks/getHeight | jq .height
, y en lugar de la altura tan esperada, recibimos una respuesta que contiene información sobre el comando
curl
.

La información redundante necesitaba ser eliminada, y luego vino un asistente: el
-s
, también conocido como
-silent
. Como resultado, usando la clave Zabbix
system.run[curl -s http://127.0.0.1:36666/api/blocks/getHeight | jq .height]
system.run[curl -s http://127.0.0.1:36666/api/blocks/getHeight | jq .height]
obtenemos la altura del nodo de la vista deseada y conveniente para monitorear XXXXXXXXX.

También se requirió un activador para configurar la alerta planificada. El plan era este: comparar los valores anteriores y anteriores, y para que el disparador funcione si el crecimiento es menor a uno.
{ADAMANT Node Monitoring:system.run[curl -s http://127.0.0.1:36666/api/blocks/getHeight | jq .height].change()}<1
Paso 2. Zabbix a Slack

La siguiente tarea es notificar al disparador en Slack. Como base, tomé el material
https://github.com/ericoc/zabbix-slack-alertscript .
Las instrucciones son claras, pero el uso de emoticones para distinguir entre gravedad no es serio. El resaltado de color es mucho más interesante. Después de procesar el script, esto permanece:
url='********************************' username='Server' to="$1" subject="$2" recoversub='^RECOVER(Y|ED)?$' if [[ "$subject" == 'Warning' ]]; then color='#EBFF00' elif [ "$subject" == 'Not classified' ]; then color='#D8E3FF' elif [ "$subject" == 'Information' ]; then color='#0049FF' elif [ "$subject" == 'Average' ]; then color='#FFC200' elif [ "$subject" == 'High' ]; then color='#FF5500' elif [ "$subject" == 'Disaster' ]; then color='#FF0000' else color='#00FF06' fi message="${subject} \n $3" payload="payload={\"attachments\": [{\"color\": \"${color}\", \"text\": \"${message}\"}]}" curl -m 5 --data-urlencode "${payload}" $url
Conclusiones
Como moraleja, en pocas palabras, por qué es tan importante un monitoreo conveniente. Cuanto más rápido se entere de la situación, más rápido la corregirá y menos pronunciadas serán las consecuencias. Como dicen, no se considera que haya disminuido el tiempo generado. Y en Slack, entre otras cosas, hay chats grupales, por lo que el equipo puede conectarse para solucionar el problema y coordinar acciones. Por cierto, nuestro proyecto tiene código fuente abierto, y somos muy respetuosos con otros proyectos de código abierto. Mi experimento demostró una vez más que el código abierto es bueno.