
Ibland behöver man snabbt göra en övervakning för en ny tjänst, men det finns ingen färdig infrastruktur/expertis tillgänglig. I den här guiden kommer vi på en halvtimme att implementera ett verktyg för att övervaka vilken webbservice som helst, enbart med hjälp av inbyggda verktyg i Ubuntu: bash, cron och curl. För att skicka notifieringar kommer vi att använda Telegram.
«Körsbäret på toppen» blir det känslomässiga engagemanget från användarna. Testat på människor - det fungerar.
När vi på telemedicintjänsten Doktor Runt skapade en chatbot för att bedöma användarnas stressnivåer, behövde vi övervakning. Inom några timmar skapades ett miniprojekt som inte bara fungerar utmärkt, utan också ger positiva meddelanden.
För att börja, låt oss hämta repositoriet med skripten:
git clone https://github.com/rshekhovtsov/msms.gitVi går in i mappen msms och arbetar där.
Om Telegram är blockerat kan du använda en proxy. Det enklaste och mest pålitliga alternativet är torsocks:
sudo apt install tor
sudo apt install torsocksSom exempel ska vi sätta upp övervakning av startsidan google.com i tre steg.
STEG 1. Skapa en bot i Telegram och få användarens id.
- I sökfältet för kontakter i Telegram söker vi efter :

- Starta det med knappen Start, skriv kommandot /newbot och besvara frågorna. Tänk på att namnet är botens namn som kommer att visas för användarna, medan användarnamnet är unikt och måste sluta med «bot»:

Bland annat kommer boten att ge en hemlig token för HTTP API som du måste kopiera och spara i filen telegram-api-key.txt i mappen msms. - Sök i Telegram efter namnet på vår bot och starta den.
- Som ett sista steg kommer vi att lägga till oss själva i listan över mottagare av övervakningsnotifieringar:
sudo chmod +x ./recipients-setup.sh torsocks ./recipients-setup.shSkriptet kommer att visa en lista över de senaste referenserna till boten, där det ska finnas en rad med våra id:n och namn i Telegram. Ta detta id och spara det i filen services/google-recipients.txt. Formatet på filen är: varje rad - ett id. Exempel:
123456789 987654321
För att lägga till en ny mottagare behöver du be dem att starta boten i Telegram, köra recipients-setup.sh och lägga till id:t i filen.
STEG 2. Sätt upp övervakning.
Beskrivningen av tjänsten sker genom att skapa en ini-fil i mappen services. Fem parametrar behöver anges:
- MSMS_SERVICE_NAME: namnet på tjänsten - kommer att användas i notifieringar och övervakningsloggen.
- MSMS_SERVICE_ENDPOINT: tjänstens endpoint, som vi kommer att anropa med curl.
- MSMS_CURL_PARAMS: ytterligare curl-parametrar, se exemplet nedan.
- MSMS_EXPECTED: det förväntade svaret från tjänsten. Används om svaret är kort.
- MSMS_EXPECTED_FILE: filnamnet med det förväntade svaret från tjänsten. Om angivet, skriver det över MSMS_EXPECTED.
- MSMS_RECIPIENTS: filen med listan över mottagare av meddelanden.
En begäran till google.com returnerar fast html med en omdirigering, vi kommer att använda det som det förväntade svaret från servern:
curl google.com > services/google-response.htmlVi skapar filen services/google.ini:
MSMS_SERVICE_NAME='google front page'
# tjänstens slutpunkt
MSMS_SERVICE_ENDPOINT='google.com'
# curl parametrar
MSMS_CURL_PARAMS='-s --connect-timeout 3 -m 7'
# förväntat svar från tjänsten
MSMS_EXPECTED_FILE='google-response.html'
# filen med mottagarlistan
MSMS_RECIPIENTS='google-recipients.txt' I MSMS_CURL_PARAMS du kan ange allt som curl kan göra, inklusive:
- Stäng av curl-meddelanden så att de inte skräpar ner konsolen och loggen:
-s - Ange tid för anslutning till den kontrollerade tjänsten (i sekunder):
--connect-timeout 3 - Ange tidsgräns för att ta emot svar:
-m 7 - Stäng av certifikatkontrollen för SSL (till exempel om en självsignerad certifikat används):
--insecure - Ange typ av http-begäran:
-X POST - Ange rubriker:
-H "Content-Type: application/json" - Ange kropp av begäran som en sträng eller en fil. Exempel för en fil:
-d @request.json
Vi har stängt av meddelanden och angett tidsgränser på 3 sekunder för anslutning och 7 sekunder för att ta emot svar från tjänsten.
Observera: ange värdena för parametrarna inom enkla citationstecken, som i exemplet. Tyvärr är bash ganska skört på det området, och en oavsiktligt placerad citationstecken kan leda till svårdiagnostiserade fel.
Vi har ställt in övervakningen. Låt oss kontrollera att allt ser bra ut:
sudo chmod +x ./monitoring.sh
torsocks ./monitoring.shSkriptet ska skriva ut ett meddelande av följande typ:
2020-01-10 12:14:31
health-check "google front page": OKSTEG 3. Ställer in schemat
Vi ställer in övervakningsschemat i cron:
sudo crontab -eVi lägger till en rad för att kontrollera google.com varje minut:
*/1 * * * * torsocks /monitoring.sh >> /monitoring.log 2>&1Vi lägger till ett meddelande som bekräftar att övervakningen fungerar varje dag klockan 11.00. För detta skickar vi parameter DAILY till skriptet:
0 11 * * * torsocks /monitoring.sh DAILY >> /monitoring.log 2>&1
2>&1 — en standardmetod som omdirigerar fel till huvudutmatningsströmmen. Resultatet är att de också kommer att hamna i övervakningsloggen.
Vi sparar ändringarna och laddar dem med kommandot:
sudo service cron reloadLäs mer om att konfigurera cron, till exempel. .
På så sätt kommer ett övervakningsskript att köras varje minut, vilket kommer att anropa google.com via curl. Om det mottagna svaret skiljer sig från det förväntade kommer skriptet att skicka en notifikation till mottagarlistan i telegram. Kontrollloggen sparas i filen monitoring.log.
Om du behöver lägga till ytterligare en tjänst skapar vi helt enkelt en ny ini-fil för den i mappen services och, om nödvändigt, bildar en separat mottagarlista. Allt annat kommer att fungera automatiskt.
Om den kontrollerade tjänsten blir otillgänglig kommer notifieringen att komma varje minut. Om det inte går att återställa tjänsten snabbt kan du tillfälligt stänga av notifikationerna i botens egenskaper i telegram.
Låt oss nu noggrant gå igenom de ytterligare funktionerna och implementeringen av skripten.
Meddelandemallar och känslomässigt engagemang.
För att göra kommunikationen med boten mer levande har vi döpt den till Maneczka, lagt till en passande profilbild och anlitat professionella PR-folk för att skapa meddelandetexter. Du kan använda våra arbeten eller byta dem till din egen smak.
Till exempel så här:

eller till och med så här:

Varför inte?
Botenamn och avatar ställs in via .
Meddelandemallarna ligger i mappen templates:
- curl-fail.txt: meddelandet som skickas om curl returnerar en icke-noll felkod. Det innebär vanligtvis att det inte går att nå tjänsten.
- daily.txt: ett dagligt meddelande som bekräftar att övervakningen av tjänsten fungerar.
- service-fail.txt: meddelandet som skickas om svaret från tjänsten skiljer sig från det förväntade.
Vi går igenom anpassningsmöjligheterna med hjälp av de inbyggda meddelandemallarna.
I mallarna används emojis. Tyvärr visar habr dem inte.
För att hitta emojis är det enkelt att använda sökningen på :

Du kopierar helt enkelt den lämpliga symbolen och klistrar in den i texten i mallen (detta är vanlig unicode).
- curl-fail.txt:
Kattunge, hjälp mig... Jag kan inte nå tjänsten "$MSMS_SERVICE_NAME" `CURL EXIT CODE: $EXIT_CODE`Vi använde det namn på tjänsten som vi angav (variabeln
MSMS_SERVICE_NAME) och skriptets interna variabel med curl:s avslutningskod (EXIT_CODE). Vi formaterade också meddelandet med hjälp av markup : tecken "`" omger text med fast bredd. Eftersom citattecken och apostrofer är specialtecken i bash, så undviker vi dem med tecknet "". Variabelnamn föregås med tecknet "$".Resultatet:

- service-fail.txt:
Katten, hjälp mig... Tjänsten "$MSMS_SERVICE_NAME" har gjort mig besviken Den fungerar inte som den ska, här är vad den svarar mig: `$RESPONSE`Resultatet:

Här använder vi en annan skriptvariabel:RESPONSE. Den innehåller svaret från tjänsten. - daily.txt:
Hej lilla! Jag har det bra, jag övervakar tjänsten: "$MSMS_SERVICE_NAME" varje minut... Hur är det med dig?Resultatet:

Låt oss gå vidare till att implementera skripten.
Övervakningsskriptet
monitoring.sh gör en enkel automatisk upptäckning – den tar alla ini-filer från mappen services och för varje kör det huvudskriptet med logiken för kontroll och meddelandeutskick:
#!/bin/bash
cd $(dirname "$0")/services
for service_ini in $(ls *.ini); do
bash ../msms.sh "$1" "$service_ini"
doneFör att skapa ett dagligt meddelande om övervakningsstatusen kan skriptet ta parameter DAILY.
Observera att när skriptet startas ändras den aktuella mappen till services. Detta gör att ini-filerna kan ange vägar till filer relativt till services.
Skript för kontroll och meddelandeutsändning
msms.sh innehåller den grundläggande logiken för att kontrollera tjänsten och skicka meddelanden.
Arbete 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 formar en URL för att få åtkomst till REST API för telegram, genom att använda den hemliga nyckel som är sparad i filen.
Funktionen send_message använder curl för att skicka meddelanden till detta REST API, där den hämtar mottagarens id från den fil vi angett i ini. I de data som skickas anger vi att vi använder meddelandets format: parse_mode="Markdown".
Låt oss skriva ut det aktuella datumet och tiden och ladda ini-filen.
echo $(date '+%Y-%m-%d %H:%M:%S')
# ladda variabler från .ini fil:
. $2
Magisk sträng . $2 utför den ini-fil som skickas in som det andra parametern som ett vanligt skript, vilket sparar värdena i miljövariabler.
Låt oss ladda det förväntade svaret från filen, om parametern angivits MSMS_EXPECTED_FILE:
if [ -n "$MSMS_EXPECTED_FILE" ]; then
MSMS_EXPECTED="$(cat "$MSMS_EXPECTED_FILE")"
fi
Genomför en kontroll av tjänsten och skicka meddelanden om nödvändigt:
RESPONSE="$(eval curl $MSMS_CURL_PARAMS "$MSMS_SERVICE_ENDPOINT")"
EXIT_CODE=$?
if [[ $EXIT_CODE != 0 ]]; then
echo health-check "$MSMS_SERVICE_NAME" HAR MISSLYCKATS: 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" HAR MISSLYCKATS: "$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 tilldelar vi variabeln RESPONSE resultatet av curl-kommandot för den aktuella tjänsten.
Uttrycket EXIT_CODE=$? lagrar resultatet av den senaste kommandots utförande, dvs. curl. Vid behov av att skicka en avisering, läses mallen från motsvarande fil och distribueras till mottagarna med hjälp av send_message.
Den sista blocket hanterar parametern 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 skickar ett meddelande som bekräftar att övervakningen fungerar.
Hämtar listan över användar-id:n
recipients-setup.sh anropar Telegrams API för att hämta de senaste meddelandena som adresserats till boten:
curl -s https:\/\/api.telegram.org\/bot$(cat telegram-api-key.txt)\/getUpdates
| python recipients-setup.pyHär används python-magi för att vackert skriva ut listan. Detta är valfritt, man kan helt enkelt ta det id man behöver från json som kommandot skriver ut:
torsocks curl -s https:\/\/api.telegram.org\/bot$(cat telegram-api-key.txt)\/getUpdatesSlutsats
Således kan du använda färdiga skript och meddelandemallar, endast ställa in de övervakade tjänsterna och listorna för aviseringar; du kan skapa en ny "identitet" för boten; eller så kan du göra din egen lösning baserat på det som föreslagits.
Som alternativ för vidare utveckling vore det bra att konfigurera och hantera övervakningen direkt i boten, men här kommer du inte undan python. Om någon hinner före mig — ni vet vart ni kan ladda upp pull request 🙂
Källa: habr.com



