Pembangunan pemalam untuk Grafana: sejarah tangkapan besar

Hai semua! Beberapa bulan yang lalu, kami melancarkan projek sumber terbuka baharu kami ke dalam pengeluaran - pemalam Grafana untuk memantau kubernetes, yang kami panggil DevOpsProdigy KubeGraf. Kod sumber pemalam tersedia di repositori awam di GitHub. Dan dalam artikel ini kami ingin berkongsi dengan anda kisah bagaimana kami mencipta pemalam, alat apa yang kami gunakan dan apa masalah yang kami temui semasa proses pembangunan. Mari pergi!

Bahagian 0 - pengenalan: bagaimana kita sampai ke tahap ini?

Idea untuk menulis pemalam kami sendiri untuk Grafan datang kepada kami secara tidak sengaja. Syarikat kami telah memantau projek web pelbagai peringkat kerumitan selama lebih daripada 10 tahun. Pada masa ini, kami telah mengumpul sejumlah besar kepakaran, kes yang menarik, dan pengalaman dalam menggunakan pelbagai sistem pemantauan. Dan pada satu ketika kami bertanya kepada diri sendiri: "Adakah terdapat alat ajaib untuk memantau Kubernetes, supaya, seperti yang mereka katakan, "tetapkan dan lupakannya"?".. Standard industri untuk memantau k8, sudah tentu, telah lama menjadi Gabungan Prometheus + Grafana. Dan sebagai penyelesaian siap sedia untuk timbunan ini, terdapat satu set besar pelbagai jenis alatan: prometheus-operator, satu set papan pemuka kubernetes-mixin, grafana-kubernetes-app.

Pemalam grafana-kubernetes-app nampaknya merupakan pilihan yang paling menarik untuk kami, tetapi ia tidak disokong selama lebih daripada setahun dan, lebih-lebih lagi, tidak boleh berfungsi dengan versi baharu pengeksport nod dan kube-state-metrik. Dan pada satu ketika kami memutuskan: "Bukankah kita harus membuat keputusan sendiri?"

Idea yang kami putuskan untuk dilaksanakan dalam pemalam kami:

  • visualisasi "peta aplikasi": pembentangan aplikasi yang mudah dalam kelompok, dikumpulkan mengikut ruang nama, penempatan...;
  • visualisasi sambungan seperti "pengerahan - perkhidmatan (+port)".
  • visualisasi pengedaran aplikasi kluster merentasi nod kluster.
  • pengumpulan metrik dan maklumat daripada beberapa sumber: Prometheus dan pelayan api k8s.
  • pemantauan kedua-dua bahagian infrastruktur (penggunaan masa CPU, memori, subsistem cakera, rangkaian) dan logik aplikasi - pod status kesihatan, bilangan replika yang tersedia, maklumat tentang lulus ujian keaktifan/kesediaan.

Bahagian 1: Apakah itu "pemalam Grafana"?

Dari sudut pandangan teknikal, pemalam untuk Grafana ialah pengawal sudut, yang disimpan dalam direktori data Grafana (/var/grafana/plugins/ /dist/module.js) dan boleh dimuatkan sebagai modul SystemJS. Juga dalam direktori ini mesti ada fail plugin.json yang mengandungi semua maklumat meta tentang pemalam anda: nama, versi, jenis pemalam, pautan ke repositori/tapak/lesen, kebergantungan dan sebagainya.

Pembangunan pemalam untuk Grafana: sejarah tangkapan besar
modul.ts

Pembangunan pemalam untuk Grafana: sejarah tangkapan besar
plugin.json

Seperti yang anda boleh lihat dalam tangkapan skrin, kami menyatakan plugin.type = app. Kerana pemalam untuk Grafana boleh terdiri daripada tiga jenis:

panel: jenis pemalam yang paling biasa - ia adalah panel untuk menggambarkan sebarang metrik, digunakan untuk membina pelbagai papan pemuka.
sumber data: penyambung pemalam kepada beberapa sumber data (contohnya, Prometheus-datasource, ClickHouse-datasource, ElasticSearch-datasource).
aplikasi: Pemalam yang membolehkan anda membina aplikasi bahagian hadapan anda sendiri di dalam Grafana, mencipta halaman html anda sendiri dan mengakses sumber data secara manual untuk menggambarkan pelbagai data. Selain itu, pemalam jenis lain (sumber data, panel) dan pelbagai papan pemuka boleh digunakan sebagai kebergantungan.

Pembangunan pemalam untuk Grafana: sejarah tangkapan besar
Contoh kebergantungan pemalam dengan type=app.

Anda boleh menggunakan kedua-dua JavaScript dan TypeScript sebagai bahasa pengaturcaraan (kami memilihnya). Persediaan untuk pemalam hello-world dalam apa jua jenis yang anda boleh cari melalui pautan: repositori ini mengandungi sejumlah besar pek permulaan (malah terdapat contoh eksperimen pemalam dalam React) dengan pembina prapasang dan konfigurasi.

Bahagian 2: menyediakan persekitaran setempat

Untuk mengusahakan pemalam, kami sememangnya memerlukan gugusan kubernetes dengan semua alatan yang diprapasang: prometheus, pengeksport nod, kube-state-metrics, grafana. Persekitaran harus disediakan dengan cepat, mudah dan semula jadi, dan untuk memastikan muat semula panas, direktori data Grafana harus dipasang terus daripada mesin pembangun.

Cara paling mudah, pada pendapat kami, untuk bekerja secara tempatan dengan kubernetes ialah minikube. Langkah seterusnya ialah memasang gabungan Prometheus + Grafana menggunakan prometheus-operator. DALAM artikel ini Proses memasang prometheus-operator pada minikube diterangkan secara terperinci. Untuk mendayakan kegigihan, anda mesti menetapkan parameter kegigihan: benar dalam fail carta/grafana/values.yaml, tambahkan PV dan PVC anda sendiri dan nyatakan dalam parameter persistence.existingClaim

Skrip pelancaran minikube terakhir kami kelihatan seperti ini:

minikube start --kubernetes-version=v1.13.4 --memory=4096 --bootstrapper=kubeadm --extra-config=scheduler.address=0.0.0.0 --extra-config=controller-manager.address=0.0.0.0
minikube mount 
/home/sergeisporyshev/Projects/Grafana:/var/grafana --gid=472 --uid=472 --9p-version=9p2000.L

Bahagian 3: perkembangan sebenar

Model objek

Sebagai persediaan untuk melaksanakan pemalam, kami memutuskan untuk menerangkan semua entiti Kubernetes asas yang kami akan bekerjasama dalam bentuk kelas TypeScript: pod, deployment, daemonset, statefulset, job, cronjob, service, nod, namespace. Setiap kelas ini mewarisi daripada kelas BaseModel biasa, yang menerangkan pembina, pemusnah, kaedah untuk mengemas kini dan menukar keterlihatan. Setiap kelas menerangkan perhubungan bersarang dengan entiti lain, sebagai contoh, senarai pod untuk entiti pengerahan jenis.

import {Pod} from "./pod";
import {Service} from "./service";
import {BaseModel} from './traits/baseModel';

export class Deployment extends BaseModel{
   pods: Array<Pod>;
   services: Array<Service>;

   constructor(data: any){
       super(data);
       this.pods = [];
       this.services = [];
   }
}

Dengan bantuan getter dan setter, kami boleh memaparkan atau menetapkan metrik entiti yang kami perlukan dalam bentuk yang mudah dan boleh dibaca. Sebagai contoh, output terformat bagi nod cpu yang boleh diperuntukkan:

get cpuAllocatableFormatted(){
   let cpu = this.data.status.allocatable.cpu;
   if(cpu.indexOf('m') > -1){
       cpu = parseInt(cpu)/1000;
   }
   return cpu;
}

Laman

Senarai semua halaman pemalam kami pada mulanya diterangkan dalam pluing.json kami dalam bahagian dependencies:

Pembangunan pemalam untuk Grafana: sejarah tangkapan besar

Dalam blok untuk setiap halaman kita mesti menunjukkan NAMA HALAMAN (ia kemudiannya akan ditukar menjadi slug yang mana halaman ini boleh diakses); nama komponen yang bertanggungjawab untuk pengendalian halaman ini (senarai komponen dieksport ke module.ts); menunjukkan peranan pengguna yang berfungsi dengan halaman ini tersedia dan tetapan navigasi untuk bar sisi.

Dalam komponen yang bertanggungjawab untuk pengendalian halaman, kita mesti menetapkan templateUrl, melalui sana laluan ke fail html dengan markup. Di dalam pengawal, melalui suntikan kebergantungan, kami boleh mengakses sehingga 2 perkhidmatan sudut penting:

  • backendSrv - perkhidmatan yang menyediakan interaksi dengan pelayan API Grafana;
  • datasourceSrv - perkhidmatan yang menyediakan interaksi setempat dengan semua sumber data yang dipasang dalam Grafana anda (contohnya, kaedah .getAll() - mengembalikan senarai semua sumber data yang dipasang; .get( ) - mengembalikan objek contoh sumber data tertentu.

Pembangunan pemalam untuk Grafana: sejarah tangkapan besar

Pembangunan pemalam untuk Grafana: sejarah tangkapan besar

Pembangunan pemalam untuk Grafana: sejarah tangkapan besar

Bahagian 4: sumber data

Dari sudut pandangan Grafana, sumber data adalah pemalam yang sama seperti pemalam yang lain: ia mempunyai module.js titik masuknya sendiri, terdapat fail dengan plugin.json maklumat meta. Apabila membangunkan pemalam dengan jenis = aplikasi, kita boleh berinteraksi dengan kedua-dua sumber data sedia ada (contohnya, prometheus-datasource) dan kita sendiri, yang boleh kita simpan terus dalam direktori pemalam (dist/datasource/*) atau pasang sebagai pergantungan. Dalam kes kami, sumber data disertakan dengan kod pemalam. Anda juga perlu mempunyai templat config.html dan pengawal ConfigCtrl, yang akan digunakan untuk halaman konfigurasi contoh sumber data dan pengawal Sumber Data, yang melaksanakan logik sumber data anda.

Dalam pemalam KubeGraf, dari sudut pandangan antara muka pengguna, sumber data ialah contoh kelompok kubernetes yang melaksanakan keupayaan berikut (kod sumber tersedia ΠΏΠΎ ссылкС):

  • mengumpul data daripada pelayan api k8s (mendapatkan senarai ruang nama, penempatan...)
  • permintaan proksi kepada prometheus-datasource (yang dipilih dalam tetapan pemalam untuk setiap kelompok tertentu) dan memformatkan respons untuk menggunakan data kedua-dua dalam halaman statik dan dalam papan pemuka.
  • mengemas kini data pada halaman pemalam statik (dengan kadar penyegaran yang ditetapkan).
  • memproses pertanyaan untuk menjana helaian templat dalam papan pemuka grafana (kaedah metriFindQuery())

Pembangunan pemalam untuk Grafana: sejarah tangkapan besar

Pembangunan pemalam untuk Grafana: sejarah tangkapan besar

Pembangunan pemalam untuk Grafana: sejarah tangkapan besar

  • ujian sambungan dengan kluster k8s akhir.
testDatasource(){
   let url = '/api/v1/namespaces';
   let _url = this.url;
   if(this.accessViaToken)
       _url += '/__proxy';
   _url += url;
   return this.backendSrv.datasourceRequest({
       url: _url,
       method: "GET",
       headers: {"Content-Type": 'application/json'}
   })
       .then(response => {
           if (response.status === 200) {
               return {status: "success", message: "Data source is OK", title: "Success"};
           }else{
               return {status: "error", message: "Data source is not OK", title: "Error"};
           }
       }, error => {
           return {status: "error", message: "Data source is not OK", title: "Error"};
       })
}

Perkara menarik yang berasingan, pada pendapat kami, ialah pelaksanaan mekanisme pengesahan dan kebenaran untuk sumber data. Biasanya, di luar kotak, kami boleh menggunakan sumber data komponen Grafana terbina dalamHttpSettings untuk mengkonfigurasi akses kepada sumber data akhir. Menggunakan komponen ini, kami boleh mengkonfigurasi akses kepada sumber data http dengan menentukan url dan tetapan pengesahan/kebenaran asas: kata laluan log masuk, atau sijil-klien/kunci-klien. Untuk melaksanakan keupayaan untuk mengkonfigurasi akses menggunakan token pembawa (standard de facto untuk k8s), kami terpaksa melakukan sedikit tweaker.

Untuk menyelesaikan masalah ini, anda boleh menggunakan mekanisme "Laluan Plugin" Grafana terbina dalam (perincian lanjut di halaman dokumentasi rasmi). Dalam tetapan sumber data kami, kami boleh mengisytiharkan satu set peraturan penghalaan yang akan diproses oleh pelayan proksi grafana. Sebagai contoh, untuk setiap titik akhir individu adalah mungkin untuk menetapkan pengepala atau url dengan kemungkinan templat, data yang boleh diambil daripada medan jsonData dan secureJsonData (untuk menyimpan kata laluan atau token dalam bentuk yang disulitkan). Dalam contoh kami, pertanyaan seperti /__proxy/api/v1/namespaces akan diproksikan ke url borang
/api/v8/namespaces dengan Pengepala Kebenaran: Pembawa.

Pembangunan pemalam untuk Grafana: sejarah tangkapan besar

Pembangunan pemalam untuk Grafana: sejarah tangkapan besar

Sememangnya, untuk bekerja dengan pelayan api k8s kami memerlukan pengguna dengan akses baca sahaja, manifes untuk mencipta yang juga boleh anda temui dalam kod sumber pemalam.

Bahagian 5: pelepasan

Pembangunan pemalam untuk Grafana: sejarah tangkapan besar

Sebaik sahaja anda telah menulis pemalam Grafana anda sendiri, anda pasti mahu menjadikannya tersedia secara umum. Di Grafana ini ialah perpustakaan pemalam yang tersedia di sini grafana.com/grafana/plugins

Untuk membolehkan pemalam anda tersedia di kedai rasmi, anda perlu membuat PR masuk repositori inidengan menambahkan kandungan seperti ini pada fail repo.json:

Pembangunan pemalam untuk Grafana: sejarah tangkapan besar

di mana versi ialah versi pemalam anda, url ialah pautan ke repositori dan komit ialah cincang komit yang versi khusus pemalam akan tersedia.

Dan pada output anda akan melihat gambar yang indah seperti:

Pembangunan pemalam untuk Grafana: sejarah tangkapan besar

Data untuknya akan diambil secara automatik daripada fail Readme.md, Changelog.md dan plugin.json anda dengan penerangan pemalam.

Bahagian 6: bukannya kesimpulan

Kami tidak berhenti membangunkan pemalam kami selepas dikeluarkan. Dan kini kami sedang berusaha untuk memantau dengan betul penggunaan sumber nod kluster, memperkenalkan ciri baharu untuk menambah baik UX, dan juga memperoleh sejumlah besar maklum balas yang diterima selepas memasang pemalam oleh pelanggan kami dan daripada orang di GitHub (jika anda meninggalkan isu atau permintaan tarik anda, saya saya akan sangat gembira :)

Kami berharap artikel ini akan membantu anda memahami alat yang hebat seperti Grafana dan, mungkin, menulis pemalam anda sendiri.

Terima kasih!)

Sumber: www.habr.com

Tambah komen