Pangembangan plugin kanggo Grafana: riwayat nembak gedhe

Halo kabeh! Sawetara wulan kepungkur, kita ngluncurake proyek open-source anyar dadi produksi - plugin Grafana kanggo ngawasi kubernetes, sing diarani DevOpsProdigy KubeGraf. Kode sumber plugin kasedhiya ing repositori umum ing GitHub. Lan ing artikel iki, kita pengin nuduhake crita babagan carane nggawe plugin, alat apa sing digunakake lan masalah apa sing kita temoni sajrone proses pangembangan. Ayo budal!

Part 0 - pambuka: kepiye kita tekan titik iki?

Gagasan kanggo nulis plugin kita dhewe kanggo Grafan teka kanthi ora sengaja. Perusahaan kita wis ngawasi proyek web kanthi macem-macem tingkat kerumitan luwih saka 10 taun. Sajrone wektu iki, kita wis nglumpukake akeh keahlian, kasus sing menarik, lan pengalaman nggunakake macem-macem sistem pemantauan. Lan ing sawetara titik kita takon dhéwé: "Apa ana alat sihir kanggo ngawasi Kubernetes, supaya, lagi ngomong, "nyetel lan lali"?".. Standar industri kanggo ngawasi k8s, mesthi, wis suwe dadi Kombinasi Prometheus + Grafana. Lan minangka solusi sing wis siap kanggo tumpukan iki, ana macem-macem alat: prometheus-operator, set dashboard kubernetes-mixin, grafana-kubernetes-app.

Plugin grafana-kubernetes-app katon minangka pilihan sing paling menarik kanggo kita, nanging durung didhukung luwih saka setahun lan, luwih-luwih, ora bisa digunakake karo versi anyar saka node-eksporter lan kube-state-metrics. Lan ing sawetara titik, kita mutusake: "Apa kita kudu nggawe keputusan dhewe?"

Gagasan apa sing kita mutusake kanggo dileksanakake ing plugin kita:

  • visualisasi saka "peta aplikasi": presentation trep saka aplikasi ing kluster, diklompokaké dening namespaces, deployments ...;
  • visualisasi sambungan kaya "penyebaran - layanan (+port)".
  • visualisasi distribusi aplikasi kluster ing node kluster.
  • koleksi metrik lan informasi saka sawetara sumber: Prometheus lan k8s server api.
  • ngawasi loro bagean infrastruktur (nggunakake wektu CPU, memori, subsistem disk, jaringan) lan logika aplikasi - status kesehatan pods, nomer replika kasedhiya, informasi bab pass liveness / tes kesiapan.

Part 1: Apa "Grafana plugin"?

Saka sudut pandang teknis, plugin kanggo Grafana minangka pengontrol sudut, sing disimpen ing direktori data Grafana (/var/grafana/plugins/ /dist/module.js) lan bisa dimuat minangka modul SystemJS. Uga ing direktori iki kudu ana file plugin.json sing ngemot kabeh informasi meta babagan plugin sampeyan: jeneng, versi, jinis plugin, pranala menyang repositori / situs / lisensi, dependensi, lan liya-liyane.

Pangembangan plugin kanggo Grafana: riwayat nembak gedhe
modul.ts

Pangembangan plugin kanggo Grafana: riwayat nembak gedhe
plugin.json

Kaya sing sampeyan deleng ing gambar, kita nemtokake plugin.type = app. Amarga plugins kanggo Grafana bisa dadi telung jinis:

panel: jinis paling umum saka plugin - iku panel kanggo visualizing sembarang metrik, digunakake kanggo mbangun macem-macem dashboards.
sumber data: konektor plugin kanggo sawetara sumber data (contone, Prometheus-datasource, ClickHouse-datasource, ElasticSearch-datasource).
app: Plugin sing ngidini sampeyan nggawe aplikasi frontend dhewe ing Grafana, nggawe kaca html dhewe lan ngakses sumber data kanthi manual kanggo nggambarake macem-macem data. Uga, plugin saka jinis liyane (sumber data, panel) lan macem-macem dashboard bisa digunakake minangka dependensi.

Pangembangan plugin kanggo Grafana: riwayat nembak gedhe
Conto dependensi plugin karo type=app.

Sampeyan bisa nggunakake JavaScript lan TypeScript minangka basa pamrograman (kita milih). Preparasi kanggo plugin hello-world saka jinis apa wae sing bisa golek link: gudang iki ngemot nomer akeh wiwitan-ngemas (malah ana conto eksperimen saka plugin ing React) karo wis diinstal lan dikonfigurasi tukang.

Part 2: nyiapake lingkungan lokal

Kanggo nggarap plugin kasebut, kita butuh klompok kubernetes kanthi kabeh alat sing wis diinstal: prometheus, node-exporter, kube-state-metrics, grafana. Lingkungan kudu disiyapake kanthi cepet, gampang lan alami, lan kanggo mesthekake hot-reload, direktori data Grafana kudu dipasang langsung saka mesin pangembang.

Cara sing paling trep, miturut pendapat kita, kanggo nggarap kubernetes sacara lokal yaiku minikube. Langkah sabanjure kanggo nginstal kombinasi Prometheus + Grafana nggunakake prometheus-operator. ING wacana iki Proses nginstal prometheus-operator ing minikube diterangake kanthi rinci. Kanggo ngaktifake kegigihan, sampeyan kudu nyetel parameter teguh: bener ing grafik / grafana / values.yaml file, nambah PV lan PVC dhewe lan nemtokake ing persistence.existingClaim parameter

Skrip peluncuran minikube pungkasan katon kaya iki:

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

Bagean 3: pangembangan nyata

Model Obyek

Kanggo nyiapake kanggo ngleksanakake plugin, kita mutusake kanggo njlèntrèhaké kabeh entitas Kubernetes dhasar sing bakal digarap ing wangun kelas TypeScript: pod, penyebaran, daemonset, statefulset, proyek, cronjob, layanan, simpul, namespace. Saben kelas iki warisan saka kelas BaseModel umum, sing njlèntrèhaké konstruktor, destruktor, cara kanggo nganyari lan ngoper visibilitas. Saben kelas njlèntrèhaké hubungan nested karo entitas liyane, contone, dhaptar pods kanggo entitas panyebaran jinis.

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 = [];
   }
}

Kanthi bantuan getter lan setter, kita bisa nampilake utawa nyetel metrik entitas sing dibutuhake ing wangun sing trep lan bisa diwaca. Contone, format output node cpu sing bisa dialokasikan:

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

Artikel-artikel wonten

Dhaptar kabeh kaca plugin kita pisanan diterangake ing pluing.json kita ing bagean dependensi:

Pangembangan plugin kanggo Grafana: riwayat nembak gedhe

Ing blok kanggo saben kaca kita kudu nunjukake NAME PAGE (banjur bakal diowahi dadi slug sing kaca iki bisa diakses); jeneng komponen sing tanggung jawab kanggo operasi kaca iki (dhaptar komponen diekspor menyang module.ts); nuduhake peran pangguna sing bisa digunakake karo kaca iki lan setelan navigasi kanggo sidebar.

Ing komponen sing tanggung jawab kanggo operasi kaca, kita kudu nyetel templateUrl, ngliwati path menyang file html kanthi markup. Ing controller, liwat injeksi dependensi, kita bisa ngakses nganti 2 layanan sudut penting:

  • backendSrv - layanan sing nyedhiyakake interaksi karo server API Grafana;
  • datasourceSrv - layanan sing nyedhiyakake interaksi lokal karo kabeh sumber data sing diinstal ing Grafana sampeyan (contone, metode .getAll () - ngasilake dhaptar kabeh sumber data sing diinstal; .get (). ) - ngasilake obyek conto saka sumber data tartamtu.

Pangembangan plugin kanggo Grafana: riwayat nembak gedhe

Pangembangan plugin kanggo Grafana: riwayat nembak gedhe

Pangembangan plugin kanggo Grafana: riwayat nembak gedhe

Bagean 4: sumber data

