Bot untuk memonitor layanan web dalam setengah jam: telegram + bash + cron



Terkadang Anda perlu segera melakukan pemantauan untuk layanan baru, tetapi tidak ada infrastruktur / keahlian yang siap pakai. Dalam panduan ini, dalam setengah jam kami akan mengimplementasikan alat untuk memonitor semua layanan web hanya menggunakan alat-alat ubuntu bawaan: bash, cron dan curl. Kami akan menggunakan telegram untuk mengirimkan peringatan.

"Cherry on the cake" akan menjadi keterlibatan emosional pengguna. Itu diperiksa pada orang - itu berfungsi.

Ketika kami membuat chatbot di layanan Doctor Near telemedicine untuk menentukan tingkat stres pengguna, kami perlu pemantauan. Dalam beberapa jam, sebuah proyek mini dibuat, yang tidak hanya berfungsi dengan baik, tetapi juga menambahkan umpan balik positif.

Untuk memulai, dapatkan repositori dengan skrip:

git clone https://github.com/rshekhovtsov/msms.git 

Buka folder msms dan kemudian bekerja di dalamnya.

Jika telegram diblokir, gunakan proxy. Opsi termudah dan paling dapat diandalkan adalah torsocks:

 sudo apt install tor sudo apt install torsocks 

Sebagai contoh, kami akan mengonfigurasi pemantauan halaman awal google.com dalam tiga langkah.

LANGKAH 1. Buat bot di telegram dan dapatkan id pengguna


  • Dalam string pencarian kontak di telegram, cari @botfather :


  • Kami memulainya dengan tombol Mulai, masukkan perintah / newbot dan jawab pertanyaan. Anda harus ingat bahwa nama adalah nama bot yang akan ditampilkan kepada pengguna, dan nama pengguna adalah unik dan harus diakhiri dengan "bot":



    Di antara hal-hal lain, bot akan mengeluarkan token rahasia untuk API HTTP, yang perlu Anda salin dan simpan ke file telegram-api-key.txt di folder msms.
  • Kami mengetikkan nama bot kami di baris telegram pencarian, dan menjalankannya.
  • Sebagai sentuhan akhir, tambahkan diri kita ke daftar penerima peringatan pemantauan:

     sudo chmod +x ./recipients-setup.sh torsocks ./recipients-setup.sh 

    Script akan menampilkan daftar panggilan terakhir ke bot, harus ada satu baris dengan id dan nama kita di telegram. Kami mengambil id ini dan menyimpannya di file services / google-penerima.txt. Format file: setiap baris adalah satu id. Contoh:

     123456789 987654321 

Untuk menambahkan penerima baru, Anda perlu memintanya untuk memulai bot di telegram, jalankan penerima-setup.sh dan tambahkan id ke file.

LANGKAH 2. Konfigurasi Pemantauan


Deskripsi layanan terjadi dengan membuat file-in di folder layanan. Lima parameter perlu diatur:

  1. MSMS_SERVICE_NAME : nama layanan - akan digunakan dalam lansiran dan pemantauan log .
  2. MSMS_SERVICE_ENDPOINT : titik akhir dari layanan yang akan kami hubungi dengan curl.
  3. MSMS_CURL_PARAMS : parameter ikal tambahan, lihat contoh di bawah ini.
  4. MSMS_EXPECTED : respons layanan yang diharapkan. Digunakan jika jawabannya singkat.
  5. MSMS_EXPECTED_FILE : nama file dengan respons layanan yang diharapkan. Jika ditentukan, timpa MSMS_EXPECTED.
  6. MSMS_RECIPIENTS : file dengan daftar penerima notifikasi.

Permintaan di google.com mengembalikan html tetap dengan redirect, kami akan menggunakannya sebagai respons server yang diharapkan:

 curl google.com > services/google-response.html 

Buat file layanan / 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' 

Di MSMS_CURL_PARAMS Anda dapat menentukan semua yang dapat dilakukan curl, termasuk:

  1. Nonaktifkan pesan keriting agar tidak menyumbat konsol dan masuk: -s
  2. Atur batas waktu koneksi dengan layanan yang sedang diperiksa (dalam detik): --connect-timeout 3
  3. Tetapkan batas waktu respons: -m 7
  4. Nonaktifkan verifikasi sertifikat untuk SSL (misalnya, jika sertifikat yang ditandatangani sendiri digunakan): --insecure
  5. Tentukan jenis permintaan http: -X POST
  6. Tentukan tajuk: -H "Content-Type: application/json"
  7. Tentukan badan permintaan sebagai string atau file. Contoh untuk file: -d @request.json

