
A veces es necesario supervisar rápidamente un nuevo servicio, pero no hay infraestructura / experiencia preparada a la mano. En esta guía, en media hora implementaremos una herramienta para monitorear cualquier servicio web usando solo las herramientas incorporadas de ubuntu: bash, cron y curl. Usaremos telegramas para entregar alertas.
"Cherry on the cake" será la participación emocional de los usuarios. Está controlado por personas, funciona.
Cuando creamos un chatbot en el servicio de telemedicina Doctor Near para determinar el nivel de estrés del usuario, necesitábamos monitoreo. En un par de horas, se realizó un mini proyecto, que no solo funciona muy bien, sino que también agrega comentarios positivos.
Para comenzar, obtenga un repositorio con scripts:
git clone https://github.com/rshekhovtsov/msms.git
Vaya a la carpeta msms y luego trabaje en ella.
Si el telegrama está bloqueado, use un proxy. La opción más fácil y confiable son los torsocks:
sudo apt install tor sudo apt install torsocks
Como ejemplo, configuraremos el monitoreo de la página de inicio de google.com en tres pasos.
PASO 1. Cree un bot en Telegram y obtenga la identificación de usuario
Para agregar un nuevo destinatario, debe pedirle que inicie el bot en Telegram, ejecute recipients-setup.sh y agregue la identificación al archivo.
PASO 2. Configurar el monitoreo
La descripción del servicio se produce al crear un archivo ini en la carpeta de servicios. Deben establecerse cinco parámetros:
- MSMS_SERVICE_NAME : nombre del servicio: se utilizará en alertas y registros de monitoreo.
- MSMS_SERVICE_ENDPOINT : el punto final del servicio con el que nos estaremos contactando curl.
- MSMS_CURL_PARAMS : parámetros de curvatura adicionales, consulte el ejemplo a continuación.
- MSMS_EXPECTED : respuesta de servicio esperada. Se usa si la respuesta es corta.
- MSMS_EXPECTED_FILE : nombre de archivo con la respuesta de servicio esperada. Si se especifica, sobrescribe MSMS_EXPECTED.
- MSMS_RECIPIENTS : archivo con una lista de destinatarios de notificaciones.
La solicitud en google.com devuelve un html fijo con un redireccionamiento, lo usaremos como la respuesta esperada del servidor:
curl google.com > services/google-response.html
Cree el archivo services / google.ini:
MSMS_SERVICE_NAME='google front page'
En
MSMS_CURL_PARAMS
puede especificar todo lo que curl puede hacer, incluyendo:
- Deshabilite los mensajes curl para no obstruir la consola y registrar:
-s
- Establezca el tiempo de espera de conexión con el servicio que se verifica (en segundos):
--connect-timeout 3
- Establecer tiempo de espera de respuesta:
-m 7
- Deshabilite la verificación de certificados para SSL (por ejemplo, si se utiliza un certificado autofirmado):
--insecure
- Especifique el tipo de solicitud http:
-X POST
- Especifique encabezados:
-H "Content-Type: application/json"
- Especifique el cuerpo de la solicitud como una cadena o archivo. Ejemplo para el archivo:
-d @request.json
Desactivamos las notificaciones y establecemos tiempos de espera de 3 segundos. en conexión y 7 seg. para recibir una respuesta del servicio.
Atención : especifique valores de parámetros entre comillas simples, como en el ejemplo. Desafortunadamente, bash es bastante frágil en este sentido, y una
mariposa que vuela accidentalmente en el lugar equivocado puede conducir a la
muerte del universo con errores difíciles de diagnosticar.
Configuramos el monitoreo. Comprueba que todo está bien:
sudo chmod +x ./monitoring.sh torsocks ./monitoring.sh
El script debe mostrar un mensaje de la forma:
2020-01-10 12:14:31 health-check "google front page": OK
PASO 3. Ajuste el horario
Configure un horario de monitoreo en cron:
sudo crontab -e
Agregue una línea para revisar google.com cada minuto:
*/1 * * * * torsocks < >/monitoring.sh >> < >/monitoring.log 2>&1
Agregue una alerta todos los días a las 11.00, confirmando el monitoreo en sí. Para hacer esto, pase el parámetro DIARIO al script:
0 11 * * * torsocks < >/monitoring.sh DAILY >> < >/monitoring.log 2>&1
2>&1
: técnica estándar que redirige los errores al flujo de salida principal. Como resultado, también se incluirán en el registro de monitoreo.
Guarda los cambios y atrápalos con el comando:
sudo service cron reload
Puede leer más sobre la configuración de cron, por ejemplo,
aquí .
Por lo tanto, cada minuto se lanzará un script de monitoreo, al que se accederá a través de gol en google.com. Si la respuesta recibida difiere de la esperada, el script enviará una notificación en el telegrama a la lista de destinatarios. El registro de auditoría se mantiene en el archivo tracking.log.
Si necesita agregar otro servicio, simplemente creamos un nuevo archivo ini en la carpeta de servicios y, si es necesario, creamos una lista separada de destinatarios. Todo lo demás funcionará automáticamente.
Si el servicio verificado no está disponible, se enviará una alerta cada minuto. Si no puede restaurar rápidamente el servicio, puede desactivar temporalmente las notificaciones en las propiedades del bot en Telegram.
Ahora echemos un vistazo más de cerca a las características adicionales y la implementación de scripts.
Plantillas de mensajes y compromiso emocional
Para que la comunicación con el bot sea más animada, lo llamamos Manechka, agregamos el avatar de imagen correspondiente y contratamos a especialistas profesionales de relaciones públicas para crear mensajes de texto. Puede utilizar nuestros logros o cambiar a su gusto.
Por ejemplo, así:
o aun así:
Por que no
El nombre del bot y el avatar se configuran a través de
@botfather .
Las plantillas de mensajes se encuentran en la carpeta de
plantillas :
- curl-fail.txt : mensaje enviado cuando curl devolvió un código de error distinto de cero. Por lo general, habla de la imposibilidad de llegar al servicio.
- daily.txt : mensaje diario que confirma que la supervisión del servicio está funcionando.
- service-fail.txt : mensaje enviado cuando la respuesta del servicio es diferente a la esperada.
Examinemos las posibilidades de personalización utilizando el ejemplo de las plantillas de mensajes integradas.
Las plantillas usan emojis. Desafortunadamente, habr no los muestra.
Para seleccionar emojis es conveniente usar la búsqueda en
emojipedia.org :

