
Bəzən yeni xidmət üçün tez bir zamanda izləmə aparmaq lazımdır, amma hazır infrastruktur və ya ekspertiza yoxdur. Bu bələdçidə yarım saatda yalnız ubuntu-nun daxili alətləri ilə: bash, cron və curl istifadə edərək istənilən veb xidmətini izləyəcək bir alət yarada bilərik. Bildirişləri çatdırmaq üçün telegramdan istifadə edəcəyik.
İstifadəçilərin emosional iştirakını təmin etmək «tortun üzərindəki albalıdır». İnsanlar üzərində sınaqdan keçirilib — işə yarayır.
Doktor Rəqəmdə telemedisin xidmətimizdə istifadəçilərin stres səviyyəsini müəyyən edən bir chatbot yaratdığımız zaman izləmə lazım idi. Bir neçə saat ərzində əsası olan mini proyekti yaratdıq ki, bu, yalnız mükəmməl işləmir, həm də mesajları ilə müsbət enerji əlavə edir.
Başlamaq üçün skriptlərin yerləşdiyi repozitoriyanı alırıq:
git clone https://github.com/rshekhovtsov/msms.gitmsms qovluğuna daxil olun və ora işləyin.
Əgər telegram bloklanmışsa, proksi istifadə edin. Ən sadə və etibarlı variant — torsocks:
sudo apt install tor
sudo apt install torsocksMəsələn, google.com-un əsas səhifəsini izləmək üçün üç addımda ayarlayacağıq
ADDIM 1. Telegramda bot yaradırıq və istifadəçi id'sini alırıq
- Telegramda kontaktlar axtarışına :

- Start düyməsini basırıq, /newbot komandasını daxil edirik və suallara cavab veririk. Diqqət edilməli olan şey, adı — bu, istifadəçilərə göstəriləcək botun adıdır, username — unikal olmalıdır və "bot" ilə bitməlidir:

Bot, HTTP API üçün gizli token-i əlimizdə Azərbaycanda saxlamalı olduğumuz msms qovluğundakı telegram-api-key.txt faylına kopyalamaq üçün təhvil verəcək. - Telegramda botumuzun adını axtarırıq və onu işə salırıq.
- Son olaraq, izləmə bildirişlərinin alıcılar siyahısına özümüzü əlavə edirik:
sudo chmod +x ./recipients-setup.sh torsocks ./recipients-setup.shSkript, botla son müraciətlərin siyahısını verəcək, orada bizim id və telegram adımızla bir sətir olmalıdır. Bu id-ni götürüb services/google-recipients.txt faylında saxlayırıq. Faylın formatı: hər sətir — bir id. Nümunə:
123456789 987654321
Yeni alıcı əlavə etmək üçün, onu telegramda botu başlatmağa, recipients-setup.sh-ni işə salmağa və id-ni fayla əlavə etməyə məcbur etməliyik.
ADDIM 2. İzləmə ayarları
Xidmətin təsviri services qovluğunda bir ini-fayl yaradaraq baş verir. Beş parametr müəyyən etmək lazımdır:
- MSMS_SERVICE_NAME: xidmətin adı — bu, bildirişlərdə və izləmə jurnalında istifadə ediləcək.
- MSMS_SERVICE_ENDPOINT: bizim curl ilə müraciət edəcəyimiz xidmətin son nöqtəsi.
- MSMS_CURL_PARAMS: curl üçün əlavə parametrlər, aşağıdakı nümunəyə baxın.
- MSMS_EXPECTED: xidmətin gözlənilən cavabı. Qısa cavab varsa istifadə edilir.
- MSMS_EXPECTED_FILE: xidmətin gözlənilən cavabı olan faylın adı. Əgər göstərilərsə, MSMS_EXPECTED-i üstələyir.
- MSMS_RECIPIENTS: bildiriş alıcılarının siyahısını saxlayan fayl.
google.com-a müraciət edərək düz HTML geri qaytarırıq, onu serverin gözlənilən cavabı kimi istifadə edəcəyik:
curl google.com > services/google-response.htmlservices/google.ini faylı yaradacağıq:
MSMS_SERVICE_NAME='google ana səhifəsi'
# xidmət ucuzluğu
MSMS_SERVICE_ENDPOINT='google.com'
# curl parametrləri
MSMS_CURL_PARAMS='-s --connect-timeout 3 -m 7'
# gözlənilən xidmət cavabı
MSMS_EXPECTED_FILE='google-response.html'
# alıcılar siyahısı faylı
MSMS_RECIPIENTS='google-recipients.txt' İ MSMS_CURL_PARAMS curl-in edə biləcəyi hər şeyi təyin edə bilərsiniz, o cümlədən:
- Konsolu və loqu doldurmamaq üçün curl mesajlarını deaktiv edin:
-s - Yoxlanan xidmətlə əlaqə vaxtını (saniyədə) təyin edin:
--connect-timeout 3 - Cavabın alınma vaxtını təyin edin:
-m 7 - SSL üçün sertifikat yoxlanmasını deaktiv edin (məsələn, əgər öz-özünə imzalanmış sertifikat istifadə olunursa):
--insecure - HTTP sorğusunun növünü təyin edin:
-X POST - Başlıqları təyin edin:
-H "Content-Type: application/json" - Sorğunun mətnini ya da fayl kimi göstərin. Fayl üçün nümunə:
-d @request.json
Biz xəbərdarlıqları deaktiv etdik və bağlantı üçün 3 saniyə, xidmətin cavabı üçün 7 saniyə gözləmə vaxtlarını təyin etdik.
Diqqət: parametrlərin dəyərlərini tək dırnaqlarla qeyd edin, nümunədəki kimi. Təəssüf ki, bash bu baxımdan olduqca həssasdır, və təsadüfən buraxılan bir dırnaq universumun ölümünə səbəb ola biləcək çətin diaqnoz edilən xətalara gətirib çıxara bilər.
Biz monitorinqi tənzimlədik. Hər şeyin yaxşı olduğunu yoxlayaq:
sudo chmod +x ./monitoring.sh
torsocks ./monitoring.shSkriptdən aşağıdakılara bənzər bir mesaj çıxmalıdır:
2020-01-10 12:14:31
health-check "google ana səhifəsi": OKADDIM 3. Cədvəli qururuq
Cron-da monitorinq cədvəlini quraq:
sudo crontab -egoogle.com-u hər dəqiqə yoxlamaq üçün sətir əlavə edirik:
*/1 * * * * torsocks /monitoring.sh >> /monitoring.log 2>&1Hər gün saat 11:00-da monitorinqin işini təsdiq edən xəbərdarlığı əlavə edəcəyik. Bunun üçün skriptdə DAILY parametrini keçəcəyik:
0 11 * * * torsocks /monitoring.sh DAILY >> /monitoring.log 2>&1
2>&1 — standart müalicə, xətaları əsas çıxış axınında yönəldir. Nəticədə, onlar da monitorinq jurnalına daxil olacaq.
Dəyişiklikləri saxlayırıq və bu komandayla yükləyirik:
sudo service cron reloadCron-un tənzimləmələri haqqında daha çox məlumatı oxuya bilərsiniz, məsələn, .
Beləliklə, hər dəqiqə monitorinq skripti işləyəcək, hansı ki, curl vasitəsilə google.com-a müraciət edəcək. Alınan cavab gözlənilən cavabdan fərqlənirsə, skript alıcılar siyahısına xəbərdarlığı göndərəcək. Yoxlamalar jurnalı monitoring.log faylında aparılır.
Başqa bir xidməti əlavə etmək lazım olduğunda, onun üçün services qovluğunda yeni bir ini faylı yaradırıq və lazım gələrsə, ayrıca alıcılar siyahısı formalaşdırırıq. Qalan hər şey avtomatik işləyəcək.
Yoxlanan xidmətin əlçatmaz olması halında, xəbərdarlıq hər dəqiqə gələcək. Xidməti tez bərpa etmək mümkün olmadıqda, telegramdakı botun parametrlərində xəbərləri müvəqqəti olaraq deaktiv etmək olar.
İndi gəlin əlavə imkanları və skriptlərin icrasını ətraflı müzakirə edək.
Mesaj şablonları və emosional cəlb etmə
Bot ilə ünsiyyəti daha canlı etmək üçün ona Maneçka adını verdik, müvafiq avatar şəkli əlavə etdik və mesaj mətnlərini yaratmaq üçün peşəkar PR mütəxəssisləri cəlb etdik. Bizim işlərimizi istifadə edə bilərsiniz və ya öz zövqünüzə uyğun dəyişə bilərsiniz.
Məsələn, belə:

ya da hətta belə:

Niyə olmasın?
Botun adı və avatarı vasitəsi ilə təyin edilir .
Mesaj şablonları isə templates:
- curl-fail.txt: curl sıfırdan fərqli bir xətalı kod qaytardıqda göndərilən mesaj. Adətən, servislə əlaqə qurmaq mümkün olmadığını göstərir.
- daily.txt: xidmətin monitorinqinin işlədiyinə dair gündəlik mesaj.
- service-fail.txt: xidmət cavabının gözləniləndən fərqli olduğu halda göndərilən mesaj.
İnteqrasiya edilmiş mesaj şablonları misalında özelleştirme imkanlarını nəzərdən keçirək.
Şablonlarda emojilərdən istifadə olunur. Təəssüf ki, habr bunları göstərə bilmir.
Emoji seçimini rahatlaşdırmaq üçün :

saytında axtarış etmək rahatdır. Uyğun simvolu sadəcə kopyalayıb şablon mətniyə yapışdırırsınız (bu adi unicode).
- curl-fail.txt:
Pişik, mənə kömək et... "$MSMS_SERVICE_NAME" xidmətinə çata bilmirəm. `CURL EXIT CODE: $EXIT_CODE`Biz istifadə etdiyimiz xidmət adını (dəyişən
MSMS_SERVICE_NAME) və curl ilə bitiş kodunu saxlayan skriptin daxili dəyişənini (EXIT_CODE) istifadə etdik. Eyni zamanda, mesajı formatlamaq üçün : "`" simvolları sabit genişlikdə olan mətni əhatə edir. Çünki tırnaqlar və apostroflar bash-da xüsusi simvollardır, onları "" simvolu ilə qaçırırıq. Dəyişən adları "$" işarəsi ilə başlayır.Nəticə:

- service-fail.txt:
Pişik, mənə kömək et... "$MSMS_SERVICE_NAME" məni kədərə saldı. O düzgün çalışmır, bu mənə dedikləri: `$RESPONSE`Nəticə:

Burada skriptin başqa bir dəyişənini istifadə edirik:RESPONSE. O, xidmətin cavabını saxlayır. - daily.txt:
Körpə, salam! Mən yaxşıyam, "$MSMS_SERVICE_NAME" xidmətini hər dəqiqə izləyirəm... Sənin necədir?Nəticə:

İndi skriptlərin icrasına keçək.
Monitorinq skripti
monitoring.sh sadə auto-discovery həyata keçirir — services qovluğundakı bütün ini fayllarını alır və hər biri üçün yoxlama və xəbərdarlıqları göndərmə məntiqi olan əsas skripti icra edir:
#!/bin/bash
cd $(dirname "$0")/services
for service_ini in $(ls *.ini); do
bash ../msms.sh "$1" "$service_ini"
doneGündəlik monitorinq statusu mesajını formalaşdırmaq üçün skripti DAILY parametrini keçmək olar.
Diqqət yetirin ki, skript başladıqda mövcud qovluq services olaraq dəyişir. Bu ini fayllarda xidmətlə əlaqəli faylların yollarını göstərməyə imkan tanıyır.
Yoxlama və xəbərdarlıqları göndərən skript
msms.sh xidmətin yoxlanması və xəbərdarlıqları göndərməyə dair əsas məntiqi saxlayır.
Telegram ilə çalışma:
# 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
}
Biz REST API telegram-a daxil olmaq üçün URL formalaşdırırıq, qeydə alınmış gizli açarı istifadə edərək.
send_message funksiyası, ini-də göstərdiyimiz fayldan alıcıların id-lərini alaraq bu REST API-yə mesajlar göndərmək üçün curl istifadə edir. Göndərilən məlumatlarda mesajların formatlamasında istifadə etdiyimizi bildiririk: parse_mode="Markdown".
Mövcud olan tarix və vaxtı çıxaracağıq və ini faylını yükləyəcəyik.
echo $(date '+%Y-%m-%d %H:%M:%S')
# .ini faylından dəyişənləri yükləyin:
. $2
Maqik sətir . $2 giriş olaraq verilmiş ikinci parametr ini-faylını adi skript kimi icra edir, orada müəyyən edilmiş dəyərləri mühit dəyişənlərinə daxil edir.
Əgər parametr verilibsə, gözlənilən cavabı fayldan yükləyəcəyik MSMS_EXPECTED_FILE:
if [ -n "$MSMS_EXPECTED_FILE" ]; then
MSMS_EXPECTED="$(cat "$MSMS_EXPECTED_FILE")"
fi
Xəbərdarlıq göndərilməsi lazım olduqda xidmətin yoxlanmasını həyata keçirəcəyik:
RESPONSE="$(eval curl $MSMS_CURL_PARAMS "$MSMS_SERVICE_ENDPOINT")"
EXIT_CODE=$?
if [[ $EXIT_CODE != 0 ]]; then
echo health-check "$MSMS_SERVICE_NAME" UĞURSUZ: 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" UĞURSUZ: "$RESPONSE"
MESSAGE="$(cat ..\/templates\/service-fail.txt)"
MESSAGE=$(eval echo $MESSAGE)
send_message "$MESSAGE"
else
echo health-check "$MSMS_SERVICE_NAME": YAXŞI
fi
İlk öncə dəyişənə RESPONSE bu xidmət üçün curl komandasının icra olunmasının nəticəsini təyin edirik.
İfadə EXIT_CODE=$? sonuncu komandanın, yəni curl-in icra olunma nəticəsini bu dəyişənə qoyur. Xəbərdarlıq göndərilməli olduqda, müvafiq fayldan şablon oxunur və send_message.
Son blok DAILY parametrini emal edir:
if test "$1" = "DAILY"; then
echo health-check "$MSMS_SERVICE_NAME" DAILY
MESSAGE="$(cat ..\/templates\/daily.txt)"
MESSAGE=$(eval echo $MESSAGE)
send_message "$MESSAGE"
fiBu, monitorinqin özünün işlək olduğunu təsdiq edən mesaj göndərir.
İstifadəçi id-lərinin siyahısını almaq
recipients-setup.sh bot-a ünvanlanmış son mesajları almaq üçün telegram API-sına müraciət edir:
curl -s https:\/\/api.telegram.org\/bot$(cat telegram-api-key.txt)\/getUpdates
| python recipients-setup.pyBurada siyahının gözəl çıxışı üçün python magiyasından istifadə edilir. Bu mütləq deyil, sadəcə lazım olan id-ni əldə etmək üçün komandanın çıxardığı json istifadə oluna bilər:
torsocks curl -s https:\/\/api.telegram.org\/bot$(cat telegram-api-key.txt)\/getUpdatesNəticə
Beləliklə, siz hazır skriptləri və mesaj şablonlarını istifadə edərək, yalnız izlənilən xidmətləri və xəbərdarlıq üçün siyahıları tənzimləyə bilərsiniz; bot üçün yeni bir "şəxsiyyət" yarada bilərsiniz; ya da təklif olunanlara əsaslanaraq öz həllinizi edə bilərsiniz.
Daha da inkişaf etmək variantı botda monitorinqi konfiqurasiya etmək və idarə etməkdir, amma burada python olmadan keçinmək mümkün deyil. Əgər kiminsə əlləri məndən əvvəl bu işi görə bilsə — siz pull request göndərməyi bilirsiniz 🙂
Mənbə: habr.com