Kami mematikan notifikasi dan menetapkan batas waktu 3 detik. pada koneksi dan 7 detik. untuk menerima tanggapan dari layanan.

Perhatian : tentukan nilai parameter dalam tanda kutip tunggal, seperti pada contoh. Sayangnya, bash dalam pengertian ini cukup rapuh, dan seekor kupu - kupu yang tidak sengaja terbang di tempat yang salah, sebuah kutipan, dapat menyebabkan kematian alam semesta dengan kesalahan yang sulit didiagnosis.

Kami mengatur pemantauan. Periksa apakah semuanya OK:

 sudo chmod +x ./monitoring.sh torsocks ./monitoring.sh 

Script harus menampilkan pesan berupa:

 2020-01-10 12:14:31 health-check "google front page": OK 

LANGKAH 3. Sesuaikan jadwal


Atur jadwal pemantauan di cron:

 sudo crontab -e 

Tambahkan baris untuk memeriksa google.com setiap menit:

 */1 * * * * torsocks <   >/monitoring.sh >> <   >/monitoring.log 2>&1 

Tambahkan peringatan setiap hari pukul 11.00, yang mengkonfirmasi pemantauan itu sendiri. Untuk melakukan ini, kirimkan parameter SETIAP HARI ke skrip:

 0 11 * * * torsocks <   >/monitoring.sh DAILY >> <   >/monitoring.log 2>&1 

2>&1 - teknik standar mengarahkan kesalahan ke aliran output utama. Sebagai hasilnya, mereka juga akan dimasukkan dalam log pemantauan.

Simpan perubahan dan tangkap dengan perintah:

  sudo service cron reload 

Anda dapat membaca lebih lanjut tentang mengkonfigurasi cron, misalnya, di sini .

Jadi, setiap menit skrip pemantauan akan diluncurkan, yang akan diakses melalui gol di google.com. Jika jawaban yang diterima berbeda dari yang diharapkan, skrip akan mengirim pemberitahuan di telegram ke daftar penerima. Log audit disimpan dalam file monitoring.log

Jika Anda perlu menambahkan layanan lain, kami cukup membuat file-in baru untuknya di folder layanan dan, jika perlu, buat daftar penerima yang terpisah. Segala sesuatu yang lain akan bekerja secara otomatis.

Jika layanan yang dicentang tidak tersedia, peringatan akan dikirim setiap menit. Jika Anda tidak dapat mengembalikan layanan dengan cepat, Anda dapat menonaktifkan sementara pemberitahuan di properti bot di telegram.

Sekarang mari kita melihat lebih dekat fitur tambahan dan implementasi skrip.

Template Pesan dan Keterlibatan Emosional


Untuk membuat komunikasi dengan bot lebih hidup, kami menyebutnya Manechka, menambahkan avatar gambar yang sesuai dan melibatkan spesialis PR profesional untuk membuat teks pesan. Anda dapat menggunakan prestasi kami atau mengubah selera Anda.

Misalnya, seperti ini:


atau bahkan lebih:


Kenapa tidak

Nama bot dan avatar ditetapkan melalui @botfather .
Templat pesan terletak di folder templat :

  • curl-fail.txt : pesan terkirim saat curl mengembalikan kode kesalahan bukan nol. Biasanya berbicara tentang ketidakmungkinan menjangkau layanan.
  • daily.txt : pesan harian yang mengonfirmasi bahwa pemantauan layanan berfungsi.
  • service-fail.txt : pesan yang dikirim ketika respons layanan berbeda dari yang diharapkan.

Mari kita periksa kemungkinan penyesuaian menggunakan contoh templat pesan bawaan.
Template menggunakan emoji. Sayangnya, habr tidak menampilkannya.
Untuk memilih emoji, lebih mudah menggunakan pencarian di emojipedia.org :



Anda cukup menyalin dan menempelkan karakter yang sesuai ke dalam teks template (ini adalah unicode biasa).
  1. curl-fail.txt:

     ,  ...      \"$MSMS_SERVICE_NAME\" \`CURL EXIT CODE: $EXIT_CODE\` 

    Kami menggunakan nama layanan yang kami tentukan (variabel MSMS_SERVICE_NAME ) dan variabel skrip internal dengan kode pengakhiran ikal ( EXIT_CODE ). Kami juga memformat pesan menggunakan markup telegram markdown : karakter frame teks `` '' dengan lebar tetap. Karena tanda kutip dan apostrof adalah karakter bash resmi, kami menghindarinya dengan karakter "\". Nama variabel diawali dengan tanda "$".

    Hasil:


  2. service-fail.txt:

     ,  ...  \"$MSMS_SERVICE_NAME\"     ,     : \`$RESPONSE\` 

    Hasil:



    Di sini kita menggunakan variabel skrip lain: RESPONSE . Ini berisi respons dari layanan.
  3. daily.txt:

     , !    , c  : \"$MSMS_SERVICE_NAME\"  ...     ? 

    Hasil:



Mari kita beralih ke implementasi skrip.

Skrip pemantauan


monitoring.sh membuat penemuan otomatis sederhana - mengambil semua file ini dari folder layanan dan untuk masing-masing mengeksekusi skrip utama dengan logika untuk memeriksa dan mengirim peringatan:

 #!/bin/bash cd $(dirname "$0")/services for service_ini in $(ls *.ini); do bash ../msms.sh "$1" "$service_ini" done 

Untuk menghasilkan pesan harian tentang status pemantauan, skrip dapat melewati parameter SETIAP HARI.

Harap dicatat bahwa ketika skrip dimulai, folder saat ini berubah ke layanan. Ini memungkinkan file ini untuk menentukan jalur file relatif ke layanan.

Skrip untuk memeriksa dan mengirim peringatan


msms.sh berisi logika dasar untuk memeriksa layanan dan mengirimkan peringatan.

Bekerja dengan 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 } 

Kami membuat URL untuk mengakses API REST telegram menggunakan kunci pribadi yang tersimpan dalam file.

Fungsi send_message menggunakan curl untuk mengirim pesan ke REST API ini, mengambil id penerima dari file yang kami tentukan di ini. Dalam data yang kami kirim, kami mengindikasikan bahwa kami menggunakan markup pesan: parse_mode="Markdown" .

Cetak tanggal-waktu saat ini dan muat file-in ini.

 echo $(date '+%Y-%m-%d %H:%M:%S') # load variables from .ini file: . $2 

Garis ajaib . $2 . $2 mengeksekusi file-in ini sebagai parameter kedua sebagai skrip biasa, memasukkan nilai yang ditentukan di dalamnya ke dalam variabel lingkungan.

Unduh respons yang diharapkan dari file jika parameter MSMS_EXPECTED_FILE :

 if [ -n "$MSMS_EXPECTED_FILE" ]; then MSMS_EXPECTED="$(cat "$MSMS_EXPECTED_FILE")" fi 

Lakukan pemeriksaan layanan dengan mengirimkan peringatan, jika perlu:

 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 

Pertama-tama kita menetapkan variabel RESPONSE ke hasil perintah curl untuk layanan ini.

Ekspresi EXIT_CODE=$? menempatkan hasil dari perintah terakhir, mis. ikal Jika Anda perlu mengirim peringatan, templat dibaca dari file yang sesuai dan pengiriman surat kepada penerima send_message menggunakan send_message .

Blok terakhir memproses parameter SETIAP HARI:

 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 

Ia mengirim pesan yang mengkonfirmasi kesehatan pemantauan itu sendiri.

Mendapatkan daftar id pengguna


penerima-setup.sh memanggil API telegram untuk mendapatkan pesan terbaru yang ditujukan ke bot:

 curl -s https://api.telegram.org/bot$(cat telegram-api-key.txt)/getUpdates \ | python recipients-setup.py 

Menggunakan sihir python untuk membuat daftar output dengan baik. Ini opsional, Anda cukup mengambil id yang diinginkan dari json, yang akan ditampilkan perintah:

 torsocks curl -s https://api.telegram.org/bot$(cat telegram-api-key.txt)/getUpdates 

Kesimpulan


Dengan demikian, Anda dapat menggunakan skrip yang sudah jadi dan templat pesan, hanya menyiapkan layanan dan daftar yang dapat diamati untuk pemberitahuan; Anda dapat membuat "identitas" baru untuk bot; dan Anda dapat membuat keputusan berdasarkan proposal yang diajukan.

Sebagai opsi untuk pengembangan lebih lanjut, konfigurasi dan manajemen pemantauan di bot itu sendiri menunjukkan dirinya, tetapi di sini Anda tidak dapat melakukannya tanpa python. Jika seseorang memegang tangan saya sebelum saya - Anda tahu di mana harus mengunggah permintaan tarik :-)

Source: https://habr.com/ru/post/id483318/


All Articles