Bot pentru monitorizarea serviciilor web în 30 de minute: telegram + bash + cron

Bot pentru monitorizarea serviciilor web în 30 de minute: telegram + bash + cron

Uneori, trebuie să facem rapid o monitorizare pentru un nou serviciu, iar infrastructura/experiența nu sunt disponibile. În acest ghid, vom crea în 30 de minute un instrument de monitorizare pentru orice servicii web, folosind doar instrumentele încorporate în ubuntu: bash, cron și curl. Pentru a trimite notificări, vom folosi telegram.

„Cireașa de pe tort” va fi implicarea emoțională a utilizatorilor. Testat pe oameni - funcționează.

Când am creat un chatbot în serviciul de telemedicină Doctor Riadm pentru a determina nivelul de stres al utilizatorilor, am avut nevoie de monitorizare. În câteva ore, a fost realizat un mini-proiect care nu doar că funcționează excelent, dar adaugă și pozitivitate prin mesajele sale.

Pentru început, să obținem repository-ul cu scripturile:

git clone https://github.com/rshekhovtsov/msms.git

Accesăm folderul msms și apoi lucrăm în el.

Dacă telegram este blocat, folosiți un proxy. Cea mai simplă și sigură opțiune este torsocks:

sudo apt install tor
sudo apt install torsocks

Ca exemplu, să configurăm în trei pași monitorizarea paginii de start google.com

PASUL 1. Creăm un bot în telegram și obținem id-ul utilizatorului

  • În bara de căutare a contactelor din telegram căutăm @botfather:

    Bot pentru monitorizarea serviciilor web în 30 de minute: telegram + bash + cron

  • Îl lansăm cu butonul Start, introducem comanda /newbot și răspundem la întrebările puse. Trebuie să avem în vedere că numele este numele bot-ului, care va apărea utilizatorilor, iar username-ul este unic și trebuie să se încheie cu „bot”:

    Bot pentru monitorizarea serviciilor web în 30 de minute: telegram + bash + cron

    Printre altele, bot-ul va oferi un token secret pentru API-ul HTTP, care trebuie copiat și salvat în fișierul telegram-api-key.txt din folderul msms.

  • Căutăm în bara de căutare telegram numele bot-ului nostru și îl lansăm.
  • Ca un ultim detaliu, să ne adăugăm în lista de destinatari ai notificărilor de monitorizare:
    sudo chmod +x ./recipients-setup.sh
    torsocks ./recipients-setup.sh

    Scriptul va afișa lista celor mai recente apeluri către bot, ar trebui să existe o linie cu id-ul și numele nostru în telegram. Luăm acest id și îl salvăm în fișierul services/google-recipients.txt. Formatul fișierului: fiecare linie - un id. Exemplu:

    123456789
    987654321

Pentru a adăuga un nou destinatar, trebuie să îi cerem să pornească bot-ul în telegram, să lanseze recipients-setup.sh și să adauge id-ul în fișier.

PASUL 2. Configurăm monitorizarea

Descrierea serviciului se face prin crearea unui fișier ini în folderul services. Trebuie să stabilim cinci parametrii:

  1. MSMS_SERVICE_NAME: numele serviciului - va fi folosit în notificări și jurnalul de monitorizare.
  2. MSMS_SERVICE_ENDPOINT: endpoint-ul serviciului la care vom apela cu curl.
  3. MSMS_CURL_PARAMS: parametrii suplimentari pentru curl, consultați exemplul de mai jos.
  4. MSMS_EXPECTED: răspunsul așteptat al serviciului. Folosit dacă răspunsul este scurt.
  5. MSMS_EXPECTED_FILE: numele fișierului cu răspunsul așteptat al serviciului. Dacă este specificat, acesta suprascrie MSMS_EXPECTED.
  6. MSMS_RECIPIENTS: fișier cu lista recepienților notificărilor.

O cerere către google.com returnează un html fix cu redirecționare, îl vom folosi ca răspuns așteptat al serverului:

curl google.com > services/google-response.html

Vom crea fișierul services/google.ini:

MSMS_SERVICE_NAME='pagina principală google'

# endpoint-ul serviciului
MSMS_SERVICE_ENDPOINT='google.com'

# parametrii curl
MSMS_CURL_PARAMS='-s --connect-timeout 3 -m 7'

# răspunsul așteptat al serviciului
MSMS_EXPECTED_FILE='google-response.html'

# fișier cu lista recepienților
MSMS_RECIPIENTS='google-recipients.txt'

În MSMS_CURL_PARAMS puteți specifica tot ce permite curl, inclusiv:

  1. Dezactivarea mesajelor curl, pentru a nu agrea consola și logul: -s
  2. Specificați timeout-ul conexiunii cu serviciul verificat (în secunde): --connect-timeout 3
  3. Specificați timeout-ul pentru primirea răspunsului: -m 7
  4. Dezactivați verificarea certificatului pentru SSL (de exemplu, dacă se folosește un certificat auto-semnat): --insecure
  5. Specificați tipul cererii http: -X POST
  6. Specificați anteturile: -H "Content-Type: application/json"
  7. Specificați corpul cererii sub formă de șir sau fișier. Exemplu pentru fișier: -d @request.json

Am dezactivat notificările și am specificat timeout-uri de 3 secunde pentru conexiune și 7 secunde pentru primirea răspunsului de la serviciu.

Atenție: specificați valorile parametrilor în ghilimele simple, asemenea exemplului. Din păcate, bash este destul de fragil în acest sens, iar o virgulă accidentală plasată greșit poate duce la erori greu diagnosticabile.

Am configurat monitorizarea. Să verificăm că totul este OK:

sudo chmod +x ./monitoring.sh
torsocks ./monitoring.sh

Scriptul ar trebui să afișeze un mesaj de tipul:

2020-01-10 12:14:31
health-check "pagina principală google": OK

PASUL 3. Configurarea programului

Vom configura programul de monitorizare în cron:

sudo crontab -e

Adăugăm o linie pentru verificarea google.com la fiecare minut:

*/1 * * * * torsocks /monitoring.sh >> /monitoring.log 2>&1

Adăugăm o notificare zilnică la 11:00 care confirmă funcționarea monitorizării. Pentru aceasta, vom transmite parametrul DAILY scriptului:

0 11 * * * torsocks /monitoring.sh DAILY >> /monitoring.log 2>&1

2>&1 — o metodă standard care redirecționează erorile către fluxul principal de ieșire. În consecință, acestea vor ajunge și în jurnalul de monitorizare.

Salvăm modificările și le vom lua în considerare cu echipa:

 sudo service cron reload

Puteți citi mai multe despre configurarea cron, de exemplu, aici.

Astfel, la fiecare minut se va rula un script de monitorizare, care va accesa google.com prin curl. Dacă răspunsul primit se abate de la cel așteptat, scriptul va trimite o notificare pe lista de destinatari în telegram. Jurnalul verificărilor se păstrează în fișierul monitoring.log

Dacă trebuie să adăugați un alt serviciu, pur și simplu creăm un nou fișier ini pentru acesta în folderul services și, dacă este necesar, formăm o listă separată de destinatari. Tot restul va funcționa automat.

Dacă serviciul verificat devine indisponibil, notificarea va veni la fiecare minut. Dacă nu reușiți să restabiliți rapid serviciul, puteți dezactiva temporar notificările în proprietățile botului din telegram.

Acum să discutăm în detaliu despre funcționalitățile suplimentare și implementarea scripturilor.

Modele de mesaje și implicarea emoțională

Pentru a face interacțiunea cu botul mai vie, l-am numit Manecă și am adăugat o imagine de profil corespunzătoare și am angajat PR-uri profesioniști pentru a crea textele mesajelor. Puteți folosi materialele noastre sau le puteți schimba după bunul plac.

De exemplu, așa:

Bot pentru monitorizarea serviciilor web în 30 de minute: telegram + bash + cron
sau chiar așa:

Bot pentru monitorizarea serviciilor web în 30 de minute: telegram + bash + cron
De ce nu?

Numele botului și imaginea de profil sunt setate prin @botfather.
Modelele de mesaje se află în folderul templates:

  • curl-fail.txt: mesajul trimis în cazul în care curl a returnat un cod de eroare nenul. De obicei, indică impossibilitatea de a accesa serviciul.
  • daily.txt: mesaj zilnic care confirmă faptul că monitorizarea serviciului funcționează.
  • service-fail.txt: mesajul trimis în cazul în care răspunsul serviciului se abate de la cel așteptat.

Vom explora posibilitățile de personalizare folosind exemple de modele încorporate.
În modele se folosesc emoji. Din păcate, habr nu le afișează.
Pentru a găsi emoji, este convenabil să utilizați căutarea pe emojipedia.org:

Bot pentru monitorizarea serviciilor web în 30 de minute: telegram + bash + cron

Copiați și lipiți pur și simplu simbolul potrivit în textul modelului (acesta este un unicode obișnuit).

  1. curl-fail.txt:
    Pisicuță, ajută-mă... 
    Nu pot accesa serviciul "$MSMS_SERVICE_NAME" 
    `CURL EXIT CODE: $EXIT_CODE`

    Am folosit numele serviciului specificat de noi (variabila MSMS_SERVICE_NAME) și variabila internă a scriptului cu codul de ieșire curl (EXIT_CODE). De asemenea, am formatat mesajul folosind markup-ul telegram markdown: simbolurile "`" încadrează textul de lățime fixă. Deoarece ghilimelele și apostrofixele sunt simboluri de serviciu în bash, le scăpăm cu simbolul "". Numele variabilelor sunt precedate de simbolul "$".

    Rezultatul:

    Bot pentru monitorizarea serviciilor web în 30 de minute: telegram + bash + cron

  2. service-fail.txt:
    Pisicuță, ajută-mă...
    Serviciul "$MSMS_SERVICE_NAME" m-a supărat.
    Funcționează greșit, iată ce-mi răspunde:
    `$RESPONSE`

    Rezultatul:

    Bot pentru monitorizarea serviciilor web în 30 de minute: telegram + bash + cron

    Aici folosim o altă variabilă de script: RESPONSE. Ea conține răspunsul serviciului.

  3. daily.txt:
    Bună, micuțule!
    Eu sunt bine, monitorizez serviciul:
    "$MSMS_SERVICE_NAME" la fiecare minut...
    Dar tu cum ești?
    

    Rezultatul:

    Bot pentru monitorizarea serviciilor web în 30 de minute: telegram + bash + cron

Să trecem la implementarea scripturilor.

Scriptul de monitorizare

monitoring.sh realizează o auto-descoperire simplă — preia toate fișierele ini din folderul services și pentru fiecare rulează scriptul principal cu logica de verificare și trimitere a notificărilor:

#!/bin/bash
cd $(dirname "$0")/services

for service_ini  in $(ls *.ini); do
    bash ../msms.sh "$1" "$service_ini"
done

Pentru a genera un mesaj zilnic despre statusul monitorizării, scriptului îi poate fi transmis parametrul DAILY.

Observați că la pornirea scriptului, folderul curent se schimbă în services. Acest lucru permite în fișierele ini să se specifice căile fișierelor în raport cu services.

Scriptul de verificare și trimitere a notificărilor

msms.sh conține logica principală de verificare a serviciului și trimitere a notificărilor.

Lucrează cu telegram:

# telegram endpoint
TG_API_URL="https://api.telegram.org/bot$(cat ../telegram-api-key.txt)/sendMessage"

#################################################################
# send message to telegram
# parameter: message text
#################################################################
function send_message {
    for chat_id  in $(cat ../$MSMS_RECIPIENTS); do
	curl -s -X POST --connect-timeout 10 $TG_API_URL -d chat_id=$chat_id -d parse_mode="Markdown" -d text="$1"
	echo
    done
}

Generăm URL-ul pentru accesarea REST API a telegram, folosind cheia secretă salvată în fișier.

Funcția send_message folosește curl pentru a trimite mesaje către acest REST API, extrăgând id-urile destinatarilor din fișierul pe care l-am specificat în ini. În datele trimise specificăm că folosim markup pentru mesaje: parse_mode="Markdown".

Să afișăm data și ora curente și să încărcăm fișierul ini.

echo $(date '+%Y-%m-%d %H:%M:%S')

# încarcă variabilele din fișierul .ini:
. $2

Șirul magic . $2 execută fișierul ini transmis ca al doilea parametru ca un script obișnuit, introducând valorile definite în el în variabile de mediu.

Vom încărca răspunsul așteptat din fișier, dacă parametrul este specificat MSMS_EXPECTED_FILE:

if [ -n "$MSMS_EXPECTED_FILE" ]; then
 MSMS_EXPECTED="$(cat "$MSMS_EXPECTED_FILE")"
fi

Vom efectua verificarea serviciului cu trimiterea notificărilor, dacă este necesar:

RESPONSE="$(eval curl $MSMS_CURL_PARAMS "$MSMS_SERVICE_ENDPOINT")"
EXIT_CODE=$?
if [[ $EXIT_CODE != 0 ]]; then
    echo health-check "$MSMS_SERVICE_NAME" A E ȘUAT: CURL EXIT CU $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" A E ȘUAT: "$RESPONSE"
    MESSAGE="$(cat ..\/templates\/service-fail.txt)"
    MESSAGE=$(eval echo $MESSAGE)
    send_message "$MESSAGE"
else
    echo health-check "$MSMS_SERVICE_NAME": OK
fi

Mai întâi atribuim variabilei RESPONSE rezultatul execuției comenzii curl pentru acest serviciu.

Expresia EXIT_CODE=$? stochează rezultatul ultimei comenzi, adică curl. Dacă trebuie să trimiteți o notificare, se citește un șablon din fișierul corespunzător și se realizează trimiterea către destinatari prin send_message.

Ultima secțiune procesează parametrul DAILY:

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

Un mesaj este trimis pentru a confirma funcționarea monitorizării în sine.

Obținerea listei de id-uri ale utilizatorilor

recipients-setup.sh se adresează API-ului telegram pentru a obține cele mai recente mesaje adresate bot-ului:

curl -s https:\/\/api.telegram.org\/bot$(cat telegram-api-key.txt)\/getUpdates 
| python recipients-setup.py

Aici se folosește magia python pentru o ieșire frumoasă a listei. Acest lucru nu este obligatoriu, puteți lua pur și simplu id-ul necesar din json, pe care îl va genera comanda:

torsocks curl -s https:\/\/api.telegram.org\/bot$(cat telegram-api-key.txt)\/getUpdates

Concluzie

Astfel, puteți folosi scripturi și șabloane de mesaje gata făcute, configurând doar serviciile monitorizate și listele pentru notificări; puteți crea o nouă „identitate” pentru bot; sau puteți realiza propria soluție pe baza celei sugerate.

Ca opțiuni pentru dezvoltarea ulterioară, se propune configurarea și gestionarea monitorizării chiar în bot, dar aici nu se poate fără python. Dacă cineva reușește să finalizeze mai repede decât mine — știți unde să trimiteți pull request 🙂

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster