
Nogle gange er det nødvendigt hurtigt at oprette overvågning for en ny tjeneste, men der er ikke nogen klar infrastruktur eller ekspertise tilgængelig. I denne guide skaber vi et værktøj til overvågning af enhver webtjeneste på under en halv time, kun ved hjælp af de indbyggede værktøjer i Ubuntu: bash, cron og curl. Til at sende notifikationer vil vi bruge Telegram.
Den "kirsebær på kagen" vil være den følelsesmæssige involvering af brugerne. Testet på mennesker – det virker.
Da vi i telemedicinsk tjeneste, Doktor Tæt På, oprettede en chatbot til at bestemme brugernes stressniveau, havde vi brug for overvågning. På et par timer blev der lavet et mini-projekt, som ikke kun fungerer fremragende, men også tilføjer positivitet med sine beskeder.
Først, lad os hente repository med scripts:
git clone https://github.com/rshekhovtsov/msms.gitVi går ind i mappen msms og arbejder videre derfra.
Hvis Telegram er blokeret, skal du bruge en proxy. Den enkleste og mest pålidelige løsning er torsocks:
sudo apt install tor
sudo apt install torsocksSom et eksempel vil vi i tre trin opsætte overvågning af startsiden google.com.
TRIN 1. Opret en bot i Telegram og få bruger-ID.
- I søgefeltet i Telegram søger vi :

- Vi starter den ved at trykke på knappen Start, indtaster kommandoen /newbot og svarer på spørgsmålene. Det er vigtigt at huske, at name – det er botens navn, som synliggøres for brugerne, mens username – er unikt og skal ende på "bot":

Blandt andet vil boten give en hemmelig token til HTTP API, som skal kopieres og gemmes i filen telegram-api-key.txt i mappen msms. - Vi indtaster navnet på vores bot i søgefeltet i Telegram, og starter den.
- Som en sidste detalje tilføjer vi os selv til listen over modtagere af overvågningsnotifikationer:
sudo chmod +x ./recipients-setup.sh torsocks ./recipients-setup.shScriptet viser en liste over de seneste anmodninger til boten, der skal være en linje med vores ID og navn i Telegram. Vi tager dette ID og gemmer det i filen services/google-recipients.txt. Formatet på filen: hver linje er ét ID. Eksempel:
123456789 987654321
For at tilføje en ny modtager skal vi bede dem om at starte boten i Telegram, køre recipients-setup.sh og tilføje ID til filen.
TRIN 2. Opsæt overvågning.
Beskrivelsen af tjenesten sker ved at oprette en ini-fil i mappen services. Vi skal angive fem parametre:
- MSMS_SERVICE_NAME: navnet på tjenesten – vil blive brugt i notifikationer og overvågningsloggen.
- MSMS_SERVICE_ENDPOINT: endpoint for tjenesten, som vi vil tilgå med curl.
- MSMS_CURL_PARAMS: yderligere curl-parametre, se eksemplet nedenfor.
- MSMS_EXPECTED: det forventede svar fra tjenesten. Bruges, hvis svaret er kort.
- MSMS_EXPECTED_FILE: filnavnet med det forventede svar fra tjenesten. Hvis angivet, overskriver det MSMS_EXPECTED.
- MSMS_RECIPIENTS: filen med listen over modtagere af meddelelser.
Forespørgslen til google.com returnerer et fast html med redirect, vi vil bruge det som det forventede svar fra serveren:
curl google.com > services/google-response.htmlLad os oprette filen services/google.ini:
MSMS_SERVICE_NAME='google startside'
# service endpoint
MSMS_SERVICE_ENDPOINT='google.com'
# curl parametre
MSMS_CURL_PARAMS='-s --connect-timeout 3 -m 7'
# forventet service svar
MSMS_EXPECTED_FILE='google-response.html'
# modtagerlistefil
MSMS_RECIPIENTS='google-recipients.txt' I MSMS_CURL_PARAMS man kan angive alt, hvad curl kan, herunder:
- Deaktiver curl-meddelelser for ikke at fylde konsollen og loggen:
-s - Angiv timeout for forbindelse til den kontrollerede tjeneste (i sekunder):
--connect-timeout 3 - Angiv timeout for modtagelse af svar:
-m 7 - Deaktiver certifikatkontrol for SSL (f.eks. hvis der bruges et selvsigneret certifikat):
--insecure - Angiv typen af http-anmodning:
-X POST - Angiv overskrifter:
-H "Content-Type: application/json" - Angiv kroppen af anmodningen som en streng eller fil. Eksempel for fil:
-d @request.json
Vi har deaktiveret meddelelser og angivet timeouts på 3 sek. for forbindelse og 7 sek. for modtagelse af svar fra tjenesten.
Bemærk: angiv værdierne for parametrene i enkelt citationstegn, som i eksemplet. Desværre er bash ret skrøbeligt i denne henseende, og en utilsigtet korrekt placeret citationstegn kan føre til meget vanskelige fejl.
Vi har konfigureret overvågningen. Lad os tjekke, at alt er i orden:
sudo chmod +x ./monitoring.sh
torsocks ./monitoring.shScriptet skal returnere en meddelelse af typen:
2020-01-10 12:14:31
health-check "google startside": OKTRIN 3. Konfigurerer tidsplanen
Lad os konfigurere overvågningsplanen i cron:
sudo crontab -eLad os tilføje en linje til at tjekke google.com hvert minut:
*/1 * * * * torsocks /monitoring.sh >> /monitoring.log 2>&1Lad os tilføje en daglig meddelelse kl. 11.00, der bekræfter overvågningens funktionalitet. Til dette giver vi scriptet parameteren DAILY:
0 11 * * * torsocks /monitoring.sh DAILY >> /monitoring.log 2>&1
2>&1 — standardmetode, der omdirigerer fejl til hoveduddataene. Som følge heraf vil de også komme i overvågningsloggen.
Lad os gemme ændringerne og anvende dem med kommandoen:
sudo service cron reloadLæs mere om konfiguration af cron, for eksempel .
På den måde vil et overvågningsscript køre hvert minut, som via curl kontakter google.com. Hvis svaret adskiller sig fra det forventede, vil scriptet sende en meddelelse til listen af modtagere i telegram. Loggen over tjek opbevares i filen monitoring.log
Hvis vi skal tilføje en anden tjeneste, opretter vi blot en ny ini-fil til den i mappen services og, hvis nødvendigt, danner vi en separat liste over modtagere. Alt andet vil fungere automatisk.
Hvis den kontrollerede tjeneste bliver utilgængelig, vil meddelelser komme hvert minut. Hvis tjenesten ikke hurtigt kan genoprettes, kan meddelelser midlertidigt deaktiveres i botens indstillinger i telegram.
Lad os nu gennemgå de ekstra funktioner og implementeringen af scriptet i detaljer.
Meddelelses skabeloner og følelsesmæssig involvering
For at gøre kommunikationen med botten mere levende, kaldte vi den Manéčka, tilføjede et passende avatarbillede og hyrede professionelle PR-folk til at skrive meddelelser. Du kan bruge vores udviklinger eller ændre dem til din smag.
For eksempel sådan:

eller endda sådan:

Hvorfor ikke?
Botens navn og avatar indstilles via .
Meddelelses skabelonerne findes i mappen templates:
- curl-fail.txt: meddelelsen, der sendes i tilfælde af, at curl returnerer en ikke-nul fejlkode. Dette betyder normalt, at det ikke er muligt at kontakte tjenesten.
- daily.txt: en daglig meddelelse, der bekræfter, at overvågningen af tjenesten fungerer.
- service-fail.txt: meddelelsen, der sendes, hvis tjenestens svar adskiller sig fra det forventede.
Lad os gennemgå mulighederne for tilpasning med udgangspunkt i de indbyggede meddelelsesskabeloner.
Skabelonerne bruger emojier. Desværre viser habr dem ikke.
For at finde emojier er det nemt at bruge søgningen på :

Den passende symbol kan nemt kopieres og indsættes i tekstskabelonen (det er almindelig unicode).
- curl-fail.txt:
Killing, hjælp mig... Kan ikke kontakte tjenesten "$MSMS_SERVICE_NAME" `CURL EXIT CODE: $EXIT_CODE`Vi brugte det navn, vi har angivet for tjenesten (variabel
MSMS_SERVICE_NAME) og scriptets interne variabel med curl's afslutningskode (EXIT_CODE). Vi har også formateret meddelelsen ved hjælp af markup : tegnene "`" omkranser tekst med fast bredde. Da citater og apostrofer er reserved tegn i bash, undgår vi dem ved at escape dem med "". Variabelnavne indledes med "$".Resultat:

- service-fail.txt:
Kattunge, hjælp mig... Tjenesten "$MSMS_SERVICE_NAME" har skuffet mig Den fungerer ikke korrekt, og her er hvad den svarer mig: `$RESPONSE`Resultat:

Her bruger vi endnu en variabel i skriptet:RESPONSE. Den indeholder svaret fra tjenesten. - daily.txt:
Hej lille! Jeg har det godt, jeg holder øje med tjenesten: "$MSMS_SERVICE_NAME" hvert minut... Hvordan har du det?Resultat:

Lad os gå videre til implementeringen af skriptene.
Overvågningsskript
monitoring.sh foretager en simpel auto-discovery – tager alle ini-filer fra mappen services og kører hovedskriptet med logikken for kontrol og varsling for hver enkelt:
#!/bin/bash
cd $(dirname "$0")/services
for service_ini in $(ls *.ini); do
bash ../msms.sh "$1" "$service_ini"
doneFor at danne den daglige statusmeddelelse kan skriptet tage parameteren DAILY.
Bemærk, at når skriptet startes, ændres den nuværende mappe til services. Dette gør det muligt at angive stier til filer relativt til services i ini-filerne.
Skript til kontrol og varsling
msms.sh indeholder den grundlæggende logik for kontrol af tjenesten og varsling.
Arbejder med 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
}
Vi danner URL'en til adgang til REST API'en for telegram, ved at bruge den gemte hemmelige nøgle i filen.
Funktionen send_message bruger curl til at sende meddelelser til denne REST API, og henter id'erne på modtagere fra filen, som vi angivet i ini. I de sendte data angiver vi, at vi bruger meddelelsesformatering: parse_mode="Markdown".
Vi udskriver den nuværende dato og tid og indlæser ini-filen.
echo $(date '+%Y-%m-%d %H:%M:%S')
# indlæs variabler fra .ini fil:
. $2
Den magiske linje . $2 udfører den ini-fil, der er givet som det andet parameter, som et normalt skript og gemmer de angivne værdier i miljøvariabler.
Vi indlæser det forventede svar fra filen, hvis parameteren er angivet MSMS_EXPECTED_FILE:
if [ -n "$MSMS_EXPECTED_FILE" ]; then
MSMS_EXPECTED="$(cat "$MSMS_EXPECTED_FILE")"
fi
Vi udfører kontrol af tjenesten med varsling, hvis det er nødvendigt:
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
Først tildeler vi variablen RESPONSE resultatet af curl kommandoen for denne tjeneste.
Udsagn EXIT_CODE=$? beholder resultatet af den seneste kommando, dvs. curl. Ved behov for at sende en meddelelse, læses skabelonen fra den relevante fil, og der foretages distribution til modtagere via send_message.
Den sidste blok behandler parameteren 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"
fiDet sender en meddelelse, der bekræfter funktionaliteten af selve monitoreringen.
Hentning af listen over bruger-id'er
recipients-setup.sh kommunikerer med Telegram API for at hente de seneste beskeder rettet til botten:
curl -s https:\/\/api.telegram.org\/bot$(cat telegram-api-key.txt)\/getUpdates
| python recipients-setup.pyHer bruges python-magi til pænt at vise listen. Dette er ikke nødvendigt, du kan blot tage det ønskede id fra json, som kommandoen vil vise:
torsocks curl -s https:\/\/api.telegram.org\/bot$(cat telegram-api-key.txt)\/getUpdatesKonklusion
Dermed kan du bruge færdige scripts og beskedskabeloner, kun tilpasse de overvågede tjenester og lister til notifikationer; du kan oprette en ny "identitet" for botten; eller du kan lave din egen løsning baseret på det foreslåede.
Muligheder for videreudvikling indbefatter konfiguration og styring af monitoreringen direkte i botten, men her kommer man ikke uden python. Hvis nogen kommer til det før mig – I ved, hvor pull requesten skal sendes 🙂
Kilde: habr.com