Saka sudut pandang Grafana, sumber data pancen padha karo plugin liyane: duwe modul titik entri dhewe.js, ana file kanthi plugin informasi meta.json. Nalika ngembangake plugin kanthi jinis = app, kita bisa sesambungan karo sumber data sing ana (contone, prometheus-datasource) lan kita dhewe, sing bisa disimpen langsung ing direktori plugin (dist/datasource/*) utawa nginstal minangka dependensi. Ing kasus kita, sumber data dilengkapi kode plugin. Sampeyan uga kudu duwe cithakan config.html lan pengontrol ConfigCtrl, sing bakal digunakake kanggo kaca konfigurasi conto sumber data lan pengontrol Sumber Data, sing ngetrapake logika sumber data sampeyan.

Ing plugin KubeGraf, saka sudut pandang antarmuka pangguna, sumber data minangka conto saka kluster kubernetes sing ngetrapake kapabilitas ing ngisor iki (kode sumber kasedhiya link):

  • ngumpulake data saka k8s api-server (njaluk dhaptar spasi jeneng, panyebaran ...)
  • panjalukan proxying menyang prometheus-datasource (sing dipilih ing setelan plugin kanggo saben kluster tartamtu) lan format respon kanggo nggunakake data ing kaca statis lan ing dashboard.
  • nganyari data ing kaca plugin statis (kanthi tingkat refresh sing disetel).
  • ngolah pitakon kanggo ngasilake lembar template ing grafana-dasbor (metriFindQuery() metode)

Pangembangan plugin kanggo Grafana: riwayat nembak gedhe

Pangembangan plugin kanggo Grafana: riwayat nembak gedhe

Pangembangan plugin kanggo Grafana: riwayat nembak gedhe

  • test sambungan karo kluster k8s pungkasan.
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"};
       })
}

Titik menarik sing kapisah, miturut pendapat kita, yaiku implementasi mekanisme otentikasi lan wewenang kanggo sumber data. Biasane, metu saka kothak, kita bisa nggunakake datasourceHttpSettings komponen Grafana sing dibangun kanggo ngatur akses menyang sumber data pungkasan. Nggunakake komponen iki, kita bisa ngatur akses menyang sumber data http kanthi nemtokake url lan otentikasi dhasar / setelan wewenang: login-sandi, utawa klien-cert/client-key. Kanggo ngleksanakake kemampuan kanggo ngatur akses nggunakake token bearer (standar de facto kanggo k8s), kita kudu nindakake tweaking sethitik.

Kanggo ngatasi masalah iki, sampeyan bisa nggunakake mekanisme Grafana "Plugin Routes" sing dibangun (rincian liyane ing kaca dokumentasi resmi). Ing setelan sumber data kita, kita bisa ngumumake set aturan rute sing bakal diproses dening server proxy grafana. Contone, kanggo saben endpoint individu bisa nyetel header utawa url karo kamungkinan saka template, data sing bisa dijupuk saka lapangan jsonData lan secureJsonData (kanggo nyimpen sandhi utawa token ing wangun ndhelik). Ing conto kita, pitakon kaya /__proxy/api/v1/namespaces bakal diproksi menyang url formulir kasebut
/api/v8/namespaces kanthi Wewenang: Header Bearer.

Pangembangan plugin kanggo Grafana: riwayat nembak gedhe

Pangembangan plugin kanggo Grafana: riwayat nembak gedhe

Alamiah, kanggo nggarap server api k8s, kita butuh pangguna sing duwe akses mung diwaca, sing diwujudake kanggo nggawe sing uga bisa ditemokake ing kode sumber plugin.

Part 5: release

Pangembangan plugin kanggo Grafana: riwayat nembak gedhe

Sawise sampeyan nulis plugin Grafana sampeyan dhewe, mesthine sampeyan pengin nggawe kasedhiya kanggo umum. Ing Grafana iki minangka perpustakaan plugin sing kasedhiya ing kene grafana.com/grafana/plugins

Supaya plugin sampeyan kasedhiya ing toko resmi, sampeyan kudu nggawe PR ing gudang ikikanthi nambahake konten kaya iki menyang file repo.json:

Pangembangan plugin kanggo Grafana: riwayat nembak gedhe

ing ngendi versi minangka versi plugin sampeyan, url minangka link menyang repositori, lan commit minangka hash saka commit sing bakal kasedhiya versi tartamtu saka plugin kasebut.

Lan ing output sampeyan bakal weruh gambar apik kaya:

Pangembangan plugin kanggo Grafana: riwayat nembak gedhe

Data kasebut bakal dijupuk kanthi otomatis saka Readme.md, Changelog.md lan file plugin.json kanthi deskripsi plugin.

Part 6: tinimbang kesimpulan

Kita ora mandheg ngembangake plugin sawise diluncurake. Lan saiki kita nggarap kanthi bener ngawasi panggunaan sumber daya simpul kluster, ngenalake fitur-fitur anyar kanggo nambah UX, lan uga entuk akeh umpan balik sing ditampa sawise nginstal plugin kasebut dening klien lan saka wong ing GitHub (yen sampeyan ninggalake. masalah utawa panjaluk sampeyan, aku bakal seneng banget :)

Muga-muga artikel iki bakal mbantu sampeyan ngerti alat sing apik banget kaya Grafana lan, bisa uga, nulis plugin sampeyan dhewe.

Matur nuwun!)

Source: www.habr.com

Add a comment