
parfois il est nécessaire de configurer rapidement une surveillance pour un nouveau service, sans infrastructure/expertise à portée de main. Dans ce guide, nous allons créer un outil de surveillance pour tous les services web en seulement une demi-heure, en utilisant uniquement les outils intégrés d'ubuntu: bash, cron et curl. Pour les notifications, nous utiliserons telegram.
La cerise sur le gâteau sera l'implication émotionnelle des utilisateurs. Testé sur des personnes - ça fonctionne.
Lorsque nous avons créé un chatbot pour déterminer le niveau de stress des utilisateurs dans le service de télémédecine Docteur Près de Moi, nous avons eu besoin de surveillance. En quelques heures, un mini-projet a été réalisé, qui non seulement fonctionne bien, mais apporte également de la positivité avec ses messages.
Pour commencer, obtenons le dépôt avec les scripts :
git clone https://github.com/rshekhovtsov/msms.gitPassons dans le dossier msms et travaillons là-dedans.
Si telegram est bloqué, utilisez un proxy. L'option la plus simple et fiable est torsocks :
sudo apt install tor
sudo apt install torsocksÀ titre d'exemple, configurons la surveillance de la page d'accueil google.com en trois étapes
ÉTAPE 1. Créez un bot dans telegram et obtenez l'ID de l'utilisateur
- Dans la barre de recherche de contacts telegram, recherchez :

- Lancez-le avec le bouton Start, entrez la commande /newbot et répondez aux questions. Il faut garder à l'esprit que name — c'est le nom du bot qui sera affiché aux utilisateurs, tandis que le username — est unique et doit se terminer par «bot» :

Parmi d'autres choses, le bot fournira un token secret pour l'API HTTP, que vous devez copier et sauvegarder dans le fichier telegram-api-key.txt dans le dossier msms. - Tapez dans la barre de recherche telegram le nom de notre bot, et lancez-le.
- En guise de touche finale, ajoutons-nous à la liste des destinataires des notifications de surveillance :
sudo chmod +x ./recipients-setup.sh torsocks ./recipients-setup.shLe script affichera la liste des dernières requêtes au bot, il devrait y avoir une ligne avec notre ID et notre nom sur telegram. Prenez cet ID et sauvegardez-le dans le fichier services/google-recipients.txt. Format du fichier : chaque ligne - un ID. Par exemple :
123456789 987654321
Pour ajouter un nouveau destinataire, vous devez lui demander de démarrer le bot dans telegram, de lancer recipients-setup.sh et d'ajouter l'ID dans le fichier.
ÉTAPE 2. Configurer la surveillance
La description du service se fait en créant un fichier ini dans le dossier services. Il faut définir cinq paramètres :
- MSMS_SERVICE_NAME: le nom du service — sera utilisé dans les notifications et le journal de surveillance.
- MSMS_SERVICE_ENDPOINT: endpoint du service, auquel nous allons accéder avec curl.
- MSMS_CURL_PARAMS: paramètres supplémentaires pour curl, voir exemple ci-dessous.
- MSMS_EXPECTED: réponse attendue du service. Utilisé si la réponse est courte.
- MSMS_EXPECTED_FILE: nom du fichier avec la réponse attendue du service. S'il est spécifié, il remplace MSMS_EXPECTED.
- MSMS_RECIPIENTS: fichier contenant la liste des destinataires des notifications.
La requête vers google.com renvoie un html fixe avec redirection, nous l'utiliserons comme réponse attendue du serveur :
curl google.com > services/google-response.htmlՍտեղծենք ֆայլ services/google.ini:
MSMS_SERVICE_NAME='google front page'
# ծառայության վերջակետ
MSMS_SERVICE_ENDPOINT='google.com'
# curl պարամետրեր
MSMS_CURL_PARAMS='-s --connect-timeout 3 -m 7'
# սպասվող ծառայության պատասխան
MSMS_EXPECTED_FILE='google-response.html'
# ընդունման ցուցակի ֆայլ
MSMS_RECIPIENTS='google-recipients.txt' Մեույն MSMS_CURL_PARAMS կարող եք սահմանել ամեն ինչ, ինչ կարող է curl, այդ թվում:
- Անջատել curl հաղորդագրությունները, որպեսզի չխցանել կոնսոլը և լոգերը:
-s - Սահմանել կապի ժամկետը ստուգվող ծառայության հետ (վարկյաններով):
--connect-timeout 3 - Սահմանել պատասխան ստանալու ժամկետը:
-m 7 - Անջատել SSL սերտիֆիկատի ստուգումը (օրինակ, եթե օգտագործվում է ինքնագիր սերտիֆիկատ):
--insecure - Սահմանել HTTP հարցման տեսակ:
-X POST - Սահմանել գլուխները:
-H "Content-Type: application/json" - Սահմանել հարցման մարմինը որպես շարահյուսություն կամ ֆայլ: Ֆայլի օրինակ:
-d @request.json
Մենք անջատել ենք ծանուցումները և սահմանել 3 վայրկյան կապի և 7 վայրկյան ապահովման ժամկետները:
Ուշադրություն: պարամետրերի արժեքները նշեք մեկակի մեջ, ինչպես օրինակ: Ցավոք, bash այս իմաստով բավականին խոցելի է, և պատահական եկող թիթեռի կողմից սխալ տեղադրված մեջբերումները կարող են հանգեցնել համաստեղության ոչ տպավորիչ առանցքային սխալների:
Մենք ծրագրել ենք մոնիթորինգը: Проверим, что все ОК:
sudo chmod +x ./monitoring.sh
torsocks ./monitoring.shՍկրիպտը պետք է արտածի հետևյալ տեսքով հաղորդագրություն:
2020-01-10 12:14:31
health-check "google front page": OKՔԱԴՐ 3. Կարգավորում ենք ժամանակացույցը
Կարգավորում ենք մոնիթորինգի ժամանակացույցը cron-ում:
sudo crontab -eԱվելացնում ենք տող՝ google.com ամեն րոպե ստուգելու համար:
*/1 * * * * torsocks /monitoring.sh >> /monitoring.log 2>&1Ավելացնում ենք ամեն օր 11:00-ի ծանուցում, որը հաստատում է մոնիթորինգի աշխատունակությունը: Դրա համար փոխանցում ենք սցենարին DAILY պարամետրը:
0 11 * * * torsocks /monitoring.sh DAILY >> /monitoring.log 2>&1
2>&1 — ստանդարտ մեթոդ, որը տարածում է սխալները հիմնական ելքի հոսքին: Վերջում, նրանք նույնպես կհայտնվեն մոնիթորինգի լոգում:
Պահպանում ենք փոփոխությունները և վերցնում դրանք հրամանից:
sudo service cron reloadՆպատակների կարգավորմանը կարելի է ավելի մանրամասն անդրադառնալ, օրինակ, .
Այսպես, յուրաքանյու րոպեում կերկարատևվի մոնիթորինգի սկրիպտը, որը curl-ի միջոցով դիմելու է google.com: Եթե ստացված պատասխանն տարբեր է սպասվումից, սկրիպտը կներկայացնի ծանուցումներ ընդունողների ցանկով telegram-ում: Проверок журнал ведется в файле monitoring.log
Եթե անհրաժեշտ է ավելացնել մեկ այլ ծառայություն, մենք պարզապես ստեղծում ենք նոր ini-файл դրա համար services папке եւ, անհրաժեշտության դեպքում, ձևավորում ենք առանձին ստացողների ցուցակ: Մնացած ամենը կաշխատի ինքնաբերաբար:
Եթե ստուգվող ծառայությունը դարձել է հասանելի չէ, ծանուցումը կհայտնվի ամեն րոպե: եթե հնարավոր չէ արագ վերականգնել ծառայությունը, կարելի է ժամանակավորապես անջատել ծանուցումները telegram-ում բոտի հատկություններում:
Այժմ եկեք մանրամասն ուսումնասիրենք լրացուցիչ հնարավորությունները և սկրիպտների իրականացմանը:
Հաղորդագրությունների ձևանմուշներ և զգայական ներգրավելություն
Որպեսզի Bot-ի հետ շփումը ավելի կենդանի լինի, մենք այն անվանել ենք Մանեչկա, ավելացրել ենք համապատասխան նկար-ավատար և ներգրավել ենք պրոֆեսիոնալ PR մասնագետների հաղորդագրությունների տեքստեր ստեղծելու համար: Դուք կարող եք օգտագործել մեր մշակած տարբերակները կամ փոխել ձեր ճաշակի համաձայն:
Օրինակ այսպես:

կամ նույնիսկ այսպես:

Ինչու ոչ:
Bot-ի անունն ու ավատարն սահմանվում են .
Հաղորդագրությունների ձևանմուշները գտնվում են templates:
- curl-fail.txt: հաղորդագրություն, որը ուղարկվում է, երբ curl-ը վերադարձնում է ոչ զրոյական սխալի ծածկագիր: Այսօր հաճախ խոսում է այն մասին, որ հնարավոր չէ հասնել ծառայությանը:
- daily.txt: աղջիկ, որը հաստատում է, որ ծառայության դիտարկումը գործում է:
- service-fail.txt: հաղորդագրություն, որը ուղարկվում է, երբ ծառայության պատասխանն տարբերվում է ակնկալվողից:
Փորձենք պարզել ադապտացիայի հնարավորությունները встроенных հաղորդագրությունների ձևանման օրինակով:
Ուղարկման ձևանմուշներում օգտագործվում են էմոջիներ: Ցավոք, habr-ը դրանք չի ցուցադրում:
Էմոջիներ գտնելու համար հարմար է օգտագործել որոնումը :

Համապատասխան simb.union պարզապես պատճենեք և տեղադրեք հաղորդագրության ձևանմուշում (это обычный unicode):
- curl-fail.txt:
Կթնդոց, օգնեք ինձ... Չեմ կարող հասնել ծառայություն "$MSMS_SERVICE_NAME" `CURL EXIT CODE: $EXIT_CODE`Մենք օգտագործեցինք մեր կողմից սահմանված ծառայության անունը (փոփոխական
MSMS_SERVICE_NAME) և ներքին փոխարինիչի վարկած curl-ի ավարտի ծածկագիրը (EXIT_CODE). Բացի այդ, մենք ձևավորեցինք հաղորդագրությունը, օգտագործելով : նշանները "`" շրջապատում են ֆիքսված լայնության տեքստը: Որպեսզի նշաններ ու գաղտնի հարույթները bash-ի ծառայողական նշաններ են, մենք մասնավոր միջոցներով ավելացնում ենք "": Առաջին փոքրիկ նշաններն անցնում են "$"-ի նշանով:Համ परिणाम։

- service-fail.txt:
Կթնդոց, օգնեք ինձ... Ստեղծումը "$MSMS_SERVICE_NAME" ինձ զոմոշկություն պատճառեց: Այն աշխատում է սխալ, ահա, թե ինչ է նա ինձ պատասխանում: `$RESPONSE`Համ परिणाम։

Այստեղ մենք օգտագործում ենք դեռ մեկ փոփոխական վարկած:RESPONSE. Դա պարունակում է ծառայության պատասխան: - daily.txt:
Փոքրիկ, բարև! Ես լավ եմ, հետևում եմ ծառայությանը: "$MSMS_SERVICE_NAME" ամեն րոպե... Ինչպես եք դուք?Համ परिणाम։

