
Včasih je treba hitro izvesti nadzor za novo storitev, vendar nimamo pripravljene infrastrukture ali strokovnega znanja. V tem priročniku bomo v pol ure vzpostavili orodje za spremljanje kakršnih koli spletnih storitev, uporabimo samo vgrajena sredstva ubuntu: bash, cron in curl. Za dostavo obvestil bomo uporabili telegram.
»Češnja na torti« bo čustveno vključevanje uporabnikov. Preverjeno pri ljudeh - deluje.
Ko smo v telemedicinski storitvi Doktor Rядом ustvarili klepetalnega robota za določanje ravni stresa uporabnikov, smo potrebovali nadzor. V nekaj urah je bil izdelan mini projekt, ki ne le odlično deluje, ampak tudi prinaša pozitivnost s svojimi sporočili.
Za začetek pridobimo repozitorij s skripti:
git clone https://github.com/rshekhovtsov/msms.gitPreidemo v mapo msms in tam nadaljujemo z delom.
Če je telegram blokiran, uporabite proxy. Najbolj preprost in zanesljiv način je torsocks:
sudo apt install tor
sudo apt install torsocksKot primer nastavimo nadzor začetne strani google.com v treh korakih.
KORAK 1. Ustvarimo bota v telegramu in pridobimo id uporabnika.
- V iskalno vrstico stikov v telegramu iščemo :

- Z njim začnemo s tipko Start, vpišemo ukaz /newbot in odgovorimo na vprašanja. Treba je imeti v mislih, da je name - ime bota, ki se bo prikazovalo uporabnikom, username pa je edinstven in se mora končati z „bot“:

