
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
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:
- MSMS_SERVICE_NAME : nama layanan - akan digunakan dalam lansiran dan pemantauan log .
- MSMS_SERVICE_ENDPOINT : titik akhir dari layanan yang akan kami hubungi dengan curl.
- MSMS_CURL_PARAMS : parameter ikal tambahan, lihat contoh di bawah ini.
- MSMS_EXPECTED : respons layanan yang diharapkan. Digunakan jika jawabannya singkat.
- MSMS_EXPECTED_FILE : nama file dengan respons layanan yang diharapkan. Jika ditentukan, timpa MSMS_EXPECTED.
- 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'
Di
MSMS_CURL_PARAMS
Anda dapat menentukan semua yang dapat dilakukan curl, termasuk:
- Nonaktifkan pesan keriting agar tidak menyumbat konsol dan masuk:
-s
- Atur batas waktu koneksi dengan layanan yang sedang diperiksa (dalam detik):
--connect-timeout 3
- Tetapkan batas waktu respons:
-m 7
- Nonaktifkan verifikasi sertifikat untuk SSL (misalnya, jika sertifikat yang ditandatangani sendiri digunakan):
--insecure
- Tentukan jenis permintaan http:
-X POST
- Tentukan tajuk:
-H "Content-Type: application/json"
- 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).
- 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:

- service-fail.txt:
, ... \"$MSMS_SERVICE_NAME\" , : \`$RESPONSE\`
Hasil:

Di sini kita menggunakan variabel skrip lain: RESPONSE
. Ini berisi respons dari layanan.
- 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:
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:
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')
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 :-)