Ունենք քայլեր դեպի մագիստրալային սկրիպտերի իրականացումը:
Դիտարկումի սկրիպտ
monitoring.sh անհրաժեշտ է պարզ auto-discovery — վերցնում է բոլոր ini-ֆայլերը services папкայից և յուրաքանչյուրի համար իրականացնում է հիմնական սկրիպտ, որով էլ ստացվում են հայտնաբերման և ծ уведомления:
#!/bin/bash
cd $(dirname "$0")/services
for service_ini in $(ls *.ini); do
bash ../msms.sh "$1" "$service_ini"
doneԵրաժշտության ծառայության ամենօրյա հաղորդագրության կազմավորման համար սկրիպտին կարելի է փոխանցել DAILY պարամետրը:
Նշեք, որ սկրիպտը սկսելիս ընթացիկ папкան փոխվում է services: Սա հնարավորություն է տալիս ini-ֆայլերի մեջ նշել ֆայլերի ուղիները՝ կախված services-ից:
Ստուգման և ծ_notification-ի սկրիպտ
msms.sh պարունակում է ծառայության ստուգման հիմնական տրամաբանությունը և уведомленияի տարանցման:
Աշխատանք 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
}
Մենք ձևավորում ենք URL դեպի REST API Telegram, օգտագործելով պահպանված ֆայլում գաղտնի բանալին:
send_message ֆունկցիան օգտագործում է curl-ը հաղորդագրություններ ուղարկելու համար այս REST API-ին, վերցնելով ստացողների id ֆայլից, որը սահմանել ենք ini-ում: Ուղարկվող տվյալներում մենք նշում ենք, որ օգտագործում ենք հաղորդագրությունների ձևավորում: parse_mode="Markdown".
Կկայացնենք ներկայիս ամսաթիվը-ժամը և загрузим ini-файл.
echo $(date '+%Y-%m-%d %H:%M:%S')
# загрузить переменные из .ini файла:
. $2
Ամենավառ ստեղ. . $2 կատարում է երկրորդ պարամետրի միջոցով փոխանցված ini-файл-ը որպես սովորական սկրիպտ, ապա նշված արժեքները գրանցում է միջավայրի փոփոխականներին:
Թարմ ենք սպասվող պատասխանն ֆայլից, եթե պարամետրը սահմանված է: MSMS_EXPECTED_FILE:
if [ -n "$MSMS_EXPECTED_FILE" ]; then
MSMS_EXPECTED="$(cat "$MSMS_EXPECTED_FILE")"
fi
Կատարենք սպասարկման ստուգում, հաղորդումներ ուղարկելով, եթե անհրաժեշտ է:
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
Նախ անվանենք փոփոխականը RESPONSE curl հրահանգի կատարումից ստացված արդյունքը տվյալ ծառայության համար:
Բացահայտում EXIT_CODE=$? վերարկում է վերջին հրահանգի արդյունքը, այսինքն՝ curl-ին: Եթե պետք է հաղորդում ուղարկել, ապա կարդացվում է համապատասխան ֆայլից թաղուրակը և ուղարկվում է send_message.
Վերջին բլոկը մշակելու է 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"
fiԱյն ուղարկում է հաղորդագրություն, հաստատելով մոնիտորինգի գործունակությունը:
Ինքնության ID-ների ցանկի प्राप्तություն.
recipients-setup.sh թողնում է API telegram-ում վերջին հաղորդագրությունները, ուղղված բոտին:
curl -s https://api.telegram.org/bot$(cat telegram-api-key.txt)/getUpdates
| python recipients-setup.pyԱյնտեղ օգտագործվում է python-ի magic- ը ցանկի գեղեցիկ ցուցադրման համար: Սա պարտադիր չէ, կարող եք պարզապես ընտրել անհրաժեշտ ID-ը json-ից, որը կախելու է հրահանգը:
torsocks curl -s https://api.telegram.org/bot$(cat telegram-api-key.txt)/getUpdatesԱվարտ
Այսպիսով, դուք կարող եք օգտագործել պատրաստված սկրիպտներ և հաղորդումների թաղուրակներ, միայն հսկող ծառայությունները և հաղորդումների ցանկերը կարգավորելով; կարող եք ստեղծել նոր «անձնավորություն» բոտի համար; կամ կարող եք կատարել ձեր լուծումը առաջարկի հիման վրա:
Անհրաժեշտ է հետագա զարգացումը կարգավորել և վերահսկել մոնիտորինգը հենց բոտում, բայց այստեղ python-ն արդեն չի ապահովվի: Եթե որևէ մեկը հասցնի անել ինձնից շուտ՝ գիտեք, թե ուր ուղղել pull request 🙂
Ընտանիք: habr.com



