Grafana memiliki kemampuan untuk
menunjukkan status , Grafana memiliki kemampuan untuk menampilkan
data dalam waktu . Namun, secara paradoks, Grafana belum memiliki cara yang nyaman untuk menampilkan
status dari waktu ke waktu !
Kami menyajikan plugin kami -
panel Statusmap . Ini memungkinkan Anda untuk secara visual menampilkan keadaan serangkaian objek untuk periode waktu yang dipilih. Sebagai contoh yang mendemonstrasikan operasi plugin, bayangkan banyak lokasi di mana kopi disiapkan untuk seseorang:
Anda dapat melihat bagaimana Nikki menghemat energi, Gerry dengan cepat mengisi kembali persediaan air, mesin kopi Valera sering kali sampah, dan Wi-Fi jelas lebih baik di Bifrost daripada di stasiun bulan, di mana tampaknya sangat ketat dengan air.Terlihat menarik? Tapi mari kita mulai dengan bagaimana kita semua sampai pada hal ini.
Mengapa
Untuk visualisasi data yang lebih baik, kami menetapkan tugas sederhana kepada diri kami sendiri: untuk menampilkan status rangkaian deret waktu selama periode waktu tertentu. Seperangkat objek berarti rentang waktu yang berbeda: mereka dapat berbeda dalam satu set label dan nama. Selain itu, nilai rentang waktu harus nyaman, mis. tanpa kruk, ditampilkan dalam teks dan warna.
Contoh aktual penggunaan visualisasi ini untuk bisnis kami adalah kesehatan server atau pod Kubernetes, hasil dari pengecekan layanan HTTP. Maka di Flant, sebuah plugin Grafana bernama Statusmap lahir. Merenungkan banyak kemungkinan penerapannya untuk tugas-tugas lain, kami dengan cepat membuat komitmen untuk membagikan kode dengan komunitas dunia. Tapi sungguh, tidak ada yang memecahkan masalah ini sebelum kita?
Kenapa belum siap?
Tugas ini sangat populer, jadi kami tidak menjadi perintis di dalamnya. Semuanya dimulai dengan fakta bahwa kami memiliki beberapa dasbor dengan plug-in keren
Panel Status dan
Status Dot . Plugin ini memungkinkan Anda untuk menampilkan keadaan saat ini dari satu set objek, misalnya, host atau perapian ... atau mesin kopi di berbagai belahan dunia.


Semuanya berjalan baik sampai kami ingin melihat status objek-objek ini tepat waktu. Solusi pertama dan termudah adalah menambahkan grafik biasa dengan tanda centang
bertumpuk .

