Kupanga pulogalamu yowonjezera ya Grafana: mbiri yakuwombera kwakukulu

Moni nonse! Miyezi ingapo yapitayo, tidayambitsa pulojekiti yathu yatsopano yotsegulira - pulogalamu yowonjezera ya Grafana yowunikira kubernetes, yomwe tidayitcha. DevOpsProdigy KubeGraf. Khodi yoyambira pulogalamu yowonjezera ikupezeka pa posungira anthu pa GitHub. Ndipo m'nkhaniyi tikufuna kugawana nanu nkhani ya momwe tidapangira plugin, zida zomwe tidagwiritsa ntchito komanso misampha yomwe tidakumana nayo panthawi yachitukuko. Tiyeni tizipita!

Gawo 0 - mawu oyamba: tinafika bwanji pamenepa?

Lingaliro lolemba pulogalamu yowonjezera yathu ya Grafan linabwera kwa ife mwangozi. Kampani yathu yakhala ikuyang'anira ntchito zapaintaneti zamitundu yosiyanasiyana zovuta kwazaka zopitilira 10. Panthawiyi, tapeza ukadaulo wambiri, milandu yosangalatsa, komanso luso logwiritsa ntchito njira zosiyanasiyana zowunikira. Ndipo panthawi ina tinadzifunsa kuti: "Kodi pali chida chamatsenga chowunikira Kubernetes, kotero kuti, monga akunena, "chikhazikitseni ndikuyiwala"?" Kuphatikiza kwa Prometheus + Grafana. Ndipo monga mayankho okonzeka a stack iyi, pali zida zambiri zamitundu yosiyanasiyana: prometheus-operator, seti ya kubernetes-mixin dashboards, grafana-kubernetes-app.

Pulagi ya grafana-kubernetes-app inkawoneka ngati njira yosangalatsa kwambiri kwa ife, koma sinathandizidwe kwa nthawi yopitilira chaka ndipo, kuwonjezera apo, siyingagwire ntchito ndi mitundu yatsopano ya node-exporter ndi kube-state-metrics. Ndipo nthawi ina tinaganiza kuti: "Kodi sitiyenera kusankha tokha?"

Ndi malingaliro ati omwe tidaganiza kuti tigwiritse ntchito mu plugin yathu:

  • kuwonekera kwa "mapu ogwiritsira ntchito": mawonekedwe osavuta ogwiritsira ntchito pamagulu, ophatikizidwa ndi malo a mayina, kutumiza...;
  • kuwonetsa zolumikizira monga "deployment - service (+ port)".
  • kuwonetseratu kugawidwa kwa mapulogalamu amagulu pamagulu onse.
  • kusonkhanitsa ma metric ndi zidziwitso kuchokera kumagwero angapo: Prometheus ndi seva ya k8s api.
  • kuyang'anira mbali zonse za zomangamanga (kugwiritsa ntchito nthawi ya CPU, kukumbukira, disk subsystem, netiweki) ndi malingaliro ogwiritsira ntchito - mawonekedwe aumoyo, kuchuluka kwa zofananira zomwe zilipo, zambiri zakupambana mayeso amoyo / kukonzekera.

Gawo 1: Kodi "pulogalamu yowonjezera ya Grafana" ndi chiyani?

Kuchokera pamalingaliro aukadaulo, pulogalamu yowonjezera ya Grafana ndi yowongolera, yomwe imasungidwa mu bukhu la Grafana data (/var/grafana/plugins/ /dist/module.js) ndipo ikhoza kuyikidwa ngati gawo la SystemJS. Komanso mu bukhuli payenera kukhala fayilo ya plugin.json yomwe ili ndi zonse za meta za plugin yanu: dzina, mtundu, mtundu wa plugin, maulalo ku malo / malo / chilolezo, zodalira, ndi zina zotero.

Kupanga pulogalamu yowonjezera ya Grafana: mbiri yakuwombera kwakukulu
module.ts

Kupanga pulogalamu yowonjezera ya Grafana: mbiri yakuwombera kwakukulu
plugin.json

Monga mukuwonera pachithunzichi, tidatchula plugin.type = app. Chifukwa mapulagini a Grafana akhoza kukhala amitundu itatu:

gulu: mtundu wodziwika bwino wa pulogalamu yowonjezera - ndi gulu lowonera ma metrics aliwonse, omwe amagwiritsidwa ntchito popanga ma dashboard osiyanasiyana.
detasource: cholumikizira cholumikizira kumagwero ena a data (mwachitsanzo, Prometheus-datasource, ClickHouse-datasource, ElasticSearch-datasource).
app: Pulagi yomwe imakulolani kuti mupange pulogalamu yanu yakutsogolo mkati mwa Grafana, pangani masamba anu a html ndikupeza pamanja gwero la data kuti muwone zambiri. Komanso, mapulagini amitundu ina (datasource, panel) ndi ma dashboard osiyanasiyana angagwiritsidwe ntchito ngati zodalira.

Kupanga pulogalamu yowonjezera ya Grafana: mbiri yakuwombera kwakukulu
Zitsanzo zodalira pulogalamu yowonjezera ndi type=app.

Mutha kugwiritsa ntchito JavaScript ndi TypeScript ngati chilankhulo chokonzekera (tidachisankha). Kukonzekera kwa mapulagini a hello-world amtundu uliwonse womwe mungathe pezani ulalo: chosungirachi chili ndi mapaketi ambiri oyambira (pali ngakhale chitsanzo choyesera cha pulogalamu yowonjezera mu React) yokhala ndi omanga omwe adakhazikitsidwa kale komanso osinthidwa.

Gawo 2: Kukonzekera chilengedwe

Kuti tigwiritse ntchito pulogalamu yowonjezera, mwachibadwa timafunikira gulu la kubernetes ndi zida zonse zoyikidwiratu: prometheus, node-exporter, kube-state-metrics, grafana. Chilengedwe chiyenera kukhazikitsidwa mwamsanga, mosavuta komanso mwachibadwa, ndipo kuti zitsimikizire kutentha, zolemba za Grafana ziyenera kukhazikitsidwa mwachindunji kuchokera ku makina opanga makina.

Njira yabwino kwambiri, m'malingaliro athu, yogwirira ntchito kwanuko ndi kubernetes ndi minikube. Chotsatira ndikuyika kuphatikiza kwa Prometheus + Grafana pogwiritsa ntchito prometheus-operator. MU Nkhani iyi Njira yoyika prometheus-operator pa minikube ikufotokozedwa mwatsatanetsatane. Kuti muthe kulimbikira, muyenera kukhazikitsa parameter kulimbikira: zoona mufayilo ya charts/grafana/values.yaml, onjezani PV yanu ndi PVC yanu ndikuzitchula mu persistence.existingClaim parameter

Zolemba zathu zomaliza za minikube zimawoneka motere:

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

Gawo 3: chitukuko chenicheni

Chinthu Model

Pokonzekera kukhazikitsa pulogalamu yowonjezera, tidaganiza zofotokozera mabungwe onse a Kubernetes omwe tidzagwire nawo ntchito ngati makalasi a TypeScript: pod, deployment, daemoset, statefulset, job, cronjob, service, node, namespace. Iliyonse mwa makalasi awa imachokera ku kalasi wamba ya BaseModel, yomwe imafotokoza womanga, wowononga, njira zosinthira ndikusintha mawonekedwe. Iliyonse mwa makalasiwo imafotokoza za ubale womwe wasungidwa ndi mabungwe ena, mwachitsanzo, mndandanda wamagulu amtundu wotumizira.

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

Mothandizidwa ndi ma getters ndi setter, titha kuwonetsa kapena kukhazikitsa ma metric omwe timawafuna m'njira yosavuta komanso yowerengeka. Mwachitsanzo, zotulutsa zosinthidwa za cpu node zogawika:

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

Pages

Mndandanda wamasamba athu onse owonjezera amafotokozedwa poyambira pluing.json yathu mugawo lodalira:

Kupanga pulogalamu yowonjezera ya Grafana: mbiri yakuwombera kwakukulu

Patsamba latsamba lililonse tiyenera kuwonetsa PAGE NAME (idzasinthidwa kukhala slug yomwe tsamba ili lizitha kupezeka); dzina la gawo lomwe limagwira ntchito patsamba lino (mndandanda wazinthuzi umatumizidwa ku module.ts); kuwonetsa gawo la ogwiritsa ntchito lomwe tsamba ili lilipo komanso zosintha zapambali.

Mugawo lomwe limayang'anira tsambalo, tiyenera kukhazikitsa templateUrl, kudutsa njira yopita ku fayilo ya html yokhala ndi zolembera. Mkati mwa owongolera, kudzera mu jakisoni wodalira, titha kupeza mautumiki ofunikira a 2:

  • backendSrv - ntchito yomwe imapereka kulumikizana ndi seva ya Grafana API;
  • datasourceSrv - ntchito yomwe imapereka kulumikizana kwanuko ndi zinthu zonse za data zomwe zayikidwa mu Grafana yanu (mwachitsanzo, njira ya .getAll() - imabweretsanso mndandanda wazinthu zonse zomwe zayikidwa; .get( ) - imabweretsanso chinthu chamtundu wina.

Kupanga pulogalamu yowonjezera ya Grafana: mbiri yakuwombera kwakukulu

Kupanga pulogalamu yowonjezera ya Grafana: mbiri yakuwombera kwakukulu

Kupanga pulogalamu yowonjezera ya Grafana: mbiri yakuwombera kwakukulu

Gawo 4: gwero la data

Kuchokera ku maganizo a Grafana, detasource ndi chimodzimodzi pulogalamu yowonjezera monga ena onse: ili ndi malo ake olowera module.js, pali fayilo yokhala ndi chidziwitso cha meta plugin.json. Popanga pulogalamu yowonjezera ndi mtundu = pulogalamu, tikhoza kuyanjana ndi zonse zomwe zilipo (mwachitsanzo, prometheus-datasource) ndi zathu, zomwe tingathe kuzisunga mwachindunji muzolemba za plugin (dist/datasource/*) kapena kukhazikitsa ngati kudalira. Kwa ife, datasource imabwera ndi plugin code. M'pofunikanso kukhala ndi template ya config.html ndi ConfigCtrl controller, yomwe idzagwiritsidwe ntchito pa tsamba lachidziwitso lachitsanzo cha datasource ndi Datasource controller, yomwe imagwiritsa ntchito malingaliro a datasource yanu.

Mu KubeGraf plugin, kuchokera ku mawonekedwe ogwiritsira ntchito, detasource ndi chitsanzo cha gulu la kubernetes lomwe limagwiritsa ntchito zotsatirazi (code code ilipo kugwirizana):

  • kusonkhanitsa deta kuchokera ku k8s api-server (kupeza mndandanda wa malo a mayina, kutumiza ...)
  • proxying pempho ku prometheus-datasource (yomwe imasankhidwa m'mapulagini a gulu lililonse) ndikusintha mayankho kuti agwiritse ntchito deta pamasamba osasunthika komanso m'madashboard.
  • kukonzanso deta pamasamba a static plugin (ndi mlingo wotsitsimula).
  • kukonza mafunso kuti mupange template mu grafana-dashboards (metriFindQuery() njira)

Kupanga pulogalamu yowonjezera ya Grafana: mbiri yakuwombera kwakukulu

Kupanga pulogalamu yowonjezera ya Grafana: mbiri yakuwombera kwakukulu

Kupanga pulogalamu yowonjezera ya Grafana: mbiri yakuwombera kwakukulu

  • kuyesa kulumikizana ndi gulu lomaliza la k8s.
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"};
       })
}

Mfundo yosangalatsa yosiyana, m'malingaliro athu, ndikukhazikitsa njira yotsimikizira ndi kuvomereza kwa datasource. Nthawi zambiri, kuchokera m'bokosilo, titha kugwiritsa ntchito gawo la Grafana datasourceHttpSettings kuti tikonze zofikira kugwero lomaliza la data. Pogwiritsa ntchito gawoli, titha kukonza zofikira ku gwero la data la http pofotokoza ulalo ndi zoikamo zotsimikizika/chilolezo: login-password, kapena client-cert/client-key. Kuti tigwiritse ntchito luso lokonzekera kugwiritsa ntchito chizindikiro chonyamula (de facto standard ya k8s), tinayenera kuchita pang'ono.

Kuti muthane ndi vutoli, mutha kugwiritsa ntchito makina a Grafana "Plugin Routes" (zambiri pa tsamba lovomerezeka). M'makonzedwe a gwero lathu la data, titha kulengeza malamulo oyendetsera omwe adzakonzedwa ndi seva ya proxy ya grafana. Mwachitsanzo, pa mapeto a munthu aliyense ndizotheka kukhazikitsa mitu kapena ma urls ndi kuthekera kwa templating, deta yomwe ingatengedwe kuchokera ku jsonData ndi minda yotetezeka yaJsonData (yosunga mawu achinsinsi kapena zizindikiro mu mawonekedwe obisika). Mu chitsanzo chathu, mafunso ngati /__proxy/api/v1/namespaces idzatumizidwa ku ulalo wa fomu
/api/v8/namespaces ndi Authorization: Bearer mutu.

Kupanga pulogalamu yowonjezera ya Grafana: mbiri yakuwombera kwakukulu

Kupanga pulogalamu yowonjezera ya Grafana: mbiri yakuwombera kwakukulu

Mwachilengedwe, kuti tigwire ntchito ndi seva ya k8s api timafunikira wogwiritsa ntchito yemwe ali ndi mwayi wowerengera okha, amawonetsa kupanga zomwe mungapeze plugin source code.

Gawo 5: kumasulidwa

Kupanga pulogalamu yowonjezera ya Grafana: mbiri yakuwombera kwakukulu

Mukalemba pulogalamu yanu ya Grafana, mwachibadwa mudzafuna kuti ipezeke poyera. Ku Grafana iyi ndi laibulale yamapulagini yomwe ilipo pano grafana.com/grafana/plugins

Kuti pulogalamu yowonjezera yanu ipezeke pa sitolo yovomerezeka, muyenera kupanga PR chosungira ichipowonjezera zomwe zili ngati izi ku fayilo ya repo.json:

Kupanga pulogalamu yowonjezera ya Grafana: mbiri yakuwombera kwakukulu

kumene mtundu ndi mtundu wa pulogalamu yowonjezera yanu, url ndi ulalo wosungirako, ndipo kudzipereka ndiye hashi yodzipereka yomwe mtundu wake wa pulogalamu yowonjezera udzapezeka.

Ndipo pazotulutsa mudzawona chithunzi chodabwitsa ngati:

Kupanga pulogalamu yowonjezera ya Grafana: mbiri yakuwombera kwakukulu

Deta yake idzatengedwa kuchokera ku Readme.md, Changelog.md ndi fayilo ya plugin.json yokhala ndi malongosoledwe a pulogalamu yowonjezera.

Gawo 6: m'malo momaliza

Sitinasiye kupanga pulogalamu yowonjezera yathu titamasulidwa. Ndipo tsopano tikugwira ntchito yoyang'anira bwino kugwiritsa ntchito zida zamagulu amagulu, ndikuyambitsa zatsopano kuti zithandizire kukonza UX, ndikuwonjezeranso mayankho ambiri omwe alandilidwa mutatha kukhazikitsa pulogalamu yowonjezera ndi makasitomala athu komanso kwa anthu pa GitHub (ngati mutasiya nkhani yanu kapena pempho lanu, ndidzakhala wokondwa kwambiri :)

Tikukhulupirira kuti nkhaniyi ikuthandizani kumvetsetsa chida chodabwitsa monga Grafana ndipo, mwina, lembani pulogalamu yowonjezera yanu.

Zikomo!)

Source: www.habr.com

Kuwonjezera ndemanga