
Ponekad je potrebno brzo provesti monitoring za novu uslugu, a nemamo gotovu infrastrukturu/stručnost. U ovom vodiču za pola sata implementiramo alat za monitoring svih web usluga, koristeći samo ugrađena sredstva ubuntua: bash, cron i curl. Za isporuku obavijesti koristit ćemo telegram.
„Trešnja na torti“ bit će emocionalno angažiranje korisnika. Provjereno na ljudima — radi.
Kada smo u telemedicinskoj usluzi Doktor Rado stvorili chat-bota za određivanje razine stresa korisnika, potrebna nam je bila monitoring. Mini projekt napravljen je za nekoliko sati, a ne samo da odlično radi, već i donosi pozitivu svojim porukama.
Za početak, dobit ćemo repozitorij s skriptama:
git clone https://github.com/rshekhovtsov/msms.gitUlazimo u mapu msms i dalje radimo u njoj.
Ako je telegram blokiran, koristite proxy. Najjednostavnija i najpouzdanija opcija je torsocks:
sudo apt install tor
sudo apt install torsocksKao primjer, postavit ćemo monitoring startne stranice google.com
KORAK 1. Kreiramo bota u telegramu i dobivamo id korisnika
- U pretraživaču kontakata u telegramu tražimo :

- Pokrećemo ga tipkom Start, unosimo naredbu /newbot i odgovaramo na pitanja. Treba imati na umu da je name ime bota koje će se prikazivati korisnicima, a username je jedinstven i mora završavati s „bot“:

Između ostalog, bot će dati tajni token za HTTP API, koji treba kopirati i pohraniti u datoteku telegram-api-key.txt u mapi msms. - Upisujemo u pretraživač telegrama ime našeg bota i pokrećemo ga.
- Kao završni detalj, dodajmo se na popis primatelja obavijesti monitoring-a:
sudo chmod +x ./recipients-setup.sh torsocks ./recipients-setup.shSkript će ispisati popis posljednjih pristupa bota, trebao bi biti jedan redak s našim id i imenom u telegramu. Uzimamo taj id i pohranjujemo ga u datoteku services/google-recipients.txt. Format datoteke: svaki redak — jedan id. Primjer:
123456789 987654321
Da biste dodali novog primatelja, trebate ga zamoliti da pokrene bota u telegramu, pokrene recipients-setup.sh i doda id u datoteku.
KORAK 2. Postavljamo monitoring
Opis usluge se vrši kreiranjem ini-datoteke u mapi serviсes. Potrebno je definirati pet parametara:
- MSMS_SERVICE_NAME: naziv usluge — koristi se u obavijestima i dnevniku monitoringa.
- MSMS_SERVICE_ENDPOINT: endpoint usluge, na koji ćemo se obratiti curl-om.
- MSMS_CURL_PARAMS: dodatni parametri curl, pogledajte primjer u nastavku.
- MSMS_EXPECTED: očekivani odgovor servisa. Koristi se ako je odgovor kratak.
- MSMS_EXPECTED_FILE: ime datoteke s očekivanim odgovorom servisa. Ako je navedena, prepisuje MSMS_EXPECTED.
- MSMS_RECIPIENTS: datoteka sa popisom primatelja obavijesti.
Zahjev za google.com vraća fiksni html s redirekcijom, koristit ćemo ga kao očekivani odgovor servera:
curl google.com > services/google-response.htmlStvaramo datoteku services/google.ini:
MSMS_SERVICE_NAME='google početna stranica'
# krajnja točka servisa
MSMS_SERVICE_ENDPOINT='google.com'
# curl parametri
MSMS_CURL_PARAMS='-s --connect-timeout 3 -m 7'
# očekivani odgovor servisa
MSMS_EXPECTED_FILE='google-response.html'
# datoteka s popisom primatelja
MSMS_RECIPIENTS='google-recipients.txt' U MSMS_CURL_PARAMS možete postaviti sve što curl podržava, uključujući:
- Isključite curl poruke kako ne biste zagušivali konzolu i log:
-s - Postavite vrijeme isteka povezivanja s provjerenim servisom (u sekundama):
--connect-timeout 3 - Postavite vrijeme isteka za dobivanje odgovora:
-m 7 - Isključite provjeru certifikata za SSL (npr. ako se koristi samo-potpisani certifikat):
--insecure - Odredite tip http-zahtjeva:
-X POST - Odredite zaglavlja:
-H "Content-Type: application/json" - Odredite tijelo zahtjeva u obliku niza ili datoteke. Primjer za datoteku:
-d @request.json
Isključili smo obavijesti i postavili timeout od 3 sekunde za povezivanje i 7 sekundi za dobivanje odgovora servisa.
Pažnja: navedite vrijednosti parametara u jednostrukim navodnicima, kao u primjeru. Nažalost, bash je u tom smislu prilično krhak, i slučajno dodana zarezna ili neodgovarajuća zagrada može dovesti do zbrke uz teško dijagnosticiranje grešaka.
Postavili smo praćenje. Provjerimo je li sve u redu:
sudo chmod +x ./monitoring.sh
torsocks ./monitoring.shSkripta bi trebala ispisati poruku u obliku:
2020-01-10 12:14:31
health-check "google početna stranica": OKKORAK 3. Postavljamo raspored
Postavit ćemo raspored praćenja u cron:
sudo crontab -eDodajemo redak za provjeru google.com svake minute:
*/1 * * * * torsocks /monitoring.sh >> /monitoring.log 2>&1Svaki dan u 11:00 dodajemo obavijest koja potvrđuje funkcionalnost samog praćenja. Za to ćemo predati parametar DAILY skripti:
0 11 * * * torsocks /monitoring.sh DAILY >> /monitoring.log 2>&1
` označava preusmjeravanje — standardni postupak koji preusmjerava greške u glavni izlaz. Na kraju, i one će završiti u logu praćenja.
Spremite promjene i preuzmite ih komandom:
sudo service cron reloadViše informacija o postavkama cron možete pročitati, na primjer, .
Tako će se svake minute pokretati skripta za nadgledanje koja će putem cURL-a slati zahtjev na google.com. Ako primljeni odgovor ne odgovara očekivanom, skripta će poslati obavijest na listu primatelja putem Telegrama. Zapisnik provjera se vodi u datoteci monitoring.log
Ako trebamo dodati još jednu uslugu, jednostavno kreiramo novu ini-datoteku za nju u mapi services i, po potrebi, formiramo poseban popis primatelja. Sve ostalo će funkcionisati automatski.
Ako usluga koja se provjerava postane nedostupna, obavijest će dolaziti svake minute. Ako ne uspijemo brzo obnoviti uslugu, obavijesti možemo privremeno onemogućiti u svojstvima bota u Telegramu.
Sada se detaljno pozabavimo dodatnim mogućnostima i implementacijom skripti.
Šabloni poruka i emocionalna angažiranost
Kako bismo komunikaciju s botom učinili živahnijom, nazvali smo ga Manekom, dodali odgovarajuću sliku avatare i angažirali profesionalne PR-ovce za izradu tekstova poruka. Možete koristiti naše materijale ili ih promijeniti prema vlastitom ukusu.
Na primjer ovako:

ili čak ovako:

Zašto ne?
Ime bota i avatar postavljaju se preko .
Šabloni poruka nalaze se u mapi templates:
- curl-fail.txt: poruka koja se šalje kada cURL vrati nenulti kod greške. Obično označava nemogućnost pristupa usluzi.
- daily.txt: dnevna poruka koja potvrđuje da monitoring usluge radi.
- service-fail.txt: poruka koja se šalje kada odgovor usluge ne odgovara očekivanom.
Razmotrićemo mogućnosti prilagodbe na primjeru ugrađenih šablona poruka.
U šablonima se koriste emojiji. Nažalost, Habr ih ne prikazuje.
Za odabir emojija praktično je koristiti pretraživanje na :

Odgovarajući simbol jednostavno kopirajte i zalijepite u tekst šablona (to je običan unicode).
- curl-fail.txt:
Mačiću, pomozi mi... Ne mogu doći do usluge "$MSMS_SERVICE_NAME" `CURL EXIT CODE: $EXIT_CODE`Koristili smo ime usluge koje smo odredili (varijabla
MSMS_SERVICE_NAME) i internu varijablu skripte s kodom završetka cURL-a (EXIT_CODE). Također smo formatirali poruku koristeći markup : simboli "`" okružuju tekst fiksne širine. Pošto su navodnici i apostrofi rezervisani simboli u bash-u, izlazimo iz njih pomoću "". Imena varijabli prethodimo znakom "$".Rezultat:

- service-fail.txt:
Mače, pomozi mi... Servis "$MSMS_SERVICE_NAME" me razočarao Ne radi ispravno, evo šta mi odgovara: `$RESPONSE`Rezultat:

Ovde koristimo još jednu skript varijablu:RESPONSE. Ona sadrži odgovor servisa. - daily.txt:
Bebe, zdravo! Sve je u redu sa mnom, pratim servis: "$MSMS_SERVICE_NAME" svake minute... Kako si ti?Rezultat:

Pređimo na implementaciju skripti.
Skript za nadzor
monitoring.sh radi jednostavno auto-otkrivanje – uzima sve ini-fajlove iz foldera services i za svaki izvršava glavnu skriptu sa logikom provere i slanja obaveštenja:
#!/bin/bash
cd $(dirname "$0")/services
for service_ini in $(ls *.ini); do
bash ../msms.sh "$1" "$service_ini"
doneZa formiranje dnevne poruke o statusu nadzora, skriptu možete proslediti parametar DAILY.
Obratite pažnju da se pri pokretanju skripte trenutni folder menja na services. To omogućava u ini-fajlovima da se navedu putevi do fajlova relativno prema services.
Skript za proveru i slanje obaveštenja
msms.sh sadrži glavnu logiku provere servisa i slanja obaveštenja.
Rad sa telegramom:
# 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
}
Formiramo URL za pristup REST API telegrama, koristeći sačuvani tajni ključ iz fajla.
Funkcija send_message koristi curl za slanje poruka na ovaj REST API, uzimajući id primaoca iz fajla koji smo naveli u ini. U prosledjenim podacima navodimo da koristimo markdown za poruke: parse_mode="Markdown".
Izađimo trenutni datum-vreme i učitajmo ini-fajl.
echo $(date '+%Y-%m-%d %H:%M:%S')
# učitaj varijable iz .ini fajla:
. $2
Magična linija . $2 izvodi prosleđeni kao drugi parametar ini-fajl kao običan skript, smeštajući definisane vrednosti u varijable okruženja.
Učitajmo očekivani odgovor iz fajla, ako je parametar MSMS_EXPECTED_FILE:
if [ -n "$MSMS_EXPECTED_FILE" ]; then
MSMS_EXPECTED="$(cat "$MSMS_EXPECTED_FILE")"
fi
Izvršimo proveru servisa sa slanjem obaveštenja, ako je potrebno:
RESPONSE="$(eval curl $MSMS_CURL_PARAMS "$MSMS_SERVICE_ENDPOINT")"
EXIT_CODE=$?
if [[ $EXIT_CODE != 0 ]]; then
echo health-check "$MSMS_SERVICE_NAME" NIJE PROŠAO: 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" NIJE PROŠAO: "$RESPONSE"
MESSAGE="$(cat ..\/templates\/service-fail.txt)"
MESSAGE=$(eval echo $MESSAGE)
send_message "$MESSAGE"
else
echo health-check "$MSMS_SERVICE_NAME": OK
fi
Prvo dodeljujemo promenljivoj RESPONSE rezultat izvršenja komande curl za ovaj servis.
Izraz EXIT_CODE=$? sjeća se rezultata posljednje izvedene komande, tj. curl. U slučaju da je potrebno poslati obavijest, uzima se predložak iz odgovarajuće datoteke i vrši se slanje na primatelje pomoću send_message.
Posljednji blok obrađuje parametar 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"
fiOn šalje poruku koja potvrđuje funkcionalnost samog nadgledanja.
Dobivanje popisa id korisnika
recipients-setup.sh se obraća API-ju telegrama za dobivanje posljednjih poruka upućenih botu:
curl -s https://api.telegram.org/bot$(cat telegram-api-key.txt)/getUpdates
| python recipients-setup.pyOvdje se koristi čarolija Pythona za lijepo ispisivanje popisa. Ovo nije obavezno, možete jednostavno uzeti potrebni id iz json-a koji će ispisati komanda:
torsocks curl -s https://api.telegram.org/bot$(cat telegram-api-key.txt)/getUpdatesZaključak
Na taj način možete koristiti gotove skripte i predloške poruka, postavljajući samo nadgledane usluge i liste za obavijesti; možete stvoriti novu 'ličnost' za bota; ili možete napraviti svoje rješenje na temelju predloženog.
Kao mogućnost daljnjeg razvoja nameće se konfiguracija i upravljanje nadgledanjem u samom botu, ali tu bez Pythona neće ići. Ako netko završi prije mene — znate gdje postaviti pull request 🙂
Izvor: habr.com



