Zabbix adalah produk hebat untuk administrator perangkat lunak dan sistem perangkat keras yang besar. Sangat bagus sehingga dapat digunakan tidak hanya oleh bisnis besar, tetapi juga oleh bisnis menengah-kecil, dan bahkan dalam proyek pet
. Secara umum, saya memiliki sedikit pengalaman dengan Zabbix dan saya dapat dengan aman merekomendasikannya untuk digunakan.
Benar, saya tidak bisa mengatakan bahwa saya mengerti " filosofi Zabbix ". Terlepas dari dokumentasi terperinci yang luas dalam bahasa Rusia, sulit bagi saya untuk terjun ke dunia Zabbix - saya merasa bahwa para pengembang dan saya menyebut hal yang sama dengan nama yang berbeda. Mungkin karena Zabbix dibuat oleh admin untuk admin, tetapi saya masih lebih sebagai pengembang dan pengguna.
Namun, untuk menjalankan Zabbix dan memonitor parameter utama sistem komputer (prosesor, memori, dll.), Keterampilan pengguna linux biasa sudah cukup. Ada banyak plug-in dari pengembang pihak ketiga yang memperluas kemampuan Zabbix. Untuk kebutuhan saya, saya perlu mengkonfigurasi pemantauan server Redis. Saya mencari-cari sedikit dalam kode plug-in yang tersedia dan, menggunakan contoh mereka, menemukan bahwa arsitektur Zabbix memungkinkan Anda untuk hanya terhubung ke pemantauan parameter sistem informasi yang dapat diekspresikan dalam bentuk numerik.
Di bawah kucing - contoh plugin Zabbix dengan penjelasan saya tentang terminologi Zabbix. Bagi sebagian orang, contoh ini akan tampak naif, tetapi bagi sebagian orang akan lebih mudah merasa nyaman dengan konsep. Bagaimanapun, Zabbix cukup besar untuk merasakannya dari sudut yang berbeda.
Konsep dasar
Secara singkat tentang beberapa konsep yang digunakan dalam Zabbix: agen , item , pemicu , tindakan , pemberitahuan , templat .
Server dan Agen
Dari sudut pandang pengguna, Zabbix dibagi menjadi dua bagian besar: server dan agen. Server terletak di satu mesin, yang mengumpulkan dan menyimpan data statistik, dan agen di mesin-mesin dari mana data dikumpulkan:

Opsi pemantauan
Kuantitas apa pun yang dapat diekspresikan dalam bentuk angka atau string disebut dalam terminologi Zabbix - elemen data (item). Setiap elemen dikaitkan dengan kunci unik (nama). Berikut ini contoh item data:
- system.cpu.load [percpu, avg1] : 0.1167
- system.uname : "Linux supru 4.15.0-50-generic # 54-Ubuntu SMP Senin 6 Mei 18:46:08 UTC 2019 x86_64"
Nilai elemen data ini (parameter pemantauan) dilampirkan ke waktu, riwayat nilai parameter disimpan dalam database server.
Acara
Ketika suatu peristiwa terjadi di Zabbix, sebuah pemicu kebakaran. Sebagai contoh
- {system.cpu.load [percpu, avg1] .avg (5m)}> 10 - nilai rata-rata parameter selama 5 menit terakhir telah melampaui "10"
- {system.uname.diff (0)}> 0 - nilai parameter saat ini tidak sama dengan nilai sebelumnya
Bahkan, pemicu adalah rumus di mana parameter pemantauan (saat ini dan disimpan) bertindak sebagai variabel, dan yang menghasilkan true
/ false
pada output.
Tindakan dan Peringatan
Jika terjadi suatu peristiwa (pemicu), server dapat melakukan suatu tindakan. Misalnya, kirim peringatan email ke alamat yang diberikan (" Masalah: host tidak dapat dijangkau selama 5 menit "). Juga, suatu tindakan dapat dilakukan jika pemicu kembali ke keadaan semula (" Diselesaikan: host tidak dapat dijangkau selama 5 menit "). Semua peristiwa (pemicu pemindahan) dicatat di sisi server.
Pola
Zabbix memungkinkan untuk mengonfigurasi aturan pemantauan untuk satu host, serta membuat template aturan (templat) yang dapat diterapkan ke berbagai host:

Contoh menunjukkan bahwa templat "Templat Aplikasi SSH Layanan" menjelaskan satu aplikasi (Aplikasi), satu parameter pemantauan (Item), satu pemicu (Pemicu). Deskripsi untuk grafik, layar, aturan penemuan, dan skrip web juga tersedia.
Mengatur tugas untuk plugin
Posisi awal
Zabbix sendiri menawarkan pluginnya sendiri untuk memantau status Redis, tetapi pada versi server saya (4.2.8) saya tidak dapat menggunakannya (plugin untuk versi 4.4 dan lebih tinggi). Solusi dari pihak ketiga juga ditawarkan (sekitar selusin opsi untuk berbagai versi Zabbix, hanya ada tiga yang pertama dalam gambar):

Masing-masing memiliki kelebihan dan kekurangan masing-masing, harus melihat ke dalam untuk memilih. Yang terbaik, menurut pendapat saya, adalah plugin Shakeeljaveed / zabbix-redis-userparamaters , yang terdiri dari dua file:
- README.md
- redis-userparameter.conf
Saya harus bekerja sedikit "pena", tetapi pada contohnya itu menjadi sedikit lebih jelas bagaimana data dari agen masuk ke server. Atas saran penulis Javeed Shakeel, status Redis direset setiap 2 menit oleh mahkota ke file /tmp/redismetric
:
*/2 * * * * /usr/bin/redis-cli info > /tmp/redismetric
Dan kemudian setiap parameter pemantauan diekstraksi oleh agen dari file /tmp/redismetric
menggunakan alat-alat sistem operasi itu sendiri. Instruksi untuk ini ditempatkan dalam konfigurasi agen Zabbix /etc/zabbix/zabbix_agent.conf.d/userparameter_redis.conf
. Sebagai contoh, ini adalah bagaimana instruksi untuk mengambil parameter used_memory
(penggunaan memori oleh server Redis) terlihat seperti ini:
UserParameter=used_memory,grep -w 'used_memory' /tmp/redismetric | cut -d: -f2
Yaitu, dalam file /tmp/redismetric
dengan output redis-cli INFO
, string ( grep -w ...
) dicari oleh kunci used_memory
used_memory:7153216
yang kemudian dibagi menjadi kolom oleh pemisah ":" ( cut -d: -f2
). Pada output, agen menerima nomor 7153216
dan menugaskannya ke parameter used_memory
.
Tetap mengkonfigurasi server melalui antarmuka berbasis web sehingga secara berkala mengirim permintaan ke agen untuk menerima data menggunakan parameter used_memory
, setelah data mulai used_memory
ke server, disimpan dalam database, Anda dapat menggunakannya untuk membuat grafik dan membuat pemicu yang merespons perubahan pada parameter ini.
Tujuan
Tugas memantau status sistem apa pun tidak hanya pengumpulan statistik, tetapi juga peringatan tentang terjadinya situasi yang membutuhkan intervensi manusia. Karena saya bekerja dengan Redis sebagai pengguna yang sangat pemula, saya harus mencari informasi tentang parameter "kesehatan" apa yang harus diperhatikan dan apa artinya. Artikel yang paling layak adalah " 6 Metrik Pemantauan Redis Krusial yang Perlu Anda Awasi ." Setelah menganalisisnya, saya sampai pada kesimpulan bahwa "untuk kebahagiaan lengkap" saya perlu mengumpulkan data untuk mendeteksi peristiwa berikut:
- Fragmentasi memori: used_memory_rss / used_memory> 1.5
- Rasio hit cache rendah: (keyspace_hits) / (keyspace_hits + keyspace_misses) <0.8
- Koneksi yang ditolak: ditolak_connections> 0
- Kunci yang diusir: evicted_keys> 0
Saya juga ingin mengumpulkan statistik tentang parameter tambahan (versi Redis, waktu aktif, dll.). Secara umum, memiliki gagasan umum tentang bagaimana data dikumpulkan oleh agen dan dikirim ke server, Wishlist dapat sangat terbatas. Hasilnya, kami mendapat daftar parameter untuk pemantauan dari 12 posisi.
Buat plugin Anda sendiri
Opsi pemantauan
Plugin yang saya analisis mengasumsikan eksekusi perintah terpisah untuk mendapatkan parameter terpisah (data item, item):
grep -w 'used_memory' /tmp/redismetric | cut -d: -f2
Artinya, untuk mendapatkan data pada 12 parameter, agen harus mengeksekusi berbagai set perintah 12 kali. Dan jika saya perlu memonitor parameter yang sulit untuk diekstraksi dengan serangkaian perintah dan perlu menulis skrip shell terpisah atau program lengkap? Untuk "Daftar Keinginan" seperti itu, Zabbix menawarkan varian dengan elemen data dependen. Esensinya adalah bahwa di sisi agen, skrip membentuk kumpulan data (misalnya, dalam format JSON), yang ditransmisikan ke server sebagai parameter string. Kemudian, di sisi server, data yang diterima diuraikan dan parameter elementer individu diekstraksi dari mereka.
Item data utama
Saya menjelaskan redis.info
data redis.info
utama redis.info
tipe string dengan periode pembaruan 1 menit, tanpa menyimpan riwayat perubahan:

Agaknya, JSON berikut harus dihasilkan di sisi agen:
{ "version": "4.0.9", "uptime": 1897336, "used_memory": 1054943416, "used_memory_rss": 1138159616, "keyspace_hits": 75810274, "keyspace_misses": 13545949, "connected_clients": 15, "rdb_last_save_time": 1580126954, "total_connections_received": 1258614, "rejected_connections": 0, "expired_keys": 60270, "evicted_keys": 0 }
setelah itu teks ini harus redis.info
ke server sebagai redis.info
data redis.info
, tetapi tidak disimpan, tetapi berfungsi sebagai basis untuk elemen data lainnya (parameter pemantauan).
Item Data Tanggungan
Parameter uji redis.info.version
bergantung pada redis.info
dan menyimpan nilainya dalam database selama 90 hari. Frekuensi pemantauan parameter tergantung pada elemen dasar ( redis.info
):

Nilai parameter redis.info.version
diambil dari nilai redis.info
menggunakan instruksi JSONPath:

Skema serupa menjelaskan elemen-elemen data dependen yang tersisa (parameter pemantauan), yang dikirim dalam bentuk JSON. Berikut adalah contoh deskripsi parameter numerik redis.info.used_memory
:

Semuanya cukup transparan, dengan pengecualian Trend storage period
Units
dan Trend storage period
. Saya tidak mengerti poin kedua, saya membiarkannya secara default, dan unit pengukuran dijelaskan dalam dokumentasi . Dalam hal ini, nilai redis.info.used_memory
diukur dalam byte dan diminimalkan ke kilo / mega / giga / ...- byte di antarmuka web.
Rumus untuk mengekstraksi nilai dari JSON adalah: JSONPath = $.used_memory
Item Data yang Dihitung
Untuk menghitung fragmentasi memori, hubungan used_memory_rss
/ used_memory
digunakan, dan atas dasar pemicu ditentukan bahwa akan menyala ketika rasio melebihi 1,5. Zabbix memiliki tipe elemen data yang dikomputasi:

Nilai untuk parameter redis.info.used_memory_ratio
dihitung setiap menit berdasarkan nilai terakhir dari dua parameter lainnya ( redis.info.used_memory_rss
dan redis.info.used_memory
), disimpan dalam database selama 90 hari, dll.
Pemicu
Berikut adalah contoh pemicu yang menyala ketika memori terlalu terfragmentasi:

Tidak ada yang aneh, kecuali untuk format ekspresi yang digunakan dalam rumus perubahan status pemicu. Zabbix memiliki perancang formulir, Anda dapat menggunakannya atau merujuk ke dokumentasi / contoh (daftar pemicu tersedia melalui antarmuka web di " Configuration / Templates / $ {TemplateName} / Triggers ").
Pemicu dapat didasarkan pada elemen data apa saja (item), terlepas dari jenisnya (utama, dependen, dihitung).
Pengaturan agen
Generasi JSON
Untuk mendapatkan nilai parameter pemantauan dan pembentukan JSON, saya menggunakan skrip shell ini:
Saya menempatkan skrip ini di file /var/lib/zabbix/user_parameter/redis/get_info.sh
di server dengan Redis, di mana agen Zabbix sudah diinstal. Pengguna di mana agen Zabbix zabbix
(biasanya zabbix
) harus memiliki izin untuk mengeksekusi file get_info.sh
.
File userparameter_XXX.conf
Di sisi agen, parameter pemantauan tambahan userparameter_*.conf
dalam file userparameter_*.conf
di direktori userparameter_*.conf
. Oleh karena itu, agar agen mengetahui bagaimana perlu mengumpulkan data pada parameter redis.info
, saya membuat file /etc/zabbix/zabbix_agentd.d/userparameter_redis.conf
dengan konten berikut:
UserParameter=redis.info,/var/lib/zabbix/user_parameter/redis/get_info.sh
Yaitu, untuk mendapatkan data pada parameter redis.info
agen harus menjalankan skrip /var/lib/zabbix/user_parameter/redis/get_info.sh
dan mentransfer hasil eksekusi ke server.
Setelah memulai ulang agen Zabbix ( sudo service zabbix-agent restart
), dimungkinkan untuk mengumpulkan data untuk parameter redis.info
dan mengirimkannya ke server.
Ringkasan
Memahami Zabbix datang kepada saya (dan masih datang) cukup sulit. Namun demikian, saya menganggapnya sebagai alat yang hebat, terutama setelah kesederhanaan menambahkan parameter pemantauan saya sendiri (elemen data) terbuka untuk saya. Secara umum, cukup menambahkan satu file ke server dengan agen ( userparameter_XXX.conf
) dengan perintah shell untuk mengumpulkan data dan mengkonfigurasi server Zabbix untuk menerima data ini melalui antarmuka web. Dan itu saja - Anda dapat mengumpulkan data, membuat grafik, menganalisis perubahan, dan membuat pemicu yang merespons perubahan ini.
Kode untuk templat, file userparameter_redis.conf
dan skrip get_info.sh
dapat dilihat di proyek flancer32 / zabbix_plugin_redis .
Terima kasih kepada semua orang yang membaca sampai akhir, dan terutama kepada mereka yang menemukan sesuatu yang bermanfaat untuk diri mereka sendiri dalam publikasi.