Simplemente copie y pegue el carácter apropiado en el texto de la plantilla (este es el Unicode habitual).
- curl-fail.txt:
, ... \"$MSMS_SERVICE_NAME\" \`CURL EXIT CODE: $EXIT_CODE\`
Utilizamos el nombre del servicio que especificamos (variable MSMS_SERVICE_NAME
) y una variable de script interno con el código de terminación de curl ( EXIT_CODE
). También formateamos el mensaje usando el marcado de telegrama : los caracteres `` '' enmarcan el texto de un ancho fijo. Como las comillas y los apóstrofes son caracteres bash oficiales, los escapamos con el carácter "\". Los nombres de las variables están precedidos por un signo "$".
Resultado:

- service-fail.txt:
, ... \"$MSMS_SERVICE_NAME\" , : \`$RESPONSE\`
Resultado:

Aquí usamos otra variable de script: RESPONSE
. Contiene la respuesta del servicio.
- daily.txt:
, ! , c : \"$MSMS_SERVICE_NAME\" ... ?
Resultado:

Pasemos a la implementación de scripts.
Script de monitoreo
Monitoring.sh hace que el autodescubrimiento sea simple: toma todos los archivos ini de la carpeta de servicios y para cada uno ejecuta el script principal con la lógica para verificar y enviar alertas:
Para generar un mensaje diario sobre el estado de supervisión, el script puede pasar el parámetro DIARIO.
Tenga en cuenta que cuando se inicia el script, la carpeta actual cambia a servicios. Esto permite que los archivos ini especifiquen las rutas de los archivos en relación con los servicios.
Script para verificar y enviar alertas
msms.sh contiene la lógica básica de verificar un servicio y enviar alertas.
Trabajar con telegrama:
Creamos una URL para acceder a la API REST de telegramas utilizando la clave privada almacenada en el archivo.
La función send_message usa curl para enviar mensajes a esta API REST, tomando la identificación del destinatario del archivo que especificamos en ini. En los datos que enviamos, indicamos que usamos marcado de mensajes:
parse_mode="Markdown"
.
Imprima la fecha y hora actual y cargue el archivo ini.
echo $(date '+%Y-%m-%d %H:%M:%S')
La linea magica
. $2
. $2
ejecuta el archivo ini pasado como segundo parámetro como un script ordinario, ingresando los valores especificados en él en las variables de entorno.
Descargue la respuesta esperada del archivo si se
MSMS_EXPECTED_FILE
parámetro
MSMS_EXPECTED_FILE
:
if [ -n "$MSMS_EXPECTED_FILE" ]; then MSMS_EXPECTED="$(cat "$MSMS_EXPECTED_FILE")" fi
Realice una verificación de servicio con el envío de alertas, si es necesario:
RESPONSE="$(eval curl $MSMS_CURL_PARAMS \"$MSMS_SERVICE_ENDPOINT\")" EXIT_CODE=$? if [[ $EXIT_CODE != 0 ]]; then echo health-check \"$MSMS_SERVICE_NAME\" FAILED: CURL EXIT WITH $EXIT_CODE MESSAGE="$(cat ../templates/curl-fail.txt)" MESSAGE=$(eval echo $MESSAGE) send_message "$MESSAGE" elif [[ "$RESPONSE" != "$MSMS_EXPECTED" ]]; then echo health-check \"$MSMS_SERVICE_NAME\" FAILED: "$RESPONSE" MESSAGE="$(cat ../templates/service-fail.txt)" MESSAGE=$(eval echo $MESSAGE) send_message "$MESSAGE" else echo health-check \"$MSMS_SERVICE_NAME\": OK fi
Primero asignamos la variable
RESPONSE
al resultado del comando curl para este servicio.
Expresión
EXIT_CODE=$?
pone el resultado del último comando, es decir rizo Si necesita enviar una alerta, la plantilla se lee del archivo correspondiente y el envío a los destinatarios se
send_message
mediante
send_message
.
El último bloque procesa el parámetro DIARIO:
if test "$1" = "DAILY"; then echo health-check \"$MSMS_SERVICE_NAME\" DAILY MESSAGE="$(cat ../templates/daily.txt)" MESSAGE=$(eval echo $MESSAGE) send_message "$MESSAGE" fi
Envía un mensaje confirmando la salud del monitoreo en sí.
Obtener una lista de identificación de usuario
recipients-setup.sh llama a la API de telegramas para obtener los últimos mensajes dirigidos al bot:
curl -s https://api.telegram.org/bot$(cat telegram-api-key.txt)/getUpdates \ | python recipients-setup.py
Utiliza la magia de Python para enumerar muy bien la salida. Esto es opcional, simplemente puede tomar la identificación deseada de json, que el comando generará:
torsocks curl -s https://api.telegram.org/bot$(cat telegram-api-key.txt)/getUpdates
Conclusión
Por lo tanto, puede usar scripts y plantillas de mensajes ya preparados, configurando solo servicios y listas observables para notificaciones; Puede crear una nueva "identidad" para el bot; y puede tomar su decisión sobre la base de la propuesta.
Como opciones para un mayor desarrollo, la configuración y administración de monitoreo en el bot en sí se sugiere, pero aquí no puede prescindir de Python. Si alguien pone sus manos delante de mí, ya sabe dónde cargar la solicitud de extracción :-)