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

Lisa kommentaar