Nts'etsopele ea plugin ea Grafana: nalane ea lithunya tse kholo

Lumelang bohle! Likhoeling tse 'maloa tse fetileng, re ile ra tsebisa projeke ea rona e ncha ea mohloli o bulehileng - plugin ea Grafana bakeng sa ho beha leihlo kubernetes, eo re e bitsitseng. DevOpsProdigy KubeGraf. Khoutu ea mohloli oa plugin e fumaneha ho polokelo ea sechaba ho GitHub. 'Me sehloohong sena re batla ho arolelana le uena pale ea kamoo re entseng plugin kateng, ke lisebelisoa life tseo re li sebelisitseng le maraba afe ao re kopaneng le' ona nakong ea ts'ebetso ea nts'etsopele. Ha re ee!

Karolo 0 - selelekela: re fihlile joang ntlheng ee?

Khopolo ea ho ngola plugin ea rona bakeng sa Grafan e ile ea tla ho rona ka phoso. Khamphani ea rona esale e lekola merero ea webo ea maemo a fapaneng a rarahaneng ka lilemo tse fetang 10. Nakong ena, re bokelletse boitsebelo bo bongata, linyeoe tse khahlisang, le boiphihlelo ba ho sebelisa litsamaiso tse fapaneng tsa ho beha leihlo. 'Me ka nako e' ngoe re ile ra ipotsa: "Na ho na le sesebelisoa sa boselamose bakeng sa ho beha leihlo Kubernetes, e le hore, joalokaha ba re, "e behe 'me u e lebale"?" Prometheus + Grafana motsoako. 'Me joalo ka litharollo tse seng li entsoe bakeng sa stack ena, ho na le sete e kholo ea mefuta e fapaneng ea lisebelisoa: prometheus-operator, sete sa li-dashboards tsa kubernetes-mixin, grafana-kubernetes-app.

Grafana-kubernetes-app plugin e ne e bonahala e le khetho e thahasellisang ka ho fetisisa ho rona, empa ha e e-s'o tšehetsoe nako e fetang selemo, 'me, ho feta moo, e ke ke ea sebetsa le mefuta e mecha ea node-exporter le kube-state-metrics. ’Me ka nako e ’ngoe re ile ra etsa qeto: “Na ha rea ​​lokela ho iketsetsa qeto?”

