Grafana pistikprogrammi arendamine: suurte saavutuste ajalugu

Tere kĂ”igile! Paar kuud tagasi kĂ€ivitasime tootmisse oma uue avatud lĂ€htekoodiga projekti – kubernetese jĂ€lgimiseks mĂ”eldud Grafana plugina, mille nimetasime DevOpsProdigy KubeGraf. Pistikprogrammi lĂ€htekood on saadaval aadressil avalik hoidla GitHubis. Ja selles artiklis tahame teiega jagada lugu sellest, kuidas me plugina lĂ”ime, milliseid tööriistu kasutasime ja milliseid lĂ”kse arendusprotsessi kĂ€igus kohtasime. LĂ€hme!

0. osa – sissejuhatus: kuidas me selle punktini jĂ”udsime?

Idee kirjutada Grafani jaoks oma pistikprogramm tuli meile tĂ€iesti juhuslikult. Meie ettevĂ”te on jĂ€lginud erineva keerukusastmega veebiprojekte ĂŒle 10 aasta. Selle ajaga on kogunenud suur hulk eriteadmisi, huvitavaid juhtumeid ja kogemusi erinevate seiresĂŒsteemide kasutamisel. Ja mingil hetkel kĂŒsisime endalt: “Kas Kubernetese jĂ€lgimiseks on olemas maagiline tööriist, et, nagu öeldakse, “seadista ja unusta”?”.. Tööstusstandard k8-de jĂ€lgimisel on muidugi juba ammu olnud Prometheus + Grafana kombinatsioon. Ja selle virna valmislahendustena on olemas suur hulk erinevaid tööriistu: prometheus-operaator, kubernetes-mixini armatuurlaudade komplekt, grafana-kubernetes-app.

Grafana-kubernetes-rakenduse pistikprogramm tundus meie jaoks kÔige huvitavam variant, kuid seda pole enam kui aasta toetatud ja pealegi ei saa see töötada koos uute versioonidega node-exporter ja kube-state-metrics. Ja mingil hetkel otsustasime: "Kas me ei peaks ise otsustama?"

Milliseid ideid otsustasime oma pistikprogrammis rakendada:

  • "rakenduste kaardi" visualiseerimine: rakenduste mugav esitlemine klastris, rĂŒhmitatud nimeruumide, juurutuste jĂ€rgi...;
  • ĂŒhenduste visualiseerimine nagu "juurutamine - teenus (+pordid)".
  • klastrirakenduste jaotuse visualiseerimine klastri sĂ”lmede vahel.
  • mÔÔdikute ja teabe kogumine mitmest allikast: Prometheus ja k8s api server.
  • nii infrastruktuuri osa (protsessori aja, mĂ€lu, ketta alamsĂŒsteemi, vĂ”rgu kasutus) kui ka rakendusloogika jĂ€lgimine - terviseseisundi podid, saadaolevate koopiate arv, info elavuse/valmisoleku testide lĂ€bimise kohta.

1. osa: Mis on Grafana pistikprogramm?

Tehnilisest vaatenurgast on Grafana pistikprogramm nurkkontroller, mis on salvestatud Grafana andmekataloogi (/var/grafana/plugins/ /dist/module.js) ja seda saab laadida SystemJS-moodulina. Selles kataloogis peaks olema ka fail plugin.json, mis sisaldab kogu teie pistikprogrammi metateavet: nimi, versioon, pistikprogrammi tĂŒĂŒp, lingid hoidlale/saidile/litsentsile, sĂ”ltuvused ja nii edasi.

Grafana pistikprogrammi arendamine: suurte saavutuste ajalugu
moodul.ts

Grafana pistikprogrammi arendamine: suurte saavutuste ajalugu
plugin.json

Nagu nĂ€ete ekraanipildil, mÀÀrasime plugin.type = app. Kuna Grafana pistikprogramme vĂ”ib olla kolme tĂŒĂŒpi:

paneel: kĂ”ige levinum pistikprogrammi tĂŒĂŒp – see on paneel mis tahes mÔÔdikute visualiseerimiseks, mida kasutatakse erinevate armatuurlaudade koostamiseks.
andmeallikas: plugina pistikĂŒhendus mĂ”ne andmeallikaga (nĂ€iteks Prometheus-andmeallikas, ClickHouse-andmeallikas, ElasticSearch-andmeallikas).
app: pistikprogramm, mis vĂ”imaldab teil Grafana sees luua oma kasutajaliidese rakenduse, luua oma html-lehti ja erinevate andmete visualiseerimiseks andmeallikale kĂ€sitsi juurde pÀÀseda. Samuti saab sĂ”ltuvustena kasutada teist tĂŒĂŒpi pluginaid (andmeallikas, paneel) ja erinevaid armatuurlaudu.

Grafana pistikprogrammi arendamine: suurte saavutuste ajalugu
NĂ€idissĂ”ltuvuste pistikprogrammide tĂŒĂŒp=app.

Programmeerimiskeelena saab kasutada nii JavaScripti kui TypeScripti (valisime selle). Ettevalmistused mis tahes tĂŒĂŒpi hello-worldi pistikprogrammide jaoks leia lingi jĂ€rgi: see hoidla sisaldab suurel hulgal eelinstallitud ja konfigureeritud koostajatega stardipakette (Reactis on isegi eksperimentaalne nĂ€ide pluginast).

2. osa: kohaliku keskkonna ettevalmistamine

Pistikprogrammi kallal töötamiseks vajame loomulikult kubernetese klastrit koos kÔigi eelinstallitud tööriistadega: prometheus, node-exporter, kube-state-metrics, grafana. Keskkond tuleks seadistada kiiresti, lihtsalt ja loomulikult ning kuuma taaslaadimise tagamiseks tuleks Grafana andmekataloog paigaldada otse arendaja masinast.

Meie arvates on kĂ”ige mugavam viis kubernetesega kohapeal töötada minikube. JĂ€rgmine samm on Prometheus + Grafana kombinatsiooni installimine, kasutades prometheus-operaatorit. IN see artikkel Prometheus-operaatori minikube'i installimise protsessi kirjeldatakse ĂŒksikasjalikult. PĂŒsivuse lubamiseks peate mÀÀrama parameetri pĂŒsivus: tĂ”si lisage failis charts/grafana/values.yaml oma PV ja PVC ning mÀÀrake need parameetris persistence.existingClaim

Meie viimane minikube kÀivitamisskript nÀeb vÀlja selline:

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

3. osa: tegelik areng

Objektimudel

Pistikprogrammi juurutamise ettevalmistamisel otsustasime kirjeldada kĂ”iki Kubernetese pĂ”hioleme, millega töötame TypeScripti klasside kujul: pod, juurutamine, deemonset, olekuteabe komplekt, töö, cronjob, teenus, sĂ”lm, nimeruum. KĂ”ik need klassid pĂ€rivad ĂŒhisest BaseModel klassist, mis kirjeldab konstruktorit, hĂ€vitajat ja nĂ€htavuse vĂ€rskendamise ja vahetamise meetodeid. Iga klass kirjeldab pesastatud seoseid teiste olemitega, nĂ€iteks juurutamise tĂŒĂŒpi olemi poodide loendit.

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

Getterite ja setterite abil saame kuvada vÔi seadistada meile vajalikke olemimÔÔdikuid mugaval ja loetaval kujul. NÀiteks eraldatavate protsessorisÔlmede vormindatud vÀljund:

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

LehekĂŒlgede

KÔigi meie pistikprogrammide lehtede loendit kirjeldatakse algselt faili pluing.json jaotises sÔltuvused:

Grafana pistikprogrammi arendamine: suurte saavutuste ajalugu

Iga lehe plokis peame mĂ€rkima LEHEKÜLJE NIMI (see teisendatakse seejĂ€rel leheks, mille kaudu see leht on juurdepÀÀsetav); selle lehe töötamise eest vastutava komponendi nimi (komponentide loend eksporditakse module.ts-i); mis nĂ€itab kasutaja rolli, mille jaoks selle lehe töö on saadaval, ja kĂŒlgriba navigeerimisseadeid.

Lehe töötamise eest vastutavas komponendis peame mÀÀrama templateUrl, edastades sinna tee html-faili koos mĂ€rgistusega. Kontrolleri sees pÀÀseme sĂ”ltuvuse sĂŒstimise kaudu juurde kuni kahele olulisele nurgateenusele:

  • backendSrv - teenus, mis pakub suhtlust Grafana API serveriga;
  • datasourceSrv – teenus, mis pakub kohalikku suhtlust kĂ”igi teie Grafanasse installitud andmeallikatega (nĂ€iteks meetod .getAll() – tagastab kĂ”igi installitud andmeallikate loendi; .get( ) – tagastab konkreetse andmeallika eksemplariobjekti.

Grafana pistikprogrammi arendamine: suurte saavutuste ajalugu

Grafana pistikprogrammi arendamine: suurte saavutuste ajalugu

Grafana pistikprogrammi arendamine: suurte saavutuste ajalugu

4. osa: andmeallikas

Grafana vaatenurgast on andmeallikas tÀpselt sama plugin nagu kÔik teised: sellel on oma sisenemispunkt module.js, seal on fail metainfoga plugin.json. Plugina arendamisel type = app saame suhelda nii olemasolevate andmeallikatega (nÀiteks prometheus-datasource) kui ka enda omadega, mida saame salvestada otse pluginate kataloogi (dist/datasource/*) vÔi installida sÔltuvusena. Meie puhul on andmeallikas kaasas pistikprogrammi kood. Samuti on vajalik mall config.html ja ConfigCtrl-kontroller, mida kasutatakse andmeallika eksemplari konfiguratsioonilehe jaoks ning andmeallika kontroller, mis rakendab teie andmeallika loogikat.

KubeGrafi pistikprogrammis on kasutajaliidese vaatenurgast andmeallikaks kubernetese klastri eksemplar, mis rakendab jĂ€rgmisi vĂ”imalusi (lĂ€htekood on saadaval ĐżĐŸ ссылĐșĐ”):

  • andmete kogumine k8s api-serverist (nimeruumide loendi hankimine, juurutused jne)
  • prometheus-datasource pĂ€ringute puhverserver (mis valitakse iga konkreetse klastri pistikprogrammi seadetes) ja vastuste vormindamine, et kasutada andmeid nii staatilistel lehtedel kui ka armatuurlaudadel.
  • staatiliste pistikprogrammide lehtede andmete vĂ€rskendamine (mÀÀratud vĂ€rskendussagedusega).
  • pĂ€ringute töötlemine mallilehe genereerimiseks grafana-armatuurlaudades (meetod metriFindQuery())

Grafana pistikprogrammi arendamine: suurte saavutuste ajalugu

Grafana pistikprogrammi arendamine: suurte saavutuste ajalugu

Grafana pistikprogrammi arendamine: suurte saavutuste ajalugu

  • ĂŒhenduse test lĂ”pliku k8s-klastriga.
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"};
       })
}

Eraldi huvitav punkt on meie arvates andmeallika autentimis- ja autoriseerimismehhanismi rakendamine. Tavaliselt saame lÔplikule andmeallikale juurdepÀÀsu konfigureerimiseks kasutada sisseehitatud Grafana komponenti datasourceHttpSettings. Seda komponenti kasutades saame konfigureerida juurdepÀÀsu http-andmeallikale, mÀÀrates URL-i ja pÔhilised autentimise/volitamise sÀtted: login-password vÔi client-cert/client-key. Selleks, et rakendada vÔimalust juurdepÀÀsu konfigureerimiseks kandemÀrgiga (de facto standard k8-de jaoks), pidime seda veidi kohandama.

Selle probleemi lahendamiseks vĂ”ite kasutada sisseehitatud Grafana "Plugin Routes" mehhanismi (lisateavet leiate aadressilt ametlik dokumentatsiooni leht). Meie andmeallika seadetes saame deklareerida marsruutimisreeglite komplekti, mida grafana puhverserver töötleb. NĂ€iteks igale ĂŒksikule lĂ”pp-punktile on vĂ”imalik mÀÀrata mallindamise vĂ”imalusega pĂ€ised vĂ”i URL-id, mille kohta saab andmeid vĂ”tta vĂ€ljadelt jsonData ja secureJsonData (paroolide vĂ”i mĂ€rkide salvestamiseks krĂŒpteeritud kujul). Meie nĂ€ites pĂ€ringuid nagu /__proxy/api/v1/namespaces puhverserver vormi URL-ile
/api/v8/namespaces pÀisega Authorization: kandja.

Grafana pistikprogrammi arendamine: suurte saavutuste ajalugu

Grafana pistikprogrammi arendamine: suurte saavutuste ajalugu

Loomulikult vajame k8s api serveriga töötamiseks kirjutuskaitstud juurdepÀÀsuga kasutajat, mille loomise manifestid leiate ka plugina lÀhtekood.

5. osa: vabastamine

Grafana pistikprogrammi arendamine: suurte saavutuste ajalugu

Kui olete oma Grafana pistikprogrammi kirjutanud, soovite selle loomulikult avalikult kÀttesaadavaks teha. Grafanas on see siin saadaval olevate pluginate teek grafana.com/grafana/plugins

Selleks, et teie pistikprogramm oleks ametlikus poes saadaval, peate tegema PR-i see hoidlalisades faili repo.json sellise sisu:

Grafana pistikprogrammi arendamine: suurte saavutuste ajalugu

kus versioon on teie pistikprogrammi versioon, siis url on link hoidlale ja commit on sissekande rÀsi, mille jaoks on saadaval plugina konkreetne versioon.

Ja vÀljundis nÀete imelist pilti nagu:

Grafana pistikprogrammi arendamine: suurte saavutuste ajalugu

Selle andmed haaratakse automaatselt teie Readme.md-st, Changelog.md-st ja failist plugin.json koos pistikprogrammi kirjeldusega.

6. osa: jÀrelduste asemel

Me ei lĂ”petanud oma pistikprogrammi arendamist pĂ€rast vĂ€ljalaskmist. Ja nĂŒĂŒd tegeleme klastri sĂ”lmede ressursside kasutamise korrektse jĂ€lgimisega, uute funktsioonide juurutamisega UX-i tĂ€iustamiseks ja ka suure hulga tagasiside kogumiseks, mis on pĂ€rast pistikprogrammi installimist saadud nii meie klientidelt kui ka GitHubi inimestelt (kui lahkute Teie probleem vĂ”i tĂ”mbetaotlus, olen vĂ€ga rahul :)

Loodame, et see artikkel aitab teil mÔista sellist imelist tööriista nagu Grafana ja vÔib-olla kirjutada oma pistikprogrammi.

AitÀh!)

Allikas: www.habr.com

Ostke DDoS-kaitsega saitide jaoks usaldusvÀÀrne hostimine, VPS VDS-serverid đŸ”„ Osta usaldusvÀÀrne veebimajutus DDoS-kaitsega, VPS VDS serverid | ProHoster