
Ndonjëherë është e nevojshme të bëni një monitorim të shpejtë për një shërbim të ri, dhe s’ka infrastrukturë/gjykim të gatshëm. Në këtë udhëzues, do të implementojmë një mjet për monitorimin e çdo shërbimi web brenda gjysmë ore, duke përdorur vetëm mjete të ndërtuara në ubuntu: bash, cron dhe curl. Për dërgimin e njoftimeve do të përdorim telegramin.
«Kule mbi tortë» do të jetë angazhimi emocional i përdoruesve. E testuar mbi njerëz - funksionon.
Kur ne në shërbimin telemedicinal Doktor Rruga krijuam një chatbot për të përcaktuar nivelin e stresit të përdoruesve, na duhej monitorimi. Brenda disa orëve u realizua një mini-projekt që jo vetëm funksionon shkëlqyeshëm, por shton edhe pozitivitet me mesazhet e tij.
Për të filluar, le të marrim depozitën me skriptet:
git clone https://github.com/rshekhovtsov/msms.gitKalo në dosjen msms dhe vazhdo punën aty.
Nëse telegrami është i bllokuar, përdorni proxy. Mënyra më e thjeshtë dhe e besueshme është torsocks:
sudo apt install tor
sudo apt install torsocksSi një shembull, do të konfigurojmë monitorimin e faqes fillestare google.com në tre hapa.
HAPI 1. Krijoni një bot në telegram dhe merrni id-në e përdoruesit.
- Në ngushticën e kërkimeve për kontakte në telegram kërkoni :

- Niseni atë duke e shtypur butonin Start, shkruani komandën /newbot dhe përgjigjuni pyetjeve. Duhet të kemi parasysh se emri - është emri i botit që do të shfaqet për përdoruesit, ndërsa emri përdorues - është unik dhe duhet të përfundojë me «bot»:

Përveç të tjerëve, boti do të japë një token sekret për HTTP API, të cilin duhet ta kopjoni dhe ta ruani në skedarin telegram-api-key.txt në dosjen msms. - Kërkojmë në linjën e kërkimit të telegramit emrin e botit tonë dhe e nisëm atë.
- Si një përfundim, le të shtojmë veten në listën e marrësve të njoftimeve të monitorimit:
sudo chmod +x ./recipients-setup.sh torsocks ./recipients-setup.shSkripti do të nxjerrë një listë të kërkesave të fundit për botin, aty duhet të ketë një rresht me id-në dhe emrin tonë në telegram. Marrim këtë id dhe e ruajmë në skedarin services/google-recipients.txt. Formati i skedarit: çdo rresht - një id. Shembuj:
123456789 987654321
Për të shtuar një marrës të ri, duhet ta kërkoni që ai të nisë botin në telegram, të nisë recipients-setup.sh dhe të shtojë id-në në skedar.
HAPI 2. Konfigurojmë monitorimin.
Përshkrimi i shërbimit bëhet përmes krijimit të një skedari ini në dosjen services. Duhet të caktosh pesë parametra:
- MSMS_SERVICE_NAME: emri i shërbimit - do të përdoret në njoftime dhe regjistrin e monitorimit.
- MSMS_SERVICE_ENDPOINT: endpoint i shërbimit, të cilit do t’i drejtohemi me curl.
- MSMS_CURL_PARAMS: parameteret e tjera curl, shihni shembullin më poshtë.
- MSMS_EXPECTED: përgjigja e pritur nga shërbimi. Përdoret kur përgjigja është e shkurtër.
- MSMS_EXPECTED_FILE: emri i skedarit me përgjigjen e pritur nga shërbimi. Nëse është e specifikuar, tejkalon MSMS_EXPECTED.
- MSMS_RECIPIENTS: skedari me listën e marrësve të njoftimeve.
Kërkesa për google.com kthen HTML të fikosur me ridrejtim, do ta përdorim atë si përgjigje të pritur nga serveri:
curl google.com > services/google-response.htmlDo të krijojmë skedarin services/google.ini:
MSMS_SERVICE_NAME='faqja kryesore google'
# pika e fundit të shërbimit
MSMS_SERVICE_ENDPOINT='google.com'
# parametrat curl
MSMS_CURL_PARAMS='-s --connect-timeout 3 -m 7'
# përgjigja e pritur e shërbimit
MSMS_EXPECTED_FILE='google-response.html'
# skedari i listës së marrësve
MSMS_RECIPIENTS='google-recipients.txt' Në MSMS_CURL_PARAMS mund të specifikoni gjithçka që do curl, përfshirë:
- Çaktivizoni mesazhet curl, për të mos mbushur konsolën dhe logun:
-s - Specifikoni kohën e lidhjes me shërbimin që po kontrolloni (në sekonda):
--connect-timeout 3 - Specifikoni kohën për marrjen e përgjigjes:
-m 7 - Çaktivizoni verifikimin e certifikatës për SSL (për shembull, nëse përdoret një certifikatë e vetë-nënshkruar):
--insecure - Specifikoni llojin e kërkesës http:
-X POST - Specifikoni titujt:
-H "Content-Type: application/json" - Specifikoni trupin e kërkesës si një string ose skedar. Shembuj për skedarin:
-d @request.json
Ne çaktivizuam njoftimet dhe specifikuam kohët 3 sek. për lidhjen dhe 7 sek. për marrjen e përgjigjes nga shërbimi.
Kujdes: përcaktoni vlerat e parametrave në thonjëza të vetme, si në shembull. Fatkeqësisht, bash është mjaft i brishtë në këtë aspekt, dhe një flutur e rastësishme e vendosur gabimisht mund të çojë në shkatërrimin e universit me gabime të vështira për tu diagnostikuar.
Ne konfiguruam monitorimin. Do të kontrollojmë që gjithçka është OК:
sudo chmod +x ./monitoring.sh
torsocks ./monitoring.shSkripta duhet të japë një mesazh të këtij tipi:
2020-01-10 12:14:31
health-check "faqja kryesore google": OKHAPI 3. Konfigurojmë orarin
Konfigurojmë orarin e monitorimit në cron:
sudo crontab -eShtojmë një rresht për kontrollin çdo minutë të google.com:
*/1 * * * * torsocks /monitoring.sh >> /monitoring.log 2>&1Shtojmë çdo ditë në 11:00 një njoftim për të konfirmuar funksionalitetin e vetë monitorimit. Për këtë do të kalojmë në skript parameterin DAILY:
0 11 * * * torsocks /monitoring.sh DAILY >> /monitoring.log 2>&1
2>&1 — një metodë standarde që ridrejton gabimet në rrjedhën kryesore të output-it. Në këtë mënyrë, ato gjithashtu do të shkojnë në regjistrin e monitorimit.
Ruajmë ndryshimet dhe i aplikojmë ata me komandën:
sudo service cron reloadMë shumë për konfigurimin e cron mund të lexoni, për shembull, .
Kështu, çdo minutë do të nisë një skript monitorimi, i cili do ta thërrasë google.com me curl. Nëse përgjigjja e marrë është ndryshe nga ajo e pritur, skripti do të dërgojë një njoftim në listën e marrësve në telegram. Dita e kontrolleve mbahet në skedarin monitoring.log
Nëse nevojitet të shtoni një shërbim tjetër, thjesht krijoni një skedar të ri ini për të në dosjen services dhe, nëse është e nevojshme, formoni një listë të veçantë marrësish. E gjithë pjesa tjetër do të funksionojë automatikisht.
Nëse shërbimi i kontrolluar bëhet i paaksesueshëm, njoftimi do të vijë çdo minutë. Nëse nuk arrini ta riktheni shërbimin shpejt, mund të çaktivizoni përkohësisht njoftimet në pronësitë e botos në telegram.
Tani le të shqyrtojmë në detaje mundësitë shtesë dhe realizimin e skripteve.
Shabllonat e mesazheve dhe angazhimi emocional
Për ta bërë komunikimin me botin më të gjallë, e emruam atë Manekë, shtuam një foto-avataar përkatëse dhe angazhuam profesionistë të PR për të krijuar tekstet e mesazheve. Mund të përdorni zhvillimet tona ose t’i ndryshoni sipas dëshirës tuaj.
Për shembull kështu:

ose madje kështu:

Pse jo?
Emri i botit dhe avatarja përcaktohen përmes .
Shabllonat e mesazheve ndodhen në dosjen templates:
- curl-fail.txt: mesazhi që dërgohet në rast se curl kthen një kod gabimi të ndryshëm nga zero. Zakonisht tregon për pamundësinë e arritjes në shërbim.
- daily.txt: mesazhi që konfirmon se monitorimi i shërbimit po funksionon çdo ditë.
- service-fail.txt: mesazhi që dërgohet në rast se përgjigjja e shërbimit është ndryshe nga ajo e pritur.
Le të shqyrtojmë mundësitë e personalizimit përmes shembujve të shablloneve të integruara.
Në shabllone përdoren emoji. Fatkeqësisht, habr nuk i shfaq ato.
Për të gjetur emoji të përshtatshme, është e dobishme të përdorni kërkimin në :

Thjesht kopjoni simbolin e përshtatshëm dhe ngjitni atë në tekstin e shabllonit (kjo është Unicode e zakonshme).
- curl-fail.txt:
Kati, më ndihmo... Nuk mund të arrij shërbimin "$MSMS_SERVICE_NAME" `KODI I DËRGESËS: $EXIT_CODE`Ne e përdorim emrin e shërbimit të caktuar nga ne (variabla
MSMS_SERVICE_NAME) dhe një variabël të brendshme të skriptit me kodin e daljes së curl (EXIT_CODE). Për më tepër, ne e formatuam mesazhin duke përdorur shënjimin : simbolet "`" përfshijnë tekstin me gjerësi fikse. Duke qenë se citatet dhe apostrofët janë simbole të rezervuara të bash, ne i escapojmë ato me simbolin "". Emrat e variablave paraqiten me shenjën "$".Rezultati:

- service-fail.txt:
Mace, më ndihmo... Shërbimi "$MSMS_SERVICE_NAME" më ka mërzitur Ai nuk punon siç duhet, kjo është ajo që më kthen: `$RESPONSE`Rezultati:

Këtu po përdorim një variabël tjetër të skriptit:RESPONSE. Ai përmban përgjigjen e shërbimit. - daily.txt:
Bebe, përshëndetje! Unë jam mirë, po mbaj nën vëzhgim shërbimin: "$MSMS_SERVICE_NAME" çdo minutë... Si është puna te ti?Rezultati:

Të kalojmë në implementimin e skripteve.
Skripti i monitorimit
monitoring.sh bën një auto-discovery të thjeshtë — merr të gjitha skedarët ini nga dosja services dhe për secilin ekzekuton skriptin kryesor me logjikën e kontrollit dhe dërgimin e njoftimeve:
#!/bin/bash
cd $(dirname "$0")/services
for service_ini in $(ls *.ini); do
bash ../msms.sh "$1" "$service_ini"
donePër të formuar një mesazh të përditshëm mbi statusin e monitorimit, skripti mund të marrë parametrin DAILY.
Kujdes, kur niset skripti, dosja aktuale ndryshohet në services. Kjo lejon që në skedarët ini të indicohen rrugët e skedarëve në lidhje me services.
Skripti i kontrollit dhe dërgimit të njoftimeve
msms.sh përmban logjikën kryesore të kontrollit të shërbimit dhe dërgimit të njoftimeve.
Puna me telegram:
# 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
}
Formojmë URL për qasje në REST API të telegramit, duke përdorur çelësin sekret të ruajtur në skedarin.
Funksioni send_message përdor curl për të dërguar mesazhe në këtë REST API, duke marrë id-të e marrësve nga skedari që kemi treguar në ini. Në të dhënat e dërguara, ne tregojmë se po përdorim formate mesazhesh: parse_mode="Markdown".
Do të printojmë datën dhe orën aktuale dhe do të ngarkojmë skedarin ini.
echo $(date '+%Y-%m-%d %H:%M:%S')
# ngarko variablat nga skedari .ini:
. $2
Vija magjike . $2 ekzekuton skedarin ini të kaluar si parametri i dytë si një skript të zakonshëm, duke vendosur vlerat e caktuara në të në variablat e mjedisit.
Do të ngarkojmë përgjigjen e pritur nga skedari, nëse është caktuar parametri MSMS_EXPECTED_FILE:
nëse [ -n "$MSMS_EXPECTED_FILE" ]; atëherë
MSMS_EXPECTED="$(cat "$MSMS_EXPECTED_FILE")"
fi
Do të kryejmë kontrollin e shërbimit me dërgimin e njoftimeve, nëse është e nevojshme:
RESPONSE="$(eval curl $MSMS_CURL_PARAMS "$MSMS_SERVICE_ENDPOINT")"
EXIT_CODE=$?
if [[ $EXIT_CODE != 0 ]]; atëherë
echo kontrolli i shëndetit "$MSMS_SERVICE_NAME" DËSHTOI: CURL EXIT ME $EXIT_CODE
MESSAGE="$(cat ..\/templates\/curl-fail.txt)"
MESSAGE=$(eval echo $MESSAGE)
send_message "$MESSAGE"
elif [[ "$RESPONSE" != "$MSMS_EXPECTED" ]]; atëherë
echo kontrolli i shëndetit "$MSMS_SERVICE_NAME" DËSHTOI: "$RESPONSE"
MESSAGE="$(cat ..\/templates\/service-fail.txt)"
MESSAGE=$(eval echo $MESSAGE)
send_message "$MESSAGE"
else
echo kontrolli i shëndetit "$MSMS_SERVICE_NAME": OK
fi
Së pari, i caktojmë variablës RESPONSE rezultatin e ekzekutimit të komandës curl për këtë shërbim.
Shprehja EXIT_CODE=$? ajo në variabël rezultatet e ekzekutimit të komandës së fundit, dmth, curl. Nëse është e nevojshme të dërgoni një njoftim, modeli lexon nga skedari përkatës dhe realizon shpërndarjen te marrësit përmes send_message.
Blloku i fundit trajton parametrin DAILY:
nëse test "$1" = "DAILY"; atëherë
echo health-check "$MSMS_SERVICE_NAME" DAILY
MESAZHI="$(cat ..\/templates\/daily.txt)"
MESAZHI=$(eval echo $MESAZHI)
send_message "$MESAZHI"
fiAi dërgon një mesazh që konfirmon funksionalitetin e vetë monitorimit.
Marrja e listës së ID-ve të përdoruesve
recipients-setup.sh i drejtohet API-së së telegramit për të marrë mesazhet e fundit të dërguara në bot:
curl -s https:\/\/api.telegram.org\/bot$(cat telegram-api-key.txt)\/getUpdates
| python recipients-setup.pyKëtu përdoret magia e python-it për të nxjerrë listën në një format të bukur. Kjo nuk është e nevojshme, mund thjesht të merrni ID-në e nevojshme nga json-i që do të nxjerrë komanda:
torsocks curl -s https:\/\/api.telegram.org\/bot$(cat telegram-api-key.txt)\/getUpdatesPërfundim
Kështu mund të përdorni skenarët dhe modelet e mesazheve të gatshme, duke konfigurur vetëm shërbimet e monitorimit dhe listat për njoftime; mund të krijoni një "identitet" të ri për botin; ose mund të bëni zgjidhjen tuaj mbi atë të propozuar.
Si mundësi për zhvillimin e mëtejshëm sugjerohet konfigurimi dhe menaxhimi i monitorimit në vetë bot, por këtu pa python nuk keni për të kaluar. Nëse ndokush arrin ta bëjë më parë se unë — e dini se ku ta dërgoni pull request 🙂
Burimi: habr.com