Ke mehopolo efe eo re nkileng qeto ea ho e sebelisa ho plugin ea rona:

  • pono ea "'mapa oa kopo": tlhahiso e bonolo ea lits'ebetso sehlopheng, tse hlophisitsoeng ka libaka tsa mabitso, li-deployments...;
  • pono ea likhokahano joalo ka "deployment - service (+ports)".
  • pono ea kabo ea lits'ebetso tsa lihlopha ho pholletsa le li-cluster node.
  • pokello ea metrics le tlhahisoleseling ho tsoa mehloling e mengata: Prometheus le k8s api seva.
  • ho lekola karolo ea bobeli ea litšebeletso tsa motheo (ts'ebeliso ea nako ea CPU, memori, disk subsystem, marang-rang) le mohopolo oa ts'ebeliso - li-pods tsa boemo ba bophelo bo botle, palo ea likopi tse fumanehang, tlhahisoleseling mabapi le ho feta litekong tsa ho phela / ho itokisa.

Karolo ea 1: "Grafana plugin" ke eng?

Ho latela pono ea tekheniki, plugin ea Grafana ke molaoli oa angular, e bolokiloeng bukeng ea data ea Grafana (/var/grafana/plugins/ /dist/module.js) mme e ka jarisoa joalo ka module ea SystemJS. Hape bukeng ena ho lokela ho ba le faele ea plugin.json e nang le tlhahisoleseding eohle ea meta mabapi le plugin ea hau: lebitso, phetolelo, mofuta oa plugin, li-link tsa sebaka sa polokelo / sebaka / laesense, litšepiso, joalo-joalo.

Nts'etsopele ea plugin ea Grafana: nalane ea lithunya tse kholo
module.ts

Nts'etsopele ea plugin ea Grafana: nalane ea lithunya tse kholo
plugin.json

Joalokaha u bona skrineng, re boletse plugin.type = app. Hobane li-plugins tsa Grafana e ka ba tsa mefuta e meraro:

phanele: mofuta o tloaelehileng oa plugin - ke phanele ea ho bona metrics efe kapa efe, e sebelisetsoang ho aha li-dashboard tse fapaneng.
mohloli oa boitsebiso: sehokelo sa plugin mohloling o mong oa data (mohlala, Prometheus-datasource, ClickHouse-datasource, ElasticSearch-datasource).
app e: Plugin e u lumellang hore u iketsetse sesebelisoa se ka pele ka hare ho Grafana, u iketsetse maqephe a html 'me u fihlele mohloli oa data ka bowena ho bona lintlha tse fapaneng. Hape, li-plugins tsa mefuta e meng (datasource, panel) le li-dashboards tse fapaneng li ka sebelisoa e le litšepe.

Nts'etsopele ea plugin ea Grafana: nalane ea lithunya tse kholo
Mohlala o itšetlehileng ka plugin ka mofuta = app.

U ka sebelisa JavaScript le TypeScript ka bobeli joalo ka puo ea lenaneo (re e khethile). Litokisetso tsa li-plugins tsa hello-world tsa mofuta ofe kapa ofe oo u ka o khonang fumana sehokelo: polokelo ena e na le palo e kholo ea li-starter-packs (ho na le mohlala oa liteko oa plugin ho React) e nang le lihahi tse kentsoeng pele le tse hlophisitsoeng.

Karolo ea 2: ho lokisa tikoloho ea lehae

Ho sebetsa ho plugin, ka tlhaho re hloka sehlopha sa kubernetes se nang le lisebelisoa tsohle tse kentsoeng esale pele: prometheus, node-exporter, kube-state-metrics, grafana. Tikoloho e lokela ho hlophisoa ka potlako, ha bonolo le ka tlhaho, 'me ho etsa bonnete ba ho kenya bocha ho chesa, bukana ea data ea Grafana e lokela ho hlongoa ka kotloloho ho tsoa mochining oa mohlahlami.

Tsela e bonolo ka ho fetisisa, ka maikutlo a rona, ea ho sebetsa sebakeng sa heno le kubernetes ke minikube. Mohato o latelang ke ho kenya motsoako oa Prometheus + Grafana o sebelisa prometheus-operator. IN Sengoloa sena Ts'ebetso ea ho kenya prometheus-operator ho minikube e hlalositsoe ka botlalo. Ho nolofalletsa ho phehella, o tlameha ho seta parameter persistence/ Ketso ya ho phehella: nnete faeleng ea lichate/grafana/values.yaml, eketsa PV le PVC ea hao 'me u li hlakise ho persistence.existingClaim parameter.

Sengoloa sa rona sa ho qetela sa minikube se shebahala tjena:

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

Karolo ea 3: nts'etsopele ea 'nete

Mohlala oa Ntho

Ha re itokisetsa ho kenya ts'ebetsong plugin, re nkile qeto ea ho hlalosa mekhatlo eohle ea mantlha ea Kubernetes eo re tla sebetsa le eona ka mokhoa oa litlelase tsa TypeScript: pod, deployment, daemoset, statefulset, job, cronjob, service, node, namespace. E 'ngoe le e' ngoe ea lihlopha tsena e rua ho tsoa sehlopheng se tloaelehileng sa BaseModel, se hlalosang sehahi, sehahi, mekhoa ea ho ntlafatsa le ho fetola ponahalo. E 'ngoe le e 'ngoe ea lihlopha e hlalosa likamano tse teng le mekhatlo e meng, mohlala, lethathamo la li-pods bakeng sa mokhatlo oa mofuta oa phepelo.

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

Ka thuso ea li-getters le li-setter, re ka bonts'a kapa ra seta metrics ea setheo eo re e hlokang ka mokhoa o bonolo le o balehang. Mohlala, tlhahiso e hlophisitsoeng ea li-cpu node tse ka abeloang:

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

Pages

Lethathamo la maqephe ohle a li-plugin le hlalositsoe qalong ho pluing.json ea rona karolong ea ho itšetleha:

Nts'etsopele ea plugin ea Grafana: nalane ea lithunya tse kholo

Leqepheng la leqephe le leng le le leng re tlameha ho bonts'a LEQEPHE NAME (e tla fetoloa hore e be slug eo leqephe lena le tla fumaneha ka eona); lebitso la karolo e ikarabellang bakeng sa ts'ebetso ea leqephe lena (lenane la likarolo le romelloa ho module.ts); e bonts'a karolo ea mosebelisi eo mosebetsi oa leqephe lena o leng teng le litlhophiso tsa ho tsamaea bakeng sa sebaka se ka thoko.

Karolong e ikarabellang bakeng sa ts'ebetso ea leqephe, re tlameha ho seta templateUrl, re fetise moo tsela ea faele ea html ka markup. Ka har'a molaoli, ka ente ea ho itšetleha, re ka fihlella lits'ebeletso tse 2 tsa bohlokoa tsa angular:

  • backendSrv - tšebeletso e fanang ka tšebelisano le seva sa Grafana API;
  • datasourceSrv - tshebeletso e fanang ka tshebedisano ya lehae le mehlodi yohle ya data e kentsweng ho Grafana ya hao (mohlala, mokgwa wa .getAll() - e kgutlisa lenane la mehlodi yohle e kentsweng ya data; .get( ) - e khutlisa ntho ea mohlala ea mohloli o itseng oa data.

Nts'etsopele ea plugin ea Grafana: nalane ea lithunya tse kholo

Nts'etsopele ea plugin ea Grafana: nalane ea lithunya tse kholo

Nts'etsopele ea plugin ea Grafana: nalane ea lithunya tse kholo

Karolo ea 4: mohloli oa data

Ho ea ka pono ea Grafana, datasource ke plugin e ts'oanang hantle le tse ling kaofela: e na le lintlha tsa eona tsa ho kena module.js, ho na le faele e nang le meta information plugin.json. Ha re hlahisa plugin e nang le mofuta = app, re ka sebelisana le mehloli ea data ka bobeli e teng (mohlala, prometheus-datasource) le ea rona, eo re ka e bolokang ka ho toba bukeng ea plugin (dist/datasource/*) kapa re e kenye e le ho itšetleha. Tabeng ea rona, mohloli oa data o tla le khoutu ea plugin. Hape hoa hlokahala ho ba le template ea config.html le molaoli oa ConfigCtrl, e tla sebelisoa bakeng sa leqephe la tlhophiso ea mohlala oa datasource le molaoli oa Datasource, ea sebelisang mohopolo oa datasource ea hau.

Ho KubeGraf plugin, ho tloha sebakeng sa pono sa basebelisi, mohloli oa data ke mohlala oa sehlopha sa kubernetes se sebelisang bokhoni bo latelang (khoutu ea mohloli e teng. link tsa):

  • ho bokella lintlha ho tswa ho k8s api-server (ho fumana lethathamo la libaka tsa mabitso, li-deployments ...)
  • proxying likopo ho prometheus-datasource (e khethiloeng ho litlhophiso tsa plugin bakeng sa sehlopha ka seng se ikhethileng) le ho fometa likarabo ho sebelisa data maqepheng a sa fetoheng le ho li-dashboard.
  • ho ntlafatsa lintlha maqepheng a static plugin (ka sekhahla sa ho khatholla se behiloeng).
  • sebetsana le lipotso ho hlahisa leqephe la template ho grafana-dashboards (metriFindQuery() mokhoa)

Nts'etsopele ea plugin ea Grafana: nalane ea lithunya tse kholo

Nts'etsopele ea plugin ea Grafana: nalane ea lithunya tse kholo

Nts'etsopele ea plugin ea Grafana: nalane ea lithunya tse kholo

  • teko ea khokahano le sehlopha sa ho qetela sa 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"};
       })
}

Ntho e fapaneng e thahasellisang, ho ea ka maikutlo a rona, ke ts'ebetsong ea mokhoa oa ho netefatsa le ho fana ka tumello bakeng sa mohloli oa boitsebiso. Ka tloaelo, ka ntle ho lebokose, re ka sebelisa karolo ea Grafana e hahelletsoeng ka har'a datasourceHttpSettings ho hlophisa phihlello ea mohloli oa data oa ho qetela. Ka ho sebelisa karolo ena, re ka lokisa phihlello ho mohloli oa data oa http ka ho hlakisa url le litlhophiso tsa mantlha tsa netefatso / tumello: login-password, kapa client-cert/client-key. E le ho kenya ts'ebetsong bokhoni ba ho lokisa phihlello ho sebelisa token ea bear (the de facto standard for k8s), re ile ra tlameha ho etsa tweaking e nyane.

Ho rarolla bothata bona, o ka sebelisa mochini o hahelletsoeng oa Grafana "Plugin Routes" (lintlha tse ling ho leqephe la litokomane tsa molao). Litlhophisong tsa mohloli oa rona oa data, re ka tsebahatsa lethathamo la melao ea ho tsamaisa e tla sebetsoa ke seva ea proxy ea grafana. Ka mohlala, bakeng sa ntlha e 'ngoe le e' ngoe ea ho qetela hoa khoneha ho beha lihlooho kapa li-urls tse nang le monyetla oa ho etsa templating, data e ka nkiloeng tšimong ea jsonData le e sireletsehileng eaJsonData (bakeng sa ho boloka li-passwords kapa tokens ka mokhoa o patiloeng). Mohlala oa rona, lipotso tse kang /__proxy/api/v1/namespaces e tla hlahisoa ho url ea foromo
/api/v8/namespaces ka Authorization: Hlooho ea Bearer.

Nts'etsopele ea plugin ea Grafana: nalane ea lithunya tse kholo

Nts'etsopele ea plugin ea Grafana: nalane ea lithunya tse kholo

Ka tlhaho, ho sebetsa le seva sa k8s api re hloka mosebelisi ea nang le phihlello ea ho bala feela, lipontšo tsa ho theha tseo o ka li fumanang ho tsona. khoutu ea mohloli oa plugin.

Karolo ea 5: ho lokolloa

Nts'etsopele ea plugin ea Grafana: nalane ea lithunya tse kholo

Hang ha u se u ngotse plugin ea hau ea Grafana, ka tlhaho u tla batla ho e etsa hore e fumanehe phatlalatsa. Grafana ke laebrari ea li-plugins tse fumanehang mona grafana.com/grafana/plugins

E le hore plugin ea hau e fumanehe lebenkeleng la molao, o hloka ho etsa PR ho polokelong enaka ho kenyelletsa litaba tse kang tsena faeleng ea repo.json:

Nts'etsopele ea plugin ea Grafana: nalane ea lithunya tse kholo

moo phetolelo e leng mofuta oa plugin ea hau, url ke sehokelo sa polokelo, 'me boitlamo ke hash ea boitlamo eo mofuta o itseng oa plugin o tla fumaneha bakeng sa eona.

'Me ka sephetho u tla bona setšoantšo se setle joalo ka:

Nts'etsopele ea plugin ea Grafana: nalane ea lithunya tse kholo

Lintlha tsa eona li tla nkuoa ka bo eona ho Readme.md, Changelog.md le faeleng ea plugin.json e nang le tlhaloso ea plugin.

Karolo ea 6: sebakeng sa liqeto

Ha rea ​​ka ra emisa ho nts'etsapele plugin ea rona kamora ho lokolloa. 'Me joale re ntse re sebetsa ho lekola ts'ebeliso ea lisebelisoa tsa li-cluster node, ho hlahisa likarolo tse ncha ho ntlafatsa UX, le ho fana ka maikutlo a mangata a fumanoeng ka mor'a ho kenya plugin ke bareki ba rona le ho batho ba GitHub (haeba u tloha. taba ea hau kapa kopo ea hau, ke tla thaba haholo :)

Re tšepa hore sehlooho sena se tla u thusa ho utloisisa sesebelisoa se babatsehang joaloka Grafana 'me, mohlomong, u ngole plugin ea hau.

Kea leboha!)

Source: www.habr.com

Eketsa ka tlhaloso