Pemantauan orang miskin atau pemantauan server dari konsol

Semua pembaca yang terhormat. Pada artikel ini saya akan memberi tahu Anda tentang "sepeda" saya, di mana saya melakukan pemantauan berbagai hal tanpa meninggalkan konsol.

Saya pernah menghadapi situasi di mana cukup banyak proyek dan server berbeda berkembang biak, dan tangan saya tidak mencapai pengaturan pemantauan normal.

Dan di dunia modern, pemantauan "benar" menyiratkan penyebaran sejumlah besar perangkat lunak, konfigurasi semua ini. Yah Anda tahu ada ... buruh pelabuhan, tumpukan elastis dan pergilah. Bagi saya itu adalah overhead yang kuat. Saya ingin satu atau dua dalam produksi.

Saya melihat ke arah monitor Sederhana pada python, itu paling dekat dengan saya dalam roh, tetapi tidak memiliki beberapa fitur. Dan pada saat yang sama saya ingin belajar Go ... well, secara umum, Anda sendiri tahu bagaimana biasanya semuanya dimulai.

Jadi saya mengambil pengelasan Go, dan mengumpulkan Sepeda ini.

Pemantauan Cli ditulis dalam Go dan merupakan sekumpulan binari, yang masing-masing menerima data dari stdin, melakukan beberapa tugas khusus dan menampilkan hasilnya di stdout.

Total ada empat jenis biner: metrik , prosesor , filter , dan keluaran .

Metrik , seperti namanya, mengumpulkan data apa pun dan biasanya masuk dulu dalam rantai.
Prosesor berada di tengah dan entah bagaimana mengubah data atau melakukan fungsi utilitas lainnya.
Filter hampir seperti prosesor, tetapi tidak seperti mereka, mereka melewatkan atau tidak melewatkan data, tergantung pada kondisinya.
Keluaran berada di pintu keluar rantai dan digunakan untuk mengirim pemberitahuan ke berbagai layanan.

Seluruh rantai perintah biasanya memiliki bentuk:

some_metric | processor_1 | processor_2 ... | cm_p_message | output_1 | output_2 ...

Setiap bagian dari rantai ini dapat berupa perintah Linux, selama ia menerima data di stdin dan mengirimkannya ke stdout tanpa buffering. Hanya ada satu NAMUN kecil yang terkait dengan jeda baris, tetapi lebih banyak tentang itu nanti.

Nama binari dibentuk sebagai cm_ {type} _ {name} , di mana tipe adalah satu dari tiga: m, p, f atau o , dan nama adalah nama perintah.

Misalnya, cm_m_cpu adalah metrik yang menampilkan statistik pada prosesor dalam format json ke stdout.

Dan file cm_p_debounce adalah prosesor yang hanya mengeluarkan satu pesan setiap kali pada interval tertentu.

Ada satu prosesor cm_p_message khusus yang harus berada di depan output pertama. Ini membuat pesan dari format yang diperlukan untuk pemrosesan selanjutnya oleh Keluarannya.

Untuk menangani json di konsol dan berbagai kondisi, saya menggunakan utilitas jq . Ini seperti sed, hanya untuk json.

Ini adalah bagaimana, misalnya, pemantauan CPU terlihat seperti pada akhirnya.

 cm_m_cpu | cm_p_eot2nl | jq -cM --unbuffered 'if .LoadAvg1 > 1 then .LoadAvg1 else false end' | cm_p_nl2eot | cm_f_regex -e '\d+' | cm_p_debounce -i 60 | cm_p_message -m 'Load average is {stdin}' | cm_o_telegram 

Dan demikian pemantauan jumlah pesan dalam antrian RabbitMQ

 while true; do rabbitmqctl list_queues -p queue_name | grep -Po --line-buffered '\d+'; sleep 60; done | jq -cM '. > 10000' --unbuffered | cm_p_nl2eot | cm_f_true | cm_p_message -m 'There are more than 10000 tasks in rabbit queue' | cm_o_opsgenie 

Jadi Anda dapat memantau bahwa tidak ada yang ditulis ke file dalam 10 detik

 tail -f out.log | cm_p_nl2eot | cm_p_watchdog -i 10 | cm_p_debounce -i 3600 | cm_p_message -m 'No write to out.log for 10 seconds' -s 'alert' | cm_o_telegram 

Jangan buru-buru menutup layar, sekarang kita akan menganalisis apa yang terjadi di sini pada contoh pertama.

1) Metrik cm_m_cpu menampilkan sekali per detik (ditentukan oleh parameter -i, secara default per detik) string dalam format json. Misalnya, {"LoadAvg1": 2.0332031, "LoadAvg2": 1.9018555, "LoadAvg3": 1.8623047}

2) cm_p_nl2eot adalah salah satu perintah utilitas yang mengubah karakter EOT ke karakter LF. Faktanya adalah, untuk menghindari masalah dengan pembungkus baris, saya memutuskan untuk memastikan bahwa semua binari saya membaca data hingga karakter ascii EOT (End of Transmission). Ini memungkinkan Anda untuk mentransfer data multi-line antar tim dengan aman.

Karena itu, ketika ada perintah lain yang dipanggil, mereka harus dikelilingi dalam bentuk:
cm_p_eot2nl | tim lain | cm_p_nl2eot.

3) Berikutnya adalah panggilan ke utilitas jq , yang memeriksa bidang LoadAvg1 dan jika lebih besar dari 1, kemudian menampilkannya lebih lanjut, jika kurang, menampilkan false

4) Selanjutnya, kita perlu membuang seluruh pesan yang salah dari rantai. Untuk melakukan ini, kami menerapkan filter cm_f_regex , yang mengambil string sebagai input, mencocokkannya dengan ekspresi reguler, dan, dalam kasus pertandingan, menampilkannya lebih lanjut. Jika tidak, string hanya dibuang

Grep biasa dapat digunakan, tetapi pertama-tama buffer output, dan sintaks lengkap menjadi sedikit lebih lama (grep - line-buffered), kedua cm_f_regex membuatnya sangat mudah untuk menampilkan pertandingan grup. Sebagai contoh:

cm_f_regex -e '(\d+)-(\d+)' -o '{1}/{2}'

Mengubah baris 123-345 ke baris 123/345

5) Prosesor cm_p_debounce , dalam hal ini, mengambil nilai LoadAvg1 kami dan menampilkannya lebih lanjut ke rantai hanya sekali setiap 60 detik. Ini diperlukan agar Anda tidak melakukan spam. Anda dapat mengatur interval lainnya.

6) Hampir semuanya siap. Tetap hanya untuk membentuk pesan dan mengirimkannya ke telegram. Pesan dihasilkan oleh perintah cm_p_message khusus. Ini hanya menerima string sebagai input, membuat json dengan Severity, Message, dan bidang lainnya dan kemudian output untuk pemrosesan output. Jika kita tidak meneruskan opsi -m ke sana, maka stdin akan menjadi pesan, mis. nomor millet adalah LoadAvg1 kami. Ini tidak terlalu informatif.

7) Tim cm_o_telegram hanya mengirim pesan yang diterima ke telegram. Pengaturan Telegram disimpan dalam file ini.

Konfigurasi


Semua parameter yang menerima binari dapat ditentukan dalam file ini. Parameter yang ditentukan oleh argumen baris perintah didahulukan dari file ini.

Format file init adalah:

[global]
host_name=override host name for this machine

[telegram]
cid=....
token=....

[opsgenie]
apiToken=...
apiEndpoint=...
......

[debounce]
i=3600


File ini sendiri dipilih dengan urutan sebagai berikut:

1) File cm.config.ini di direktori kerja saat ini
2) File /etc/cm/config.ini jika file dari item 1 tidak ditemukan

Produksi


Di server nyata, saya membuat file, misalnya, cpu.sh, di mana semua rantai perintah yang diperlukan ditulis. Kemudian di mahkota saya meresepkan sesuatu seperti ini:

*/5 * * * * flock -n /etc/cm/cpu.lock /etc/cm/cpu.sh > /dev/null

Jika sesuatu jatuh dari kawanan akan menaikkan kembali perintah. Dan itu saja! Kesederhanaan yang tidak begitu saya miliki.

Ini adalah alat semacam itu, mungkin seseorang akan merasa nyaman. Bagi saya, kemudahannya adalah tidak perlu membuat banyak hal yang tidak perlu hanya untuk memantau hal-hal yang diperlukan. Dan semuanya dikonfigurasikan dengan mudah: kloning repositori, menambahkan path ke binari di $ PATH dan hanya itu.

Tolong jangan menilai dengan ketat. Alat ini ditulis untuk saya sendiri, set perintah belum besar. Tetapi saya akan dengan senang hati menerima umpan balik dan saran. Terima kasih atas perhatiannya.

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


All Articles