
Někdy je nutné rychle provést monitorování nového servisu, a to bez dostupné infrastruktury nebo expertní podpory. V tomto průvodci vytvoříme za půl hodiny nástroj pro monitorování jakýchkoli webových služeb, přičemž použijeme pouze vestavěné prostředky Ubuntu: bash, cron a curl. Pro zasílání upozornění využijeme Telegram.
„Třešničkou na dortu“ bude emocionální zapojení uživatelů. Otestováno na lidech — funguje.
Když jsme v telemedicínském servisu Doktor Rvádem vytvořili chatbota pro určení úrovně stresu uživatelů, potřebovali jsme monitorování. Za pár hodin byl vytvořen mini-projekt, který nejen perfektně funguje, ale dodává i pozitivní zprávy.
Nejprve získáme repozitář se skripty:
git clone https://github.com/rshekhovtsov/msms.gitPřejdeme do složky msms a dále budeme pracovat v ní.
Pokud je Telegram zablokovaný, použijte proxy. Nejjednodušší a nejspolehlivější možností je torsocks:
sudo apt install tor
sudo apt install torsocksJako příklad si nastavíme monitorování domovské stránky google.com ve třech krocích.
KROK 1. Vytvoříme bota v Telegramu a získáme ID uživatele.
- V řádku pro hledání kontaktů v Telegramu hledáme :

- Spustíme ho tlačítkem Start, zadáme příkaz /newbot a odpovíme na otázky. Je třeba mít na paměti, že name je jméno bota, které se bude zobrazovat uživatelům, a username je jedinečný a musí končit na „bot“:

Mezi jinými věcmi bot vydá tajný token pro HTTP API, který je potřeba zkopírovat a uložit do souboru telegram-api-key.txt ve složce msms. - Zadáme do vyhledávacího řádku Telegramu jméno našeho bota a spustíme ho.
- Jako poslední krok přidáme sebe do seznamu příjemců upozornění monitorování:
sudo chmod +x ./recipients-setup.sh torsocks ./recipients-setup.shSkript vypíše seznam posledních interakcí s botem, měl by obsahovat jeden řádek s naším ID a jménem v Telegramu. Vezmeme toto ID a uložíme ho do souboru services/google-recipients.txt. Formát souboru: každý řádek — jedno ID. Příklad:
123456789 987654321
Chcete-li přidat nového příjemce, požádejte ho, aby spustil bota v Telegramu, spustil recipients-setup.sh a přidal ID do souboru.
KROK 2. Nastavíme monitorování.
Popis služby se provádí vytvořením ini-souboru ve složce services. Je třeba zadat pět parametrů:
- MSMS_SERVICE_NAME: název služby — bude používán v upozorněních a protokolu monitorování.
- MSMS_SERVICE_ENDPOINT: endpoint služby, na který se budeme připojovat pomocí curl.
- MSMS_CURL_PARAMS: další parametry curl, viz příklad níže.
- MSMS_EXPECTED: očekávaná odpověď služby. Používá se, pokud je odpověď krátká.
- MSMS_EXPECTED_FILE: název souboru s očekávanou odpovědí služby. Pokud je uveden, přepíše MSMS_EXPECTED.
- MSMS_RECIPIENTS: soubor se seznamem příjemců oznámení.
Dotaz na google.com vrací pevný html s přesměrováním, použijeme ho jako očekávanou odpověď serveru:
curl google.com > services/google-response.htmlVytvoříme soubor services/google.ini:
MSMS_SERVICE_NAME='google front page'
# koncový bod služby
MSMS_SERVICE_ENDPOINT='google.com'
# parametry curl
MSMS_CURL_PARAMS='-s --connect-timeout 3 -m 7'
# očekávaná odpověď služby
MSMS_EXPECTED_FILE='google-response.html'
# soubor se seznamem příjemců
MSMS_RECIPIENTS='google-recipients.txt' V MSMS_CURL_PARAMS můžete nastavit vše, co curl umí, včetně:
- Vypnout zprávy curl, aby nezaplavovaly konzoli a log:
-s - Nastavit časový limit připojení k kontrolované službě (v sekundách):
--connect-timeout 3 - Nastavit časový limit pro obdržení odpovědi:
-m 7 - Vypnout kontrolu certifikátu pro SSL (například, pokud se používá samopodepsaný certifikát):
--insecure - Uvedení typu http-dotazu:
-X POST - Uvedení hlaviček:
-H "Content-Type: application/json" - Uvedení těla dotazu ve formě řetězce nebo souboru. Příklad pro soubor:
-d @request.json
Vypnuli jsme oznámení a nastavili časové limity 3 sekundy na připojení a 7 sekund na obdržení odpovědi služby.
Pozor: uvádějte hodnoty parametrů v jednoduchých uvozovkách, jak je v příkladu. Bohužel, bash je v tomto ohledu docela křehký a náhodně umístěná chybná uvozovka může mít za následek složité diagnostikované chyby.
Nastavili jsme monitoring. Zkontrolujeme, že je vše v pořádku:
sudo chmod +x ./monitoring.sh
torsocks ./monitoring.shSkript by měl vypsat zprávu ve formátu:
2020-01-10 12:14:31
health-check "google front page": OKKROK 3. Nastavení plánu
Nastavíme plánování monitorování v cron:
sudo crontab -ePřidáme řádek pro každouminutovou kontrolu google.com:
*/1 * * * * torsocks /monitoring.sh >> /monitoring.log 2>&1Každý den v 11:00 přidáme oznámení potvrzující funkčnost monitorování. K tomu předáme skriptu parametr DAILY:
0 11 * * * torsocks /monitoring.sh DAILY >> /monitoring.log 2>&1
2>&1 — standardní postup, který přesměrovává chyby do hlavního výstupního proudu. Nakonec se také dostanou do záznamu monitorování.
Uložíme změny a spustíme je příkazem:
sudo service cron reloadDalší informace o nastavení cron můžete nalézt například .
Takže každý minutu se spustí monitorovací skript, který se pomocí curl spojí s google.com. Pokud je obdržená odpověď odlišná od očekávané, skript zašle upozornění na seznam příjemců v telegramu. Záznamy kontrol jsou vedeny v souboru monitoring.log
Pokud potřebujeme přidat další službu, jednoduše vytvoříme nový ini soubor pro ni ve složce services a v případě potřeby vytvoříme samostatný seznam příjemců. Všechno ostatní se automaticky zpracuje.
Pokud se kontrolovaná služba stane nedostupnou, upozornění bude přicházet každou minutu. Pokud se službu nedaří rychle obnovit, lze dočasně vypnout oznámení v nastavení bota v telegramu.
Nyní se podrobně podívejme na další možnosti a realizaci skriptů.
Šablony zpráv a emocionální zapojení
Abychom udělali komunikaci s botem živější, pojmenovali jsme ho Maněčka, přidali jsme odpovídající avatar a najali jsme profesionální PR pracovníky pro vytvoření textů zpráv. Můžete používat naše materiály nebo změnit podle svého vkusu.
Například takto:

nebo dokonce takto:

Proč ne?
Jméno bota a avatar se nastavují prostřednictvím .
Šablony zpráv se nacházejí ve složce templates:
- curl-fail.txt: zpráva, která se odešle, pokud curl vrátil nenulový kód chyby. Obvykle označuje, že nebylo možné dosáhnout služby.
- daily.txt: denní zpráva potvrzující, že monitoring služby funguje.
- service-fail.txt: zpráva, která se odešle, pokud je odpověď služby odlišná od očekávané.
Prozkoumejme možnosti přizpůsobení na příkladu vestavěných šablon zpráv.
Ve šablonách se používají emoji. Bohužel, habr je nezobrazuje.
Pro vybírání emoji je vhodné použít vyhledávání na :

Potřebný symbol jednoduše zkopírujte a vložte do textu šablony (to je běžný unicode).
- curl-fail.txt:
Koťátko, pomoz mi... Nemohu se dostat k službě "$MSMS_SERVICE_NAME" `CURL EXIT CODE: $EXIT_CODE`Použili jsme zvolené jméno služby (proměnná
MSMS_SERVICE_NAME) a interní proměnnou skriptu s kódem ukončení curl (EXIT_CODE). Také jsme zprávu formátovali pomocí značkování : znaky "`" obklopují text s pevnou šířkou. Protože uvozovky a apostrofy jsou v bash speciální znaky, musíme je escapovat znakem "". Jména proměnných předchází znak "$".Result:

- service-fail.txt:
Koťátko, pomož mi... Služba "$MSMS_SERVICE_NAME" mě zklamala Nefunguje správně, toto mi odpovídá: `$RESPONSE`Result:

Zde používáme další proměnnou skriptu:RESPONSE. Obsahuje odpověď služby. - daily.txt:
Ahoj, malý! Mám se dobře, sleduji službu: "$MSMS_SERVICE_NAME" každou minutu... A jak se máš ty?Result:

Přejdeme k implementaci skriptů.
Skript pro monitorování
monitoring.sh provádí jednoduché auto-objevování — vezme všechny ini-soubory z adresáře services a pro každý spustí hlavní skript s logikou pro kontrolu a zasílání upozornění:
#!/bin/bash
cd $(dirname "$0")/services
for service_ini in $(ls *.ini); do
bash ../msms.sh "$1" "$service_ini"
donePro vytvoření denní zprávy o stavu monitorování lze skriptu předat parametr DAILY.
Všimněte si, že při spuštění skriptu se aktuální adresář změní na services. To umožňuje v ini-souborech uvádět cesty k souborům relativně k services.
Skript pro kontrolu a zasílání upozornění
msms.sh obsahuje hlavní logiku pro kontrolu služby a zasílání upozornění.
Práce s telegramem:
# 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
}
Tvoříme URL pro přístup k REST API telegramu, pomocí uloženého tajného klíče v souboru.
Funkce send_message používá curl k odeslání zpráv na toto REST API, přičemž bere ID příjemců ze souboru, který jsme určili v ini. V odesílaných datech uvádíme, že používáme formátování zpráv: parse_mode="Markdown".
Vytiskneme aktuální datum-čas a načteme ini-soubor.
echo $(date '+%Y-%m-%d %H:%M:%S')
# načíst proměnné z .ini souboru:
. $2
Magická řetězec . $2 provádí předaný jako druhý parametr ini-soubor jako běžný skript, ukládající v něm zadané hodnoty do proměnných prostředí.
Načteme očekávanou odpověď ze souboru, pokud je nastaven parametr MSMS_EXPECTED_FILE:
if [ -n "$MSMS_EXPECTED_FILE" ]; then
MSMS_EXPECTED="$(cat "$MSMS_EXPECTED_FILE")"
fi
Provedeme kontrolu služby se zasíláním upozornění, pokud je to nutné:
RESPONSE="$(eval curl $MSMS_CURL_PARAMS "$MSMS_SERVICE_ENDPOINT")"
EXIT_CODE=$?
if [[ $EXIT_CODE != 0 ]]; then
echo health-check "$MSMS_SERVICE_NAME" SELHALO: CURL EXIT S $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" SELHALO: "$RESPONSE"
MESSAGE="$(cat ..\/templates\/service-fail.txt)"
MESSAGE=$(eval echo $MESSAGE)
send_message "$MESSAGE"
else
echo health-check "$MSMS_SERVICE_NAME": OK
fi
Nejprve přiřadíme proměnné RESPONSE výsledek vykonání příkazu curl pro tuto službu.
Výraz EXIT_CODE=$? ukládá do proměnné výsledek provedení posledního příkazu, t.j. curl. Při nutnosti odeslání upozornění se načítá šablona z odpovídajícího souboru a provádí se rozesílání na příjemce pomocí send_message.
Poslední blok zpracovává parametr 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"
fiOdesílá zprávu potvrzující funkčnost samotného monitorování.
Získání seznamu id uživatelů
recipients-setup.sh ukládá se k API telegram pro získání posledních zpráv adresovaných botovi:
curl -s https:\/\/api.telegram.org\/bot$(cat telegram-api-key.txt)\/getUpdates
| python recipients-setup.pyZde se využívá magie python pro pěkné zobrazení seznamu. Není to nutné, lze jednoduše získat potřebné id z json, který vypíše příkaz:
torsocks curl -s https:\/\/api.telegram.org\/bot$(cat telegram-api-key.txt)\/getUpdatesZávěr
Tímto způsobem můžete používat hotové skripty a šablony zpráv, nastavující pouze sledované služby a seznamy pro upozornění; můžete vytvořit novou "osobnost" pro bota; nebo si můžete vytvořit vlastní řešení na základě navrhovaného.
Jako možnosti dalšího rozvoje se nabízí konfigurace a správa monitorování přímo v bottu, ale bez pythonu se tu neobejdete. Pokud to někdo stihne před mnou — víte, kam poslat pull request 🙂
Zdroj: habr.com