Menurut ide tersebut, Panel Status + Grafik bertumpuk akan memungkinkan kita untuk melihat keadaan objek "untuk saat ini" dan situasi dalam waktu. Namun, Grafik yang ditumpuk tidak begitu jelas:
- warna menunjukkan rentang waktu yang berbeda, bukan nilai yang ditampilkan dalam warna untuk Status Dot atau Panel Status. Artinya, warna untuk dua grafik tidak sama dan ini membingungkan;
- jika
null
muncul di antara nilai, maka grafik gagal.
Mereka mencoba mengadaptasi
Heatmap standar - itu tidak berhasil: plugin bekerja dengan sumbu Y hanya pada tingkat nilai dan tidak tahu cara menampilkan label di sana. Kemudian kami mencoba plugin berikut untuk Grafana:
- Bidang karpet - mengelompokkan nilai berdasarkan hari dan berdasarkan fragmen yang dipilih hari itu;
- Panel Diskrit adalah plugin yang baik, tetapi kita perlu menunjukkan status secara terpisah dari waktu ke waktu;
- Panel Status by Group adalah perbaikan yang baik untuk panel Status, memungkinkan Anda untuk menampilkan banyak status, tetapi masih tanpa kemampuan yang kami butuhkan.
Berdasarkan hasil semua penelitian, kami merumuskan persyaratan berikut untuk plugin:
- garis grafik yang disorot jelas untuk setiap objek;
- nama objek ditampilkan di sepanjang sumbu Y dan diatur dalam bidang legenda;
- satu objek dapat memiliki beberapa status - dalam kasus seperti itu, yang paling signifikan akan ditampilkan dalam warna, dan sisanya akan ditampilkan di tooltip;
- ember harus ditampilkan dengan lebar setidaknya yang diberikan (5 px), karena dalam pixel-tunggal nyaman untuk mengarahkan mouse;
- manajemen warna manual - kemampuan untuk mengatur warna untuk setiap nilai numerik dari set diskrit.
Biarkan saya sekarang melakukan penyimpangan kecil tentang Heatmap, grafik Prometheus dan status diskrit ...
Sedikit teori
Peta panas klasik adalah grafik 3 dimensi:
- sumbu x mewakili waktu
- sepanjang sumbu Y adalah nilai yang mungkin dari jumlah tertentu,
- sepanjang sumbu Z adalah jumlah nilai yang diamati pada waktu tertentu.
Plugin Heatmap standar menampilkan sumbu Z dalam warna - misalnya, dari putih ke merah atau melalui gradien hijau-kuning-merah. Ini bekerja dengan sangat baik untuk nilai kontinu: waktu respons, panjang antrian, jumlah permintaan ke server ... Dalam kasus status diskrit untuk satu set objek, Anda memerlukan yang berikut: pada sumbu Y menampilkan nama-nama objek yang kami pantau, dan pada sumbu Z menunjukkan yang dapat diamati untuk setiap objek status pada waktu tertentu ... Tapi tunggu! Apa arti set status suatu objek pada suatu waktu? Saya akan coba gambarkan.
Mereka yang menggunakan Prometheus dengan Grafana tahu tentang
step
atau
interval
- pengaturan pada tab
Kueri . Jika Anda menentukan
1m
, dan data yang Anda kumpulkan dengan interval
5s
, maka ketika Anda melakukan permintaan metrik sederhana,
coffee_maker_status
Prometheus akan mengembalikan setiap nilai ke-12, dan 11 nilai tidak dapat dilihat pada grafik. Bagaimana cara memperbaiki situasi?
Hal pertama yang terlintas dalam pikiran adalah menggunakan fungsi agregasi - misalnya,
*_over_time(coffee_maker_status[1m])
. Fungsi mana yang harus saya ambil? Saatnya mencari tahu bagaimana status muncul di metrik Prometheus. Dalam kebanyakan kasus, status ditunjukkan oleh serangkaian nilai tertentu. Misalnya, untuk
coffee_maker_status
mungkin ada nilai status seperti itu:
- 0 - ok
- 1 - mati
- 2 - tanpa kacang,
- 3 - tidak ada air,
- 4 - gagal.
Selanjutnya, akan tampak sederhana: ambil jumlah nol, satu, dua, dll. dalam satu menit ... dan kami memiliki data yang sangat baik untuk ditampilkan pada grafik! Tetapi Prometheus memiliki pandangan sendiri tentang ini:
coffee_maker_status[1m]
adalah vektor rentang, dan oleh karena itu ekspresi seperti
max_over_time(coffee_maker_status[1m]==2)
atau
count_values_over_time(coffee_maker_status[1m], 3)
, yang sangat cocok, tidak mungkin.
Semuanya berfungsi dengan baik jika ada dua nilai dalam metrik:
0
(status tidak diamati) dan
1
(status diamati), dan status itu sendiri disimpan dalam label. Maka Anda dapat membuat permintaan seperti itu:
(max_over_time(coffee_maker_status{status="3"}[1m]) == 1) *3
Apa yang harus dilakukan dengan metrik yang memiliki beberapa nilai? Catatan "
Menyusun fungsi rentang vektor di PromQL " memberikan gagasan untuk mengubah metrik dengan nilai diskrit menjadi metrik dengan label. Ini dapat dilakukan dengan menggunakan aturan perekaman berikut:
- record: coffee_maker_status:discrete expr: | count_values("status", coffee_maker_status)
Aturan ini mengubah metrik
coffee_maker_status
ini: jika nilai
3
coffee_maker_status:discrete{status="3"}
, maka Prometheus membuat metrik
coffee_maker_status:discrete{status="3"}
dengan nilai 1. Maka, untuk setiap nilai yang diamati.
Biasanya status ditentukan terlebih dahulu, sehingga Anda dapat membuat satu set kueri agar tidak ketinggalan nilai yang diperlukan. Legenda untuk semua kueri harus cocok untuk mengelompokkan nilai:

Sekarang, jika sebentar mesin kopi dimatikan selama 30 detik (status off -
1
), dan sisa waktu bekerja (status ok -
0
), maka kita akan memiliki informasi tentang shutdown, karena plugin akan menerima dua nilai dengan satu legenda sekaligus:
0
dari kueri A dan
1
dari kueri B.
Bagus: kami menemukan cara untuk mengumpulkan data pada status diskrit dan masih tidak kehilangan informasi. Tetap mencari tahu bagaimana menggabungkan data berdasarkan legenda dan menggambarnya di panel.
Plugin Statusmap
Tentu saja, kami tidak segera sampai pada apa yang dijelaskan di atas, tetapi ketika semua ini menyatu, menjadi jelas bahwa, pada dasarnya, mekanisme rendering tidak cukup. Sekarang ada mekanisme seperti itu -
plugin panel Statusmap , yang dapat melakukan hal berikut:
- nilai pada setiap titik waktu dikelompokkan ke dalam keranjang oleh kebetulan teks legenda yang ditentukan dalam Kueri ;
- Setiap teks legenda memiliki garis tersendiri pada bagan dan teks ditampilkan sebagai label pada sumbu Y, dan nilai kosong ditampilkan sebagai spasi atau sebagai
0
:

- untuk nilai apa pun, Anda dapat menentukan warna keranjang yang tepat:

- jika ada beberapa nilai dalam keranjang, warna akan diambil untuk nilai yang ditentukan di atas pada tab Warna , dan ketika Anda mengarahkan kursor ke keranjang, semua nilai yang jatuh ke dalamnya ditampilkan:

- plugin ini dapat membentuk
interval
untuk permintaan ke Prometheus sehingga keranjang tidak berubah menjadi garis piksel.
Hasilnya adalah representasi yang sangat nyaman dari
status beberapa objek . Dan Anda dapat melihat status saat ini (ini adalah keranjang paling kanan) dan status objek tepat waktu.
Dari mana mendapatkan
Kode sumber untuk plugin Grafana Statusmap didistribusikan di bawah lisensi MIT gratis
(mirip dengan plugin Grafana lainnya) . Saat ini tersedia di
GitHub kami .
Dan kami sangat berharap bahwa dalam waktu dekat ini akan masuk ke repositori plugin Grafana . DIPERBARUI (03/10/18): Plugin ini telah
diterima di katalog Grafana resmi.
Dan akhirnya - ilustrasi tentang bagaimana Statusmap membantu memvisualisasikan data dengan status perapian dari kluster produksi Kubernetes:

PS
Baca juga di blog kami: