
Soms moet je snel een monitoring opzetten voor een nieuwe service, terwijl de nodige infrastructuur/expertise niet voorhanden is. In deze gids implementeren we in een halfuur een instrument voor het monitoren van elke webservice, met alleen de ingebouwde tools van Ubuntu: bash, cron en curl. Voor het verzenden van meldingen gebruiken we Telegram.
De 'kers op de taart' is de emotionele betrokkenheid van gebruikers. Bewezen bij mensen - het werkt.
Toen we bij de telemedicine dienst Dokter Dichtbij een chatbot voor het bepalen van het stressniveau van gebruikers creƫerden, hadden we monitoring nodig. In een paar uur was er een mini-project opgezet dat niet alleen uitstekend werkt, maar ook positiviteit toevoegt met zijn berichten.
Laten we beginnen met het verkrijgen van de repository met de scripts:
git clone https://github.com/rshekhovtsov/msms.gitWe gaan naar de map msms en werken daar verder.
Als Telegram is geblokkeerd, gebruik dan een proxy. De eenvoudigste en meest betrouwbare optie is torsocks:
sudo apt install tor
sudo apt install torsocksAls voorbeeld configureren we in drie stappen de monitoring van de startpagina google.com.
STAP 1. Maak een bot aan in Telegram en krijg de gebruikers-id.
- Zoek in de zoekbalk van contacten in Telegram. :

- Start het met de knop Start, voer het commando /newbot in en beantwoord de vragen. Houd er rekening mee dat de naam de naam van de bot is die aan gebruikers wordt weergegeven, terwijl de gebruikersnaam uniek moet zijn en eindigt op 'bot':

Onder andere zal de bot een geheime token voor de HTTP API geven, die je moet kopiƫren en opslaan in het bestand telegram-api-key.txt in de map msms. - Typ in de zoekbalk van Telegram de naam van onze bot en start deze.
- Als laatste stap voegen we onszelf toe aan de lijst van ontvangers van monitoringwaarschuwingen:
sudo chmod +x ./recipients-setup.sh torsocks ./recipients-setup.shHet script geeft een lijst weer van de laatste verzoeken aan de bot, daar zou ƩƩn regel moeten zijn met onze id en naam in Telegram. Neem deze id en sla deze op in het bestand services/google-recipients.txt. Formaat van het bestand: elke regel is ƩƩn id. Voorbeeld:
123456789 987654321
Om een nieuwe ontvanger toe te voegen, moet je hem vragen om de bot in Telegram te starten, recipients-setup.sh uit te voeren en de id aan het bestand toe te voegen.
STAP 2. Configureer de monitoring.
De beschrijving van de service gebeurt door een ini-bestand aan te maken in de map services. We moeten vijf parameters instellen:
- MSMS_SERVICE_NAME: de naam van de service - deze zal worden gebruikt in de meldingen en het monitoringlogboek.
- MSMS_SERVICE_ENDPOINT: endpoint van de service, waar we met curl verbinding mee zullen maken.
- MSMS_CURL_PARAMS: extra curl parameters, see the example below.
- MSMS_EXPECTED: expected service response. Used if the response is short.
- MSMS_EXPECTED_FILE: name of the file with the expected service response. If specified, it overwrites MSMS_EXPECTED.
- MSMS_RECIPIENTS: file with a list of notification recipients.
The request to google.com returns fixed html with a redirect, we will use it as the expected server response:
curl google.com > services/google-response.htmlWe will create the file 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' In MSMS_CURL_PARAMS You can specify everything that curl can do, including:
- Disable curl messages to avoid cluttering the console and log:
-s - Set the connection timeout with the checked service (in seconds):
--connect-timeout 3 - Set the response timeout:
-m 7 - Disable certificate verification for SSL (for example, if a self-signed certificate is used):
--insecure - Specify the type of HTTP request:
-X POST - Specify the headers:
-H "Content-Type: application/json" - Specify the body of the request as a string or file. Example for a file:
-d @request.json
We have disabled notifications and set timeouts of 3 seconds for connection and 7 seconds for receiving the service response.
Let op: use single quotes for parameter values, as shown in the example. Unfortunately, bash is quite fragile in this regard, and a butterfly that accidentally flutters in the wrong quote position could lead to the destruction of the universe with hard-to-diagnose errors.
We have set up monitoring. Let's check that everything is OK:
sudo chmod +x ./monitoring.sh
torsocks ./monitoring.shThe script should output a message like:
2020-01-10 12:14:31
health-check "google front page": OKSTEP 3. Setting up the schedule
Let's set up the monitoring schedule in cron:
sudo crontab -eAdd a line for checking google.com every minute:
*/1 * * * * torsocks /monitoring.sh >> /monitoring.log 2>&1Every day at 11:00 am, we'll add a notification confirming the monitoring's operability. To do this, we will pass the DAILY parameter to the script:
0 11 * * * torsocks /monitoring.sh DAILY >> /monitoring.log 2>&1
2>&1 ā standard practice redirecting errors to the main output stream. As a result, they will also go to the monitoring log.
Save changes and apply them with the command:
sudo service cron reloadMeer informatie over het instellen van cron is te vinden, bijvoorbeeld, .
Op deze manier wordt er elke minuut een monitoring-script uitgevoerd, dat via curl naar google.com zal bellen. Als het ontvangen antwoord verschilt van het verwachte, zal het script een melding naar de lijst met ontvangers in telegram sturen. Het controlerapport wordt bijgehouden in het bestand monitoring.log
Als er een andere service moet worden toegevoegd, maken we gewoon een nieuw ini-bestand voor deze service in de map services en, indien nodig, stellen we een aparte lijst met ontvangers op. De rest werkt automatisch.
Als de gecontroleerde service niet meer beschikbaar is, zal de melding elke minuut binnenkomen. Als het niet lukt om de service snel te herstellen, kunt u tijdelijk meldingen uitschakelen in de eigenschappen van de bot in telegram.
Laten we nu de extra mogelijkheden en de implementatie van de scripts in detail bekijken.
Berichttemplates en emotionele betrokkenheid
Om de interactie met de bot levendiger te maken, hebben we hem Manetje genoemd, een bijpassend afbeelding-avatar toegevoegd en professionele PR-mensen ingeschakeld voor het maken van de berichten. U kunt onze ontwikkelingen gebruiken of ze naar uw smaak wijzigen.
Bijvoorbeeld zo:

of zelfs zo:

Waarom ook niet?
De naam van de bot en de avatar worden ingesteld via .
De berichttemplates bevinden zich in de map templates:
- curl-fail.txt: een bericht dat wordt verzonden wanneer curl een niet-nul foutcode retourneert. Dit geeft doorgaans aan dat de service niet bereikbaar is.
- daily.txt: een dagelijks bericht dat bevestigt dat de service-monitoring werkt.
- service-fail.txt: een bericht dat wordt verzonden wanneer het antwoord van de service verschilt van het verwachte.
Laten we de mogelijkheden voor aanpassing bekijken aan de hand van de ingebouwde berichttemplates.
In de templates worden emoji's gebruikt. Helaas worden ze niet weergegeven op habr.
Voor het selecteren van emoji's is het handig om te zoeken op :

Een geschikte symbool kopieert u gewoon en plakt u in de tekst van de template (dat is gewone unicode).
- curl-fail.txt:
Katje, help me... Ik kan de service "$MSMS_SERVICE_NAME" niet bereiken `CURL EXIT CODE: $EXIT_CODE`We hebben de door ons opgegeven servicenaam gebruikt (variabele
MSMS_SERVICE_NAME) en de interne variabele van het script met de curl exitcode (EXIT_CODE). We hebben ook het bericht geformatteerd met behulp van markdown : symbolen "`" omringen tekst met een vaste breedte. Aangezien aanhalingstekens en apostrofs speciale symbolen zijn in bash, ontsnappen we naar ze met het teken "". Variabelen worden voorafgegaan door het teken "$".Resultaat:

- service-fail.txt:
Kattentje, help me... De service "$MSMS_SERVICE_NAME" heeft me teleurgesteld Hij werkt niet goed, dit is wat hij me antwoordt: `$RESPONSE`Resultaat:

Hier gebruiken we nog een andere scriptvariabele:RESPONSE. Het bevat het antwoord van de service. - daily.txt:
Hallo, kleintje! Met mij gaat het goed, ik houd de service "$MSMS_SERVICE_NAME" elke minuut in de gaten... Hoe gaat het met jou?Resultaat:

Laten we overgaan tot de implementatie van scripts.
Monitoring script
monitoring.sh maakt een eenvoudige auto-discovery ā haalt alle ini-bestanden uit de map services en voert voor elk het hoofdschema uit met de logica voor controle en het versturen van meldingen:
#!/bin/bash
cd $(dirname "$0")/services
for service_ini in $(ls *.ini); do
bash ../msms.sh "$1" "$service_ini"
doneOm een dagelijkse statusmelding van de monitoring te genereren, kan de scriptparameter DAILY worden meegegeven.
Let op dat bij het opstarten van het script de huidige map verandert naar services. Dit maakt het mogelijk om in ini-bestanden paden naar bestanden ten opzichte van services op te geven.
Controle- en meldingenscript
msms.sh bevat de hoofdlogica voor het controleren van de service en het versturen van meldingen.
Werken met 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
}
We vormen een URL voor toegang tot de REST API van telegram, gebruikmakend van de opgeslagen geheime sleutel in het bestand.
De functie send_message gebruikt curl om berichten naar deze REST API te sturen, waarbij we de id's van ontvangers ophalen uit het bestand dat we in ini hebben opgegeven. In de verzonden gegevens geven we aan dat we berichtmarkup gebruiken: parse_mode="Markdown".
We geven de huidige datum en tijd weer en laden het ini-bestand.
echo $(date '+%Y-%m-%d %H:%M:%S')
# laad variabelen uit .ini-bestand:
. $2
De magische regel . $2 voert het ini-bestand dat als tweede parameter is doorgegeven uit als een gewoon script, en voegt de opgegeven waarden toe aan omgevingsvariabelen.
We laden het verwachte antwoord uit het bestand, als de parameter is opgegeven MSMS_EXPECTED_FILE:
if [ -n "$MSMS_EXPECTED_FILE" ]; then
MSMS_EXPECTED="$(cat "$MSMS_EXPECTED_FILE")"
fi
Laten we de service controleren en meldingen verzenden indien nodig:
RESPONSE="$(eval curl $MSMS_CURL_PARAMS "$MSMS_SERVICE_ENDPOINT")"
EXIT_CODE=$?
if [[ $EXIT_CODE != 0 ]]; then
echo health-check "$MSMS_SERVICE_NAME" MISLUKT: CURL EXIT MET $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" MISLUKT: "$RESPONSE"
MESSAGE="$(cat ..\/templates\/service-fail.txt)"
MESSAGE=$(eval echo $MESSAGE)
send_message "$MESSAGE"
else
echo health-check "$MSMS_SERVICE_NAME": OK
fi
Eerst wijzen we aan de variabele RESPONSE de uitvoer van het curl-commando voor deze service toe.
De uitdrukking EXIT_CODE=$? plaatst de uitkomst van de laatste opdracht, dat wil zeggen curl, in een variabele. Indien nodig wordt de sjabloon uit het overeenkomstige bestand gelezen en wordt er een melding verzonden naar de ontvangers met behulp van send_message.
Het laatste blok verwerkt de 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"
fiEr wordt een bericht verzonden dat bevestigt dat de monitoring zelf werkt.
Ontvangen van de lijst met gebruikers-id's
recipients-setup.sh maakt gebruik van de Telegram API om de laatste berichten die aan de bot zijn gericht te ontvangen:
curl -s https:\/\/api.telegram.org\/bot$(cat telegram-api-key.txt)\/getUpdates
| python recipients-setup.pyHier wordt de magie van python gebruikt voor een mooie output van de lijst. Dit is niet essentieel, je kunt eenvoudig de benodigde id uit de json halen die de opdracht zal weergeven:
torsocks curl -s https:\/\/api.telegram.org\/bot$(cat telegram-api-key.txt)\/getUpdatesConclusie
Op deze manier kun je gebruik maken van kant-en-klare scripts en berichten-sjablonen, waarbij je alleen de te monitoren services en lijsten voor meldingen instelt; je kunt een nieuwe 'identiteit' voor de bot creƫren; of je kunt je eigen oplossing creƫren op basis van het voorgestelde.
Als vervolgstappen biedt het configureren en beheren van de monitoring binnen de bot zich aan, maar daarvoor kom je zonder python niet weg. Als iemand er eerder de tijd voor vindt dan ik ā je weet waar je de pull request moet indienen š
Bron: habr.com