Med drugim bo bot izdal skrivni žeton za HTTP API, ki ga je treba kopirati in shraniti v datoteko telegram-api-key.txt v mapi msms. - V iskalno vrstico telegrama vpišemo ime našega bota ter ga zaženemo.
- Kot zaključni dodatek se dodamo na seznam prejemnikov obvestil nadzora:
sudo chmod +x ./recipients-setup.sh torsocks ./recipients-setup.shSkripta bo izpisala seznam zadnjih poizvedb k botu, tam bi morala biti ena vrstica z našim id-jem in imenom v telegramu. Vzamemo ta id in ga shranimo v datoteko services/google-recipients.txt. Format datoteke: vsaka vrstica - en id. Primer:
123456789 987654321
Da dodate novega prejemnika, ga morate prositi, da zažene bota v telegramu, zažene recipients-setup.sh in doda id v datoteko.
KORAK 2. Nastavimo nadzor.
Opis storitve poteka z ustvarjanjem ini-datoteke v mapi services. Treba je nastaviti pet parametrov:
- MSMS_SERVICE_NAME: ime storitve - bo uporabljeno v obvestilih in dnevniku nadzora.
- MSMS_SERVICE_ENDPOINT: endpoint storitve, na katerega se bomo obrnili s curl.
- MSMS_CURL_PARAMS: dodatni parametri curl, pogledajte primjer u nastavku.
- MSMS_EXPECTED: očekivani odgovor usluge. Koristi se ako je odgovor kratak.
- MSMS_EXPECTED_FILE: ime datoteke s očekivanim odgovorom usluge. Ako je navedeno, prepisuje MSMS_EXPECTED.
- MSMS_RECIPIENTS: datoteka sa spiskom primalaca obaveštenja.
Upit na google.com vraća fiksni html s preusmeravanjem, koristićemo ga kao očekivani odgovor servera:
curl google.com > services/google-response.htmlKreirajmo datoteku services/google.ini:
MSMS_SERVICE_NAME='google front page'
# krajnja tačka usluge
MSMS_SERVICE_ENDPOINT='google.com'
# curl parametri
MSMS_CURL_PARAMS='-s --connect-timeout 3 -m 7'
# očekivani odgovor usluge
MSMS_EXPECTED_FILE='google-response.html'
# datoteka sa spiskom primalaca
MSMS_RECIPIENTS='google-recipients.txt' V MSMS_CURL_PARAMS možete postaviti sve što curl može, uključujući:
- Isključite curl poruke kako ne biste zagušili konzolu i log:
-s - Postavite vreme čekanja za povezivanje sa proveravanom uslugom (u sekundama):
--connect-timeout 3 - Postavite vreme čekanja za primanje odgovora:
-m 7 - Isključite proveru sertifikata za SSL (na primjer, ako se koristi samo-potpisani sertifikat):
--insecure - Odredite tip http zahteva:
-X POST - Odredite zaglavlja:
-H "Content-Type: application/json" - Odredite telo zahteva kao string ili datoteku. Primer za datoteku:
-d @request.json
Isključili smo obaveštenja i postavili vreme čekanja na 3 sekunde za povezivanje i 7 sekundi za primanje odgovora usluge.
Opozorilo: navedite vrednosti parametara u jednostrukim navodnicima, kao u primeru. Nažalost, bash je u ovom smislu prilično osetljiv, i slučajno postavljena neodgovarajuća navodnica može dovesti do teško dijagnostikovanih grešaka.
Podesili smo monitoring. Proverimo da li je sve u redu:
sudo chmod +x ./monitoring.sh
torsocks ./monitoring.shSkripta bi trebala da prikaže poruku u obliku:
2020-01-10 12:14:31
health-check "google front page": OKKORAK 3. Podešavanje rasporeda
Podesimo raspored monitoringa u cron:
sudo crontab -eDodajmo red za proveru google.com svake minute:
*/1 * * * * torsocks /monitoring.sh >> /monitoring.log 2>&1Dodajmo svake nedelje u 11:00 obaveštenje koje potvrđuje ispravnost samog monitoringa. U tu svrhu, prosledićemo parametar DAILY skripti:
0 11 * * * torsocks /monitoring.sh DAILY >> /monitoring.log 2>&1
2>&1 — standardna procedura koja preusmerava greške u glavni izlaz. Kao rezultat, one će takođe biti zabeležene u logu monitoringa.
Sačuvajmo izmene i primenimo ih komandom:
sudo service cron reloadVeč o nastavitvi cron lahko preberete, na primer, .
Tako bo vsakih pet minut zagnan skript za spremljanje, ki bo prek curl pošiljal zahtevo na google.com. Če se pridobljen odgovor razlikuje od pričakovanega, bo skript poslal obvestilo na seznam prejemnikov v telegramu. Dnevnik preverjanj se shrani v datoteki monitoring.log.
Če želite dodati še eno storitev, preprosto ustvarite novo ini-datoteko v mapi services in, po potrebi, oblikujete poseben seznam prejemnikov. Vse ostale naloge bodo delovale avtomatsko.
Če storitev ni več dostopna, bo obvestilo prihajalo na vsake minute. Če se storitev ne obnese hitro obnoviti, lahko začasno onemogočite obvestila v nastavitvah robota v telegramu.
Sedaj si poglejmo podrobneje dodatne možnosti in implementacijo skriptov.
Predloge sporočil in čustvena angažiranost
Da bi bilo komuniciranje z robotom bolj živo, smo ga poimenovali Manja, dodali ustrezno sliko avatarja in angažirali strokovnjake za odnose z javnostmi za ustvarjanje besedil sporočil. Uporabite lahko naše konstrukcije ali jih spremenite po svojem okusu.
Na primer tako:

ali celo tako:

Zakaj pa ne?
Ime robota in avatar sta določena prek .
Predloge sporočil se nahajajo v mapi templates:
- curl-fail.txt: sporočilo, poslano v primeru, ko je curl vrnil ne-nulti kodo napake. Običajno pomeni, da storitve ni mogoče doseči.
- daily.txt: dnevno sporočilo, ki potrjuje, da spremljanje storitve deluje.
- service-fail.txt: sporočilo, poslano v primeru, ko se odgovor storitve razlikuje od pričakovanega.
Poglejmo možnosti prilagajanja na primeru vgrajenih predlog sporočil.
V predlogah se uporabljajo emojiji. Na žalost, habr jih ne prikazuje.
Za iskanje emojijev je priročno uporabiti iskalnik na :

Ustrezni simbol preprosto kopirate in prilepite v besedilo predloge (to je običajen unicode).
- curl-fail.txt:
Maček, pomagaj mi... Ne morem doseči storitve "$MSMS_SERVICE_NAME" `KODA IZHODA CURL: $EXIT_CODE`Uporabili smo ime storitve, ki smo ga določili (spremenljivka
MSMS_SERVICE_NAME) in notranjo spremenljivko skripta s kodo končanja curl (EXIT_CODE). Prav tako smo oblikovali sporočilo z uporabo oznak : znakovi "`" okružuju tekst fiksne širine. Budući da su navodnici i apostrofi službeni znakovi bash-a, mi ih escapingujemo znakom "". Imena promenljivih prethodimo znakom "$".Rezultat:

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

Ovde koristimo još jednu promenljivu skripta:RESPONSE. Ona sadrži odgovor servisa. - daily.txt:
Hej, beba! Sve je u redu, pratim servis: "$MSMS_SERVICE_NAME" svake minute... A kako si ti?Rezultat:

Pređimo na implementaciju skripti.
Skripta za monitoring
monitoring.sh vrši jednostavno auto-discovery — uzima sve ini fajlove iz foldera services i za svaki izvršava osnovnu 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 monitoringa, skripti se može proslediti parametar DAILY.
Obratite pažnju da se pri pokretanju skripte trenutni folder menja na services. Ovo omogućava da se u ini fajlovima navode putevi do fajlova u odnosu na services.
Skripta za proveru i slanje obaveštenja
msms.sh sadrži osnovnu 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 telegram-a, koristeći sačuvani u fajlu tajni ključ.
Funkcija send_message koristi curl za slanje poruka na ovaj REST API, uzimajući id primaoca iz fajla koji smo naveli u ini. U prosleđenim podacima navodimo da koristimo formatiranje poruka: parse_mode="Markdown".
Prikažimo trenutno datum-vreme i učitajmo ini fajl.
echo $(date '+%Y-%m-%d %H:%M:%S')
# učitaj promenljive iz .ini fajla:
. $2
Magijska linija . $2 izvršava prosleđeni drugi parametar ini-fajl kao običan skript, unoseći zadate vrednosti u promenljive okruženja.
Učitajmo očekivani odgovor iz fajla, ako je podesen parametar MSMS_EXPECTED_FILE:
if [ -n "$MSMS_EXPECTED_FILE" ]; then
MSMS_EXPECTED="$(cat "$MSMS_EXPECTED_FILE")"
fi
Izvršićemo 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" 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 dodeljujemo promenljivoj RESPONSE rezultat izvršavanja komande curl za ovaj servis.
Izraz EXIT_CODE=$? записывает результат выполнения последней команды, т.е. curl. Если требуется отправка уведомления, шаблон считывается из соответствующего файла и осуществляется рассылка получателям при помощи send_message.
Последний блок обрабатывает параметр DAILY:
если тест "$1" = "DAILY"; тогда
echo health-check "$MSMS_SERVICE_NAME" DAILY
MESSAGE="$(cat ..\/templates\/daily.txt)"
MESSAGE=$(eval echo $MESSAGE)
send_message "$MESSAGE"
fiОн отправляет сообщение, подтверждающее работоспособность самого мониторинга.
Получение списка id пользователей
recipients-setup.sh обращается к API Telegram для получения последних сообщений, адресованных боту:
curl -s https:\/\/api.telegram.org\/bot$(cat telegram-api-key.txt)\/getUpdates
| python recipients-setup.pyЗдесь используется магия Python для красивого вывода списка. Это необязательно, можно просто взять нужный id из json, который выведет команда:
torsocks curl -s https:\/\/api.telegram.org\/bot$(cat telegram-api-key.txt)\/getUpdatesZaključek
Таким образом, вы можете использовать готовые скрипты и шаблоны сообщений, настраивая лишь наблюдаемые сервисы и списки для уведомлений; можете создать новую «личность» для бота; а можете сделать свое решение на основе предложенного.
Как варианты дальнейшего развития, напрашивается конфигурирование и управление мониторингом в самом боте, но без Python тут уже не обойтись. Если у кого-то дойдут руки раньше меня — вы знаете, куда заливать pull request 🙂
Izvor: habr.com



