Razvoj dodatka za Grafanu: povijest velikih hitova

Bok svima! Prije nekoliko mjeseci u produkciju smo pustili naš novi open-source projekt - Grafana dodatak za praćenje kubernetesa, koji smo nazvali DevOpsProdigy KubeGraf. Izvorni kod dodatka dostupan je na javni repozitorij na GitHubu. U ovom članku želimo s vama podijeliti priču o tome kako smo stvorili dodatak, koje smo alate koristili i na koje smo zamke naišli tijekom procesa razvoja. Idemo!

Dio 0 - uvod: kako smo došli do ove točke?

Na ideju da napišemo vlastiti plugin za Grafan došli smo sasvim slučajno. Naša tvrtka prati web projekte različitih razina složenosti više od 10 godina. Tijekom ovog vremena skupili smo veliku količinu stručnog znanja, zanimljivih slučajeva i iskustva u korištenju različitih sustava nadzora. I u nekom smo se trenutku zapitali: “Postoji li čarobni alat za nadgledanje Kubernetesa, tako da, kako kažu, “postavi i zaboravi”?”.. Industrijski standard za nadgledanje k8s, naravno, dugo je bio Kombinacija Prometej + Grafana. A kao gotova rješenja za ovaj skup postoji veliki skup raznih vrsta alata: prometheus-operator, skup kubernetes-mixin nadzornih ploča, grafana-kubernetes-app.

Dodatak grafana-kubernetes-app činio nam se najzanimljivijom opcijom, ali nije podržan više od godinu dana i, štoviše, ne može raditi s novim verzijama node-exporter i kube-state-metrics. I u jednom smo trenutku odlučili: "Zar ne bismo trebali sami donijeti odluku?"

Koje smo ideje odlučili implementirati u naš dodatak:

  • vizualizacija “karte aplikacija”: prikladna prezentacija aplikacija u klasteru, grupiranih po imenskim prostorima, implementacijama...;
  • vizualizacija veza poput “uvođenje - usluga (+portovi)”.
  • vizualizacija distribucije aplikacija klastera po čvorovima klastera.
  • prikupljanje metrika i informacija iz nekoliko izvora: Prometheus i k8s api server.
  • praćenje i infrastrukturnog dijela (upotreba CPU vremena, memorije, diskovnog podsustava, mreže) i logike aplikacije - podovi zdravstvenog statusa, broj dostupnih replika, informacije o prolazu testova živosti/spremnosti.

1. dio: Što je "Grafana dodatak"?

S tehničkog gledišta, dodatak za Grafanu je kutni kontroler, koji je pohranjen u direktoriju podataka Grafane (/var/grafana/plugins/ /dist/module.js) i može se učitati kao SystemJS modul. Također u ovom direktoriju trebala bi postojati datoteka plugin.json koja sadrži sve meta informacije o vašem dodatku: ime, verziju, tip dodatka, veze na spremište/stranicu/licencu, ovisnosti itd.

Razvoj dodatka za Grafanu: povijest velikih hitova
modul.ts

Razvoj dodatka za Grafanu: povijest velikih hitova
dodatak.json

Kao što možete vidjeti na snimci zaslona, ​​naveli smo plugin.type = app. Budući da dodaci za Grafanu mogu biti tri vrste:

ploča: najčešća vrsta dodatka - to je ploča za vizualizaciju bilo koje metrike, koja se koristi za izradu raznih nadzornih ploča.
izvor podataka: priključak priključka na neki izvor podataka (na primjer, Prometheus-datasource, ClickHouse-datasource, ElasticSearch-datasource).
aplikacija: dodatak koji vam omogućuje izradu vlastite front-end aplikacije unutar Grafane, stvaranje vlastitih html stranica i ručni pristup izvoru podataka za vizualizaciju različitih podataka. Također, dodaci drugih tipova (izvor podataka, panel) i razne nadzorne ploče mogu se koristiti kao ovisnosti.

Razvoj dodatka za Grafanu: povijest velikih hitova
Primjer ovisnosti dodatka s type=app.

Možete koristiti i JavaScript i TypeScript kao programski jezik (mi smo ga odabrali). Pripreme za hello-world dodatke bilo koje vrste koju možete pronađite putem linka: ovo spremište sadrži velik broj početnih paketa (postoji čak i eksperimentalni primjer dodatka u Reactu) s unaprijed instaliranim i konfiguriranim builderima.

2. dio: priprema lokalnog okoliša

Za rad na dodatku, naravno, trebamo kubernetes klaster sa svim unaprijed instaliranim alatima: prometheus, node-exporter, kube-state-metrics, grafana. Okruženje treba postaviti brzo, jednostavno i prirodno, a kako bi se osiguralo ponovno učitavanje, Grafana direktorij podataka trebao bi se montirati izravno sa stroja programera.

Najprikladniji način, po našem mišljenju, za lokalni rad s kubernetesom je minikube. Sljedeći korak je instalacija kombinacije Prometheus + Grafana pomoću prometheus-operatora. U ovaj članak Detaljno je opisan postupak instaliranja prometheus-operatora na minikube. Da biste omogućili postojanost, morate postaviti parametar postojanost: istina u datoteci charts/grafana/values.yaml dodajte vlastiti PV i PVC i navedite ih u parametru persistence.existingClaim

Naša konačna skripta za pokretanje minikubea izgleda ovako:

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

Dio 3: stvarni razvoj

Model objekta

U pripremi za implementaciju dodatka, odlučili smo opisati sve osnovne Kubernetes entitete s kojima ćemo raditi u obliku TypeScript klasa: pod, deployment, daemonset, statefulset, job, cronjob, service, node, namespace. Svaka od ovih klasa nasljeđuje zajedničku klasu BaseModel, koja opisuje konstruktor, destruktor, metode za ažuriranje i prebacivanje vidljivosti. Svaka od klasa opisuje ugniježđene odnose s drugim entitetima, na primjer, popis podova za entitet tipa implementacije.

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

Uz pomoć gettera i postavljača, možemo prikazati ili postaviti metriku entiteta koja nam je potrebna u prikladnom i čitljivom obliku. Na primjer, formatirani izlaz CPU čvorova koji se mogu dodijeliti:

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

Stranice

Popis svih naših stranica dodataka inicijalno je opisan u našoj pluing.json u odjeljku ovisnosti:

Razvoj dodatka za Grafanu: povijest velikih hitova

U bloku za svaku stranicu moramo naznačiti NAZIV STRANICE (tada će se pretvoriti u slug pomoću kojeg će ova stranica biti dostupna); naziv komponente odgovorne za rad ove stranice (popis komponenti eksportira se u module.ts); koji označava korisničku ulogu za koju je dostupan rad s ovom stranicom i postavke navigacije za bočnu traku.

U komponenti koja je odgovorna za rad stranice, moramo postaviti templateUrl, prosljeđujući tamo put do html datoteke s oznakama. Unutar kontrolera, putem ubrizgavanja ovisnosti, možemo pristupiti do 2 važne kutne usluge:

  • backendSrv - usluga koja omogućuje interakciju s Grafana API poslužiteljem;
  • datasourceSrv - usluga koja pruža lokalnu interakciju sa svim izvorima podataka instaliranim u vašoj Grafani (na primjer, metoda .getAll() - vraća popis svih instaliranih izvora podataka; .get( ) - vraća objekt instance određenog izvora podataka.

Razvoj dodatka za Grafanu: povijest velikih hitova

Razvoj dodatka za Grafanu: povijest velikih hitova

Razvoj dodatka za Grafanu: povijest velikih hitova

Dio 4: izvor podataka

S Grafanine točke gledišta, datasource je potpuno isti dodatak kao i svi ostali: ima vlastitu ulaznu točku module.js, postoji datoteka s meta informacijama plugin.json. Kada razvijamo dodatak s tipom = app, možemo komunicirati s postojećim izvorima podataka (na primjer, prometheus-datasource) i vlastitim, koje možemo pohraniti izravno u direktorij dodatka (dist/datasource/*) ili instalirati kao ovisnost. U našem slučaju, izvor podataka dolazi s kodom dodatka. Također je potrebno imati config.html predložak i ConfigCtrl kontroler, koji će se koristiti za stranicu konfiguracije instance izvora podataka i Datasource kontroler, koji implementira radnu logiku vašeg izvora podataka.

U dodatku KubeGraf, sa stajališta korisničkog sučelja, izvor podataka je instanca kubernetes klastera koji implementira sljedeće mogućnosti (izvorni kod je dostupan по ссылке):

  • prikupljanje podataka s k8s api-poslužitelja (dobivanje popisa imenskih prostora, implementacija...)
  • proxy zahtjeve prometheus-datasource (koji je odabran u postavkama dodatka za svaki određeni klaster) i oblikovanje odgovora za korištenje podataka i na statičnim stranicama i na nadzornim pločama.
  • ažuriranje podataka na stranicama statičkih dodataka (s postavljenom stopom osvježavanja).
  • obrada upita za generiranje lista predložaka u grafana-nadzornim pločama (metoda metriFindQuery())

Razvoj dodatka za Grafanu: povijest velikih hitova

Razvoj dodatka za Grafanu: povijest velikih hitova

Razvoj dodatka za Grafanu: povijest velikih hitova

  • test veze s konačnim k8s klasterom.
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"};
       })
}

Zasebna zanimljiva točka, po našem mišljenju, je implementacija mehanizma provjere autentičnosti i autorizacije za izvor podataka. Tipično, izvan okvira, možemo koristiti ugrađenu komponentu Grafana datasourceHttpSettings za konfiguriranje pristupa konačnom izvoru podataka. Koristeći ovu komponentu, možemo konfigurirati pristup http izvoru podataka određivanjem url-a i osnovnih postavki provjere autentičnosti/autorizacije: login-password ili client-cert/client-key. Kako bismo implementirali mogućnost konfiguriranja pristupa korištenjem tokena nositelja (de facto standard za k8s), morali smo napraviti malo ugađanje.

Kako biste riješili ovaj problem, možete koristiti ugrađeni mehanizam Grafana “Plugin Routes” (više detalja na stranica službene dokumentacije). U postavkama našeg izvora podataka možemo deklarirati skup pravila usmjeravanja koja će obraditi grafana proxy poslužitelj. Primjerice, za svaku pojedinačnu krajnju točku moguće je postaviti zaglavlja ili url-ove s mogućnošću šablona za koje se podaci mogu preuzeti iz polja jsonData i secureJsonData (za pohranjivanje lozinki ili tokena u šifriranom obliku). U našem primjeru, upiti poput /__proxy/api/v1/namespaces bit će proslijeđen na url obrasca
/api/v8/namespaces sa zaglavljem Authorization: Bearer.

Razvoj dodatka za Grafanu: povijest velikih hitova

Razvoj dodatka za Grafanu: povijest velikih hitova

Naravno, za rad s k8s api poslužiteljem trebamo korisnika s pristupom samo za čitanje, manifeste za izradu kojih također možete pronaći u izvorni kod dodatka.

Dio 5: oslobađanje

Razvoj dodatka za Grafanu: povijest velikih hitova

Nakon što napišete vlastiti Grafana dodatak, prirodno ćete ga htjeti učiniti javno dostupnim. U Grafani je ovo biblioteka dodataka dostupna ovdje grafana.com/grafana/plugins

Kako bi vaš dodatak bio dostupan na službenoj trgovini, morate napraviti PR in ovo spremištedodavanjem ovakvog sadržaja u datoteku repo.json:

Razvoj dodatka za Grafanu: povijest velikih hitova

gdje je verzija verzija vašeg dodatka, url je poveznica na repozitorij, a commit je raspršivanje izvršenja za koje će određena verzija dodatka biti dostupna.

A na izlazu ćete vidjeti prekrasnu sliku poput:

Razvoj dodatka za Grafanu: povijest velikih hitova

Podaci za njega bit će automatski preuzeti iz vašeg Readme.md, Changelog.md i datoteke plugin.json s opisom dodatka.

6. dio: umjesto zaključaka

Nismo prestali razvijati naš dodatak nakon izdavanja. A sada radimo na ispravnom praćenju upotrebe resursa čvorova klastera, uvođenju novih značajki za poboljšanje korisničkog doživljaja, a također prikupljamo veliku količinu povratnih informacija primljenih nakon instaliranja dodatka i od naših klijenata i od ljudi na GitHubu (ako napustite vaš problem ili zahtjev za povlačenjem, bit ću vrlo sretan :)

Nadamo se da će vam ovaj članak pomoći da shvatite tako divan alat kao što je Grafana i, možda, napišete svoj vlastiti dodatak.

Спасибо!)

Izvor: www.habr.com

Dodajte komentar