
Niekedy potrebujete rýchlo implementovať monitorovanie novej služby, ale nemáte k dispozícii potrebnú infraštruktúru ani odborné znalosti. V tejto príručke implementujeme nástroj na monitorovanie akejkoľvek webovej služby za pol hodiny, pričom použijeme iba vstavané nástroje. ubuntubash, cron a curl. Na doručovanie notifikácií použijeme Telegram.
„Čerešničkou na torte“ bude emocionálna angažovanosť používateľov. Testované na ľuďoch - funguje to.
Keď sme v telemedicínskej službe Doctor near vytvorili chatbota na určenie úrovne stresu používateľov, potrebovali sme monitorovanie. Za pár hodín vznikol miniprojekt, ktorý nielenže skvele funguje, ale svojimi posolstvami dodáva aj pozitivitu.
Najprv získajme úložisko so skriptmi:
git clone https://github.com/rshekhovtsov/msms.gitPrejdite do priečinka msms a potom v ňom pracujte.
Ak je telegram zablokovaný, použite proxy. Najjednoduchšou a najspoľahlivejšou možnosťou sú torzo:
sudo apt install tor
sudo apt install torsocksAko príklad si nastavme sledovanie úvodnej stránky google.com v troch krokoch.
KROK 1. Vytvorte robota v telegrame a získajte ID používateľa
- Vo vyhľadávacom paneli pre kontakty v telegrame hľadáme :

- Spustíme ho tlačidlom Štart, zadáme príkaz /newbot a odpovieme na otázky. Musíte mať na pamäti, že meno je názov robota, ktorý sa zobrazí používateľom, a používateľské meno je jedinečné a musí končiť na „bot“:

Okrem iného bot vydá tajný token pre HTTP API, ktorý je potrebné skopírovať a uložiť do súboru telegram-api-key.txt v priečinku msms. - Do vyhľadávacieho panela telegramu napíšeme meno nášho robota a spustíme ho.
- Na záver sa pridajte do zoznamu príjemcov monitorovacích upozornení:
sudo chmod +x ./recipients-setup.sh torsocks ./recipients-setup.shSkript zobrazí zoznam posledných hovorov robotovi; v telegrame by mal byť jeden riadok s naším ID a menom. Vezmeme toto ID a uložíme ho do súboru services/google-recipients.txt. Formát súboru: každý riadok je jedno ID. Príklad:
123456789 987654321
Ak chcete pridať nového príjemcu, musíte ho požiadať, aby spustil robota v telegrame, spustil recipients-setup.sh a pridal id do súboru.
KROK 2. Nastavte monitorovanie
Služba je opísaná vytvorením ini súboru v priečinku services. Musíte nastaviť päť parametrov:
- MSMS_SERVICE_NAME: názov služby – použije sa v protokole výstrah a monitorovania.
- MSMS_SERVICE_ENDPOINT: koncový bod služby, s ktorou budeme kontaktovať curl.
- MSMS_CURL_PARAMS: ďalšie možnosti zvlnenia, pozri príklad nižšie.
- MSMS_EXPECTED: očakávaná odpoveď zo strany služby. Používa sa, ak je odpoveď krátka.
- MSMS_EXPECTED_FILE: názov súboru s očakávanou odpoveďou služby. Ak je zadaný, prepíše MSMS_EXPECTED.
- MSMS_RECIPIENTS: súbor so zoznamom príjemcov upozornení.
Požiadavka na google.com vracia pevný html s presmerovaním, použijeme ho ako očakávanú odpoveď servera:
curl google.com > services/google-response.htmlVytvorme súbor 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 môžete nastaviť všetko, čo curl dokáže, vrátane:
- Zakážte správy curl, aby ste predišli preplneniu konzoly a denníka:
-s - Nastavte časový limit pripojenia s kontrolovanou službou (v sekundách):
--connect-timeout 3 - Nastaviť časový limit odpovede:
-m 7 - Zakázať overenie certifikátu pre SSL (ak napríklad používate certifikát s vlastným podpisom):
--insecure - Zadajte typ požiadavky http:
-X POST - Zadajte nadpisy:
-H "Content-Type: application/json" - Zadajte telo požiadavky ako reťazec alebo súbor. Príklad súboru:
-d @request.json
Zakázali sme upozornenia a nastavili sme časové limity na 3 sekundy. na pripojenie a 7 sek. aby ste dostali servisnú odpoveď.
Pozor: Zadajte hodnoty parametrov v jednoduchých úvodzovkách, ako v príklade. Žiaľ, bash je v tomto zmysle dosť krehký a náhodný motýľ s nesprávnou úvodzovkou môže viesť k smrti vesmíru s ťažko diagnostikovateľnými chybami.
Nastavili sme monitoring. Skontrolujeme, či je všetko v poriadku:
sudo chmod +x ./monitoring.sh
torsocks ./monitoring.shSkript by mal zobraziť správu ako:
2020-01-10 12:14:31
health-check "google front page": OKKROK 3. Nastavenie plánu
Nastavíme plán monitorovania v crone:
sudo crontab -ePridajme riadok na kontrolu google.com každú minútu:
*/1 * * * * torsocks <ПУТЬ К ПАПКЕ РЕПОЗИТОРИЯ>/monitoring.sh >> <ПУТЬ К ПАПКЕ РЕПОЗИТОРИЯ>/monitoring.log 2>&1Každý deň o 11.00:XNUMX pridáme upozornenie potvrdzujúce funkčnosť samotného monitoringu. Za týmto účelom odovzdáme skriptu parameter DAILY:
0 11 * * * torsocks <ПУТЬ К ПАПКЕ РЕПОЗИТОРИЯ>/monitoring.sh DAILY >> <ПУТЬ К ПАПКЕ РЕПОЗИТОРИЯ>/monitoring.log 2>&1
2>&1 - štandardná technika, ktorá presmeruje chyby do hlavného výstupného toku. V dôsledku toho skončia aj v denníku monitorovania.
Uložíme zmeny a vyberieme ich príkazom:
sudo service cron reloadViac o nastavení cronu si môžete prečítať napr. .
Každú minútu sa teda spustí monitorovací skript, ktorý bude kontaktovať google.com cez curl. Ak sa prijatá odpoveď líši od očakávanej, skript odošle telegramové upozornenie na zoznam príjemcov. Protokol auditu sa uchováva v súbore monitoring.log
Ak potrebujeme pridať ďalšiu službu, jednoducho pre ňu vytvoríme nový ini súbor v priečinku services a v prípade potreby vytvoríme samostatný zoznam príjemcov. Všetko ostatné bude fungovať automaticky.
Ak je kontrolovaná služba nedostupná, každú minútu sa odošle upozornenie. Ak nemôžete rýchlo obnoviť službu, môžete dočasne vypnúť upozornenia vo vlastnostiach telegramu robota.
Teraz sa pozrime bližšie na ďalšie funkcie a implementáciu skriptov.
Vzory správ a emocionálne zapojenie
Aby bola komunikácia s robotom živšia, nazvali sme ho Manechka, pridali vhodný obrázok avatara a najali sme profesionálnych PR špecialistov na vytvorenie textov správ. Naše skúsenosti môžete využiť alebo zmeniť podľa svojho vkusu.
Napríklad takto:

alebo aj takto:

Prečo nie?
Názov robota a avatar sa nastavujú pomocou .
Šablóny správ sú v priečinku šablóny:
- curl-fail.txt: správa odoslaná, keď curl vráti nenulový kód chyby. Zvyčajne hovorí o nemožnosti dosiahnutia služby.
- daily.txt: Denná správa potvrdzujúca, že monitorovanie služby funguje.
- service-fail.txt: Správa odoslaná, keď sa odpoveď služby líši od očakávanej odpovede.
Pozrime sa ako príklad na možnosti prispôsobenia pomocou vstavaných šablón správ.
Šablóny používajú emotikony. Žiaľ, habr ich nezobrazuje.
Ak chcete vybrať emotikony, je vhodné použiť vyhľadávanie zapnuté :

Jednoducho skopírujete a vložíte príslušný symbol do textu šablóny (ide o bežný unicode).
- curl-fail.txt:
Котёнок, помоги мне... Не могу достучаться до сервиса "$MSMS_SERVICE_NAME" `CURL EXIT CODE: $EXIT_CODE`Použili sme názov služby, ktorý sme zadali (premenná
MSMS_SERVICE_NAME) a interná premenná skriptu s ukončovacím kódom curl (EXIT_CODE). Správu sme tiež naformátovali pomocou značiek : Znaky "`" obklopujú text s pevnou šírkou. Keďže úvodzovky a apostrofy sú symboly bash, ukončíme ich znakom „“. Názvy premenných sú označené znakom „$“.Výsledok:

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

Tu používame ďalšiu premennú skriptu:RESPONSE. Obsahuje odpoveď služby. - daily.txt:
Малыш, привет! У меня всё хорошо, cлежу за сервисом: "$MSMS_SERVICE_NAME" каждую минутку... А как у тебя дела?Výsledok:

Prejdime k implementácii skriptov.
Monitorovací skript
monitoring.sh vykoná jednoduché automatické zisťovanie – vezme všetky ini súbory zo zložky služieb a pre každý z nich spustí hlavný skript s logikou na kontrolu a odosielanie upozornení:
#!/bin/bash
cd $(dirname "$0")/services
for service_ini in $(ls *.ini); do
bash ../msms.sh "$1" "$service_ini"
doneAk chcete generovať dennú správu o stave monitorovania, môžete skriptu odovzdať parameter DAILY.
Upozorňujeme, že pri spustení skriptu sa aktuálny priečinok zmení na služby. To vám umožňuje zadať cesty k súborom relatívne k službám v súboroch ini.
Skript na kontrolu a odosielanie upozornení
msms.sh obsahuje hlavnú logiku kontroly služby a odosielania upozornení.
Práca s 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
}
Vygenerujeme URL na prístup k telegramovému REST API pomocou tajného kľúča uloženého v súbore.
Funkcia send_message používa curl na odosielanie správ do tohto REST API, pričom berie ID príjemcov zo súboru, ktorý sme zadali v ini. V údajoch, ktoré odosielame, uvádzame, že používame označenie správ: parse_mode="Markdown".
Zobrazme aktuálny dátum a čas a načítajme ini súbor.
echo $(date '+%Y-%m-%d %H:%M:%S')
# load variables from .ini file:
. $2
Magická šnúrka . $2 vykoná ini súbor odovzdaný na vstup ako druhý parameter ako bežný skript a zadá hodnoty v ňom špecifikované do premenných prostredia.
Načítajte očakávanú odpoveď zo súboru, ak je zadaný parameter MSMS_EXPECTED_FILE:
if [ -n "$MSMS_EXPECTED_FILE" ]; then
MSMS_EXPECTED="$(cat "$MSMS_EXPECTED_FILE")"
fi
Službu skontrolujeme a v prípade potreby pošleme upozornenia:
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
Najprv priradíme premennej RESPONSE výsledok vykonania príkazu curl pre túto službu.
vyjadrenie EXIT_CODE=$? vloží výsledok posledného príkazu do premennej, t.j. zvlniť. Ak je potrebné odoslať upozornenie, šablóna sa načíta z príslušného súboru a odošle sa príjemcom pomocou send_message.
Posledný blok spracováva parameter 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"
fiOdošle správu potvrdzujúcu funkčnosť samotného monitorovania.
Získanie zoznamu ID používateľov
recipients-setup.sh volá telegramové API, aby získalo najnovšie správy adresované robotovi:
curl -s https://api.telegram.org/bot$(cat telegram-api-key.txt)/getUpdates
| python recipients-setup.pyToto používa mágiu pythonu na krásne vykreslenie zoznamu. Nie je to potrebné, môžete jednoducho prevziať požadované ID z json, ktoré príkaz vypíše:
torsocks curl -s https://api.telegram.org/bot$(cat telegram-api-key.txt)/getUpdatesZáver
Môžete teda použiť hotové skripty a šablóny správ, nastaviť iba monitorované služby a zoznamy pre upozornenia; môžete pre robota vytvoriť novú „osobnosť“; alebo sa môžete rozhodnúť sami na základe toho, čo bolo navrhnuté.
Možnosti ďalšieho vývoja naznačujú konfiguráciu a správu monitorovania v samotnom robote, ale tu sa bez pythonu nezaobídete. Ak to niekto dostane skôr ako ja, viete, kam podať žiadosť o stiahnutie :)
Zdroj: hab.com



