
Ponekad morate brzo obaviti monitoring za novu uslugu, ali nema gotove infrastrukture/stručnosti pri ruci. U ovom vodiču ćemo za pola sata implementirati alat za praćenje bilo kojeg web servisa, koristeći samo ugrađene alate ubuntua: bash, cron i curl. Koristit ćemo telegram za isporuku upozorenja.
“Trešnja na torti” će biti emocionalna uključenost korisnika. Testirano na ljudima - djeluje.
Kada smo u telemedicinskom servisu Doctor Nearby kreirali chatbot za određivanje nivoa stresa korisnika, trebalo nam je praćenje. Za par sati nastao je mini-projekat koji ne samo da odlično funkcionira, već svojim porukama unosi i pozitivnost.
Prvo, nabavimo spremište sa skriptama:
git clone https://github.com/rshekhovtsov/msms.gitIdite u msms folder i radite u njemu.
Ako je telegram blokiran, koristite proxy. Najjednostavnija i najpouzdanija opcija su torzokovi:
sudo apt install tor
sudo apt install torsocksKao primjer, postavimo praćenje početne stranice google.com u tri koraka.
KORAK 1. Kreirajte bota u telegramu i uzmite korisnički ID
- U traci za pretragu za kontakte u telegramu tražimo :

- Pokrećemo ga tipkom Start, upisujemo naredbu /newbot i odgovaramo na pitanja. Morate imati na umu da je ime ime bota koji će biti prikazan korisnicima, a korisničko ime je jedinstveno i mora se završavati sa "bot":

Između ostalog, bot će izdati tajni token za HTTP API, koji se mora kopirati i sačuvati u telegram-api-key.txt datoteku u msms folderu. - Ukucamo ime našeg bota u traku za pretragu telegrama i pokrenemo ga.
- Kao završni dodir, dodajmo sebe na listu primatelja upozorenja za praćenje:
sudo chmod +x ./recipients-setup.sh torsocks ./recipients-setup.shSkripta će prikazati listu nedavnih poziva botu; u telegramu bi trebao biti jedan red s našim ID-om i imenom. Uzimamo ovaj ID i spremamo ga u fajl services/google-recipients.txt. Format datoteke: svaki red je jedan id. primjer:
123456789 987654321
Da biste dodali novog primaoca, morate ga zamoliti da pokrene bot u telegramu, pokrene recipients-setup.sh i doda id u datoteku.
KORAK 2. Postavite nadzor
Usluga je opisana kreiranjem ini datoteke u folderu usluge. Potrebno je podesiti pet parametara:
- MSMS_SERVICE_NAME: naziv usluge - koristit će se u upozorenjima i dnevniku praćenja.
- MSMS_SERVICE_ENDPOINT: krajnja tačka usluge na koju ćemo kontaktirati sa curl.
- MSMS_CURL_PARAMS: dodatne opcije uvijanja, pogledajte primjer ispod.
- MSMS_EXPECTED: očekivani odgovor servisa. Koristi se ako je odgovor kratak.
- MSMS_EXPECTED_FILE: naziv datoteke sa očekivanim odgovorom usluge. Ako je navedeno, prepisuje MSMS_EXPECTED.
- MSMS_RECIPIENTS: datoteka sa listom primatelja obavještenja.
Zahtjev na google.com vraća fiksni html s preusmjeravanjem, mi ćemo ga koristiti kao očekivani odgovor servera:
curl google.com > services/google-response.htmlKreirajmo fajl services/google.ini:
MSMS_SERVICE_NAME='google front page'
# service endpoint
MSMS_SERVICE_ENDPOINT='google.com'
# curl parameters
MSMS_CURL_PARAMS='-s --connect-timeout 3 -m 7'
# expected service response
MSMS_EXPECTED_FILE='google-response.html'
# recipients list file
MSMS_RECIPIENTS='google-recipients.txt' В MSMS_CURL_PARAMS možete podesiti sve što curl može, uključujući:
- Onemogućite curl poruke kako biste izbjegli zatrpavanje konzole i dnevnika:
-s - Postavite vremensko ograničenje veze sa uslugom koja se provjerava (u sekundama):
--connect-timeout 3 - Postavite vremensko ograničenje odgovora:
-m 7 - Onemogućite verifikaciju certifikata za SSL (na primjer, ako koristite samopotpisani certifikat):
--insecure - Odredite vrstu http zahtjeva:
-X POST - Navedite naslove:
-H "Content-Type: application/json" - Navedite tijelo zahtjeva kao string ili datoteku. Primjer za fajl:
-d @request.json
Onemogućili smo obavještenja i postavili vremensko ograničenje na 3 sekunde. za povezivanje i 7 sek. da dobijete servisni odgovor.
Oprez: Navedite vrijednosti parametara u jednostrukim navodnicima, kao u primjeru. Nažalost, bash je u tom smislu prilično krhak, a slučajni leptir s pogrešnim navodnikom može dovesti do smrti svemira uz greške koje je teško dijagnosticirati.
Postavili smo monitoring. Hajde da proverimo da li je sve u redu:
sudo chmod +x ./monitoring.sh
torsocks ./monitoring.shSkripta bi trebala prikazati poruku poput:
2020-01-10 12:14:31
health-check "google front page": OKKORAK 3. Postavljanje rasporeda
Postavimo raspored nadgledanja u cron-u:
sudo crontab -eDodajmo red za provjeru google.com svake minute:
*/1 * * * * torsocks <ПУТЬ К ПАПКЕ РЕПОЗИТОРИЯ>/monitoring.sh >> <ПУТЬ К ПАПКЕ РЕПОЗИТОРИЯ>/monitoring.log 2>&1Svakog dana u 11.00:XNUMX dodavaćemo upozorenje, potvrđujući funkcionalnost samog monitoringa. Da bismo to učinili, skriptu ćemo proslijediti parametar DAILY:
0 11 * * * torsocks <ПУТЬ К ПАПКЕ РЕПОЗИТОРИЯ>/monitoring.sh DAILY >> <ПУТЬ К ПАПКЕ РЕПОЗИТОРИЯ>/monitoring.log 2>&1
2>&1 - standardna tehnika koja preusmjerava greške na glavni izlazni tok. Kao rezultat toga, oni će također završiti u evidenciji praćenja.
Sačuvajmo promjene i pokupimo ih naredbom:
sudo service cron reloadMožete pročitati više o postavljanju cron-a, na primjer, .
Tako će svake minute biti pokrenuta skripta za praćenje koja će kontaktirati google.com preko curl-a. Ako se primljeni odgovor razlikuje od očekivanog, skripta će poslati telegramsko obavještenje na listu primalaca. Dnevnik revizije se čuva u datoteci monitoring.log
Ako treba da dodamo još jednu uslugu, jednostavno kreiramo novu ini datoteku za nju u folderu usluge i, ako je potrebno, kreiramo zasebnu listu primalaca. Sve ostalo će raditi automatski.
Ako je usluga koja se provjerava postala nedostupna, upozorenje će biti poslano svake minute. Ako ne možete brzo vratiti uslugu, možete privremeno onemogućiti obavijesti u svojstvima telegrama bota.
Sada pogledajmo bliže dodatne funkcije i implementaciju skripti.
Obrasci poruka i emocionalni angažman
Kako bismo komunikaciju s botom učinili živahnijom, nazvali smo ga Manechka, dodali odgovarajuću sliku avatara i angažirali profesionalne PR stručnjake da kreiraju tekstove poruka. Možete iskoristiti naše iskustvo ili ga promijeniti po svom ukusu.
Na primjer ovako:

ili cak ovako:

Zašto ne?
Ime bota i avatar se postavljaju putem .
Šabloni poruka su u folderu predlošci:
- curl-fail.txt: poruka se šalje kada curl vrati kod greške koji nije nula. Obično se govori o nemogućnosti dolaska do servisa.
- daily.txt: Dnevna poruka koja potvrđuje da nadzor servisa radi.
- service-fail.txt: Poruka se šalje kada se odgovor usluge razlikuje od očekivanog.
Pogledajmo opcije prilagođavanja koristeći ugrađene šablone poruka kao primjer.
Šabloni koriste emotikone. Nažalost, habr ih ne prikazuje.
Za odabir emotikona zgodno je koristiti pretragu na :

Jednostavno kopirate i zalijepite odgovarajući simbol u tekst predloška (ovo je običan unikod).
- curl-fail.txt:
Котёнок, помоги мне... Не могу достучаться до сервиса "$MSMS_SERVICE_NAME" `CURL EXIT CODE: $EXIT_CODE`Koristili smo naziv usluge koji smo naveli (varijable
MSMS_SERVICE_NAME) i internu varijablu skripte sa izlaznim kodom curl (EXIT_CODE). Takođe smo formatirali poruku koristeći markup : znakovi "`" okružuju tekst fiksne širine. Budući da su navodnici i apostrofi bash simboli, izbjegavamo ih sa "". Imenima varijabli prethodi znak "$".Rezultat:

- service-fail.txt:
Котёнок, помоги мне... Сервис "$MSMS_SERVICE_NAME" меня расстроил Он работает неправильно, вот что он мне отвечает: `$RESPONSE`Rezultat:

Ovdje koristimo drugu varijablu skripte:RESPONSE. Sadrži odgovor usluge. - daily.txt:
Малыш, привет! У меня всё хорошо, cлежу за сервисом: "$MSMS_SERVICE_NAME" каждую минутку... А как у тебя дела?Rezultat:

Pređimo na implementaciju skripti.
Skripta za praćenje
monitoring.sh radi jednostavno automatsko otkrivanje - uzima sve ini datoteke iz foldera sa uslugama i za svaku izvršava glavnu skriptu s logikom za provjeru i slanje upozorenja:
#!/bin/bash
cd $(dirname "$0")/services
for service_ini in $(ls *.ini); do
bash ../msms.sh "$1" "$service_ini"
doneDa biste generirali dnevnu poruku o statusu nadzora, možete proslijediti parametar DAILY skripti.
Imajte na umu da kada se skripta pokrene, trenutni folder se mijenja u usluge. Ovo vam omogućava da odredite putanje datoteka u odnosu na usluge u ini datotekama.
Skripta za provjeru i slanje obavještenja
msms.sh sadrži glavnu logiku za provjeru usluge i slanje upozorenja.
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
}
Generišemo URL za pristup REST API-ju telegrama koristeći tajni ključ sačuvan u datoteci.
Funkcija send_message koristi curl za slanje poruka ovom REST API-ju, uzimajući ID-ove primatelja iz datoteke koju smo naveli u ini. U podacima koje šaljemo označavamo da koristimo označavanje poruka: parse_mode="Markdown".
Hajde da prikažemo trenutni datum i vreme i učitamo ini fajl.
echo $(date '+%Y-%m-%d %H:%M:%S')
# load variables from .ini file:
. $2
Magic string . $2 izvršava ini datoteku koja je proslijeđena na ulaz kao drugi parametar kao obična skripta, unoseći vrijednosti navedene u njoj u varijable okruženja.
Učitajte očekivani odgovor iz datoteke ako je parametar specificiran MSMS_EXPECTED_FILE:
if [ -n "$MSMS_EXPECTED_FILE" ]; then
MSMS_EXPECTED="$(cat "$MSMS_EXPECTED_FILE")"
fi
Provjerit ćemo uslugu i poslati upozorenja 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" 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
Prvo dodjeljujemo varijablu RESPONSE rezultat izvršavanja naredbe curl za ovu uslugu.
Izraz EXIT_CODE=$? stavlja rezultat zadnje naredbe u varijablu, tj. curl. Ako je potrebno poslati upozorenje, predložak se čita iz odgovarajuće datoteke i šalje primaocima koristeći send_message.
Posljednji blok obrađuje DAILY parametar:
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Šalje poruku koja potvrđuje funkcionalnost samog nadzora.
Dobivanje liste korisničkih ID-ova
recipients-setup.sh poziva API telegrama da dobije najnovije poruke upućene botu:
curl -s https://api.telegram.org/bot$(cat telegram-api-key.txt)/getUpdates
| python recipients-setup.pyOvo koristi python magiju da lijepo prikaže listu. Ovo nije neophodno, možete jednostavno uzeti željeni id iz json-a, koji će naredba izbaciti:
torsocks curl -s https://api.telegram.org/bot$(cat telegram-api-key.txt)/getUpdateszaključak
Dakle, možete koristiti gotove skripte i šablone poruka, postavljajući samo nadgledane servise i liste za upozorenja; možete kreirati novu "ličnost" za bota; ili možete donijeti vlastitu odluku na osnovu onoga što je predloženo.
Opcije za dalji razvoj predlažu konfigurisanje i upravljanje nadzorom u samom botu, ali ovdje ne možete bez pythona. Ako ga neko dobije prije mene, znate gdje da predate zahtjev za povlačenje :)
izvor: www.habr.com



