Devlopman yon plugin pou Grafana: yon istwa gwo kout fe

Bonjou tout moun! Sa gen kèk mwa, nou te lanse nouvo pwojè sous louvri nou an nan pwodiksyon - Plugin Grafana pou kontwole kubernetes, ke nou rele. DevOpsProdigy KubeGraf. Kòd sous plugin a disponib nan depo piblik sou GitHub. Ak nan atik sa a nou vle pataje avèk ou istwa a sou fason nou te kreye plugin a, ki zouti nou te itilize ak ki enkonvenyans nou te rankontre pandan pwosesis devlopman an. Ann ale!

Pati 0 - entwodiksyon: ki jan nou te rive nan pwen sa a?

Lide pou nou ekri pwòp pa nou pou Grafan te vin jwenn nou pa aksidan. Konpayi nou an te kontwole pwojè entènèt nan divès nivo konpleksite pou plis pase 10 ane. Pandan tan sa a, nou te akimile yon gwo kantite ekspètiz, ka enteresan, ak eksperyans nan itilize sistèm siveyans divès kalite. Ak nan kèk pwen nou mande tèt nou: "Èske gen yon zouti majik pou kontwole Kubernetes, se konsa ke, jan yo di, "mete li epi bliye li"? Konbinezon Prometheus + Grafana. Epi kòm solisyon pare-fè pou chemine sa a, gen yon seri gwo divès kalite zouti: prometheus-operator, yon seri tablodbò kubernetes-mixin, grafana-kubernetes-app.

Plugin nan grafana-kubernetes-app te sanble opsyon ki pi enteresan pou nou, men li pa te sipòte pou plis pase yon ane epi, Anplis, pa ka travay ak nouvo vèsyon nan node-exporter ak kube-state-metrics. Epi nan kèk pwen nou te deside: "Èske nou pa ta dwe pran pwòp desizyon pa nou?"

Ki lide nou deside aplike nan plugin nou an:

  • vizyalizasyon "kat aplikasyon an": prezantasyon pratik nan aplikasyon nan gwoup la, gwoupe pa espas non, deplwaman ...;
  • vizyalizasyon koneksyon tankou "deplwaman - sèvis (+ pò)".
  • vizyalizasyon distribisyon aplikasyon grap atravè nœuds grap yo.
  • koleksyon mezi ak enfòmasyon ki soti nan plizyè sous: Prometheus ak k8s api server.
  • siveyans tou de pati enfrastrikti (itilize tan CPU, memwa, subsistèm ki gen kapasite, rezo) ak lojik aplikasyon - gous sante-estati, kantite kopi ki disponib, enfòmasyon sou pase tès vivan/preparasyon.

Pati 1: Ki sa ki se yon "Grafana Plugin"?

Soti nan yon pwen de vi teknik, Plugin pou Grafana se yon kontwolè angilè, ki estoke nan anyè done Grafana (/var/grafana/plugins/ /dist/module.js) epi yo ka chaje kòm yon modil SystemJS. Epitou nan anyè sa a ta dwe gen yon fichye plugin.json ki gen tout enfòmasyon meta sou plugin ou a: non, vèsyon, kalite plugin, lyen ki mennen nan depo/sit/lisans, depandans, ak sou sa.

Devlopman yon plugin pou Grafana: yon istwa gwo kout fe
module.ts

Devlopman yon plugin pou Grafana: yon istwa gwo kout fe
plugin.json

Kòm ou ka wè nan ekran an, nou espesifye plugin.type = app. Paske grefon pou Grafana ka gen twa kalite:

panèl: kalite ki pi komen nan Plugin - li se yon panèl pou vizyalize nenpòt metrik, yo itilize yo bati plizyè tablodbò.
sous done: konektè plugin pou kèk sous done (pa egzanp, Prometheus-datasource, ClickHouse-datasource, ElasticSearch-datasource).
app: Yon plugin ki pèmèt ou konstwi pwòp aplikasyon entèfas ou anndan Grafana, kreye pwòp paj html ou epi aksede manyèlman sous done a pou wè divès kalite done. Epitou, grefon nan lòt kalite (sous done, panèl) ak divès kalite tablodbò yo ka itilize kòm depandans.

Devlopman yon plugin pou Grafana: yon istwa gwo kout fe
Egzanp depandans plugin ak tip=app.

Ou ka itilize tou de JavaScript ak TypeScript kòm yon langaj pwogramasyon (nou te chwazi li). Preparasyon pou grefon hello-world nenpòt kalite ou kapab jwenn lyen an: depo sa a gen yon gwo kantite starter-pack (gen menm yon egzanp eksperimantal nan yon Plugin nan React) ak mason pre-enstale ak konfigirasyon.

Pati 2: prepare anviwònman lokal la

Pou travay sou Plugin la, natirèlman nou bezwen yon gwoup kubernetes ak tout zouti pre-enstale: prometheus, node-exporter, kube-state-metrics, grafana. Anviwònman an ta dwe mete kanpe byen vit, fasil ak natirèlman, epi asire cho-rechaje, anyè done Grafana yo ta dwe monte dirèkteman nan machin pwomotè a.

Fason ki pi pratik, nan opinyon nou, travay lokalman ak kubernetes se minikube. Pwochen etap la se enstale konbinezon Prometheus + Grafana lè l sèvi avèk prometheus-operator. NAN Atik sa Pwosesis pou enstale prometheus-operator sou minikube dekri an detay. Pou pèmèt pèsistans, ou dwe mete paramèt la pèsistans: vre nan dosye charts/grafana/values.yaml, ajoute pwòp PV ou ak PVC ou epi presize yo nan paramèt persistence.existingClaim.

Script final lansman minikube nou an sanble sa a:

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

Pati 3: devlopman aktyèl

Modèl objè

Nan preparasyon pou aplike Plugin la, nou deside dekri tout antite debaz Kubernetes ke nou pral travay avèk yo nan fòm klas TypeScript: pod, deplwaman, daemonset, statefulset, travay, cronjob, sèvis, node, espas non. Chak nan klas sa yo eritye nan klas BaseModel komen, ki dekri konstrukteur, destriksyon, metòd pou mete ajou ak chanje vizibilite. Chak nan klas yo dekri relasyon anbrike ak lòt antite, pou egzanp, yon lis gous pou yon antite ki gen kalite deplwaman.

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

Avèk èd getters ak setters, nou ka montre oswa mete mezi antite nou bezwen yo nan yon fòm pratik ak lizib. Pou egzanp, pwodiksyon fòma nan nœuds CPU alokab:

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

Paj

Yo dekri yon lis tout paj plugin nou yo okòmansman nan pluing.json nou an nan seksyon depandans yo:

Devlopman yon plugin pou Grafana: yon istwa gwo kout fe

Nan blòk pou chak paj nou dwe endike NON PAJ la (answit li pral konvèti nan yon paresseux kote paj sa a pral aksesib); non eleman ki responsab operasyon paj sa a (lis eleman yo ekspòte nan module.ts); endike wòl itilizatè a pou ki travay ak paj sa a ki disponib ak anviwònman navigasyon pou ankadre a.

Nan eleman ki responsab pou operasyon an nan paj la, nou dwe mete templateUrl, pase la chemen an nan dosye a html ak maketing. Anndan kontwolè a, atravè piki depandans, nou ka jwenn aksè jiska 2 sèvis angilè enpòtan:

  • backendSrv - yon sèvis ki bay entèraksyon ak sèvè Grafana API a;
  • datasourceSrv - yon sèvis ki bay entèraksyon lokal ak tout sous done ki enstale nan Grafana ou a (pa egzanp, metòd .getAll()) - retounen yon lis tout sous done enstale; .get( ) - retounen yon objè egzanp nan yon sous done espesifik.

Devlopman yon plugin pou Grafana: yon istwa gwo kout fe

Devlopman yon plugin pou Grafana: yon istwa gwo kout fe

Devlopman yon plugin pou Grafana: yon istwa gwo kout fe

Pati 4: sous done

Soti nan pwen de vi Grafana a, sous done se egzakteman menm plugin ak tout lòt yo: li gen pwòp pwen antre module.js, gen yon dosye ki gen meta enfòmasyon plugin.json. Lè w ap devlope yon plugin ak tip = app, nou ka kominike ak tou de sous done ki egziste deja (pa egzanp, prometheus-datasource) ak pwòp pa nou, ke nou ka estoke dirèkteman nan anyè a plugin (dist/datasource/*) oswa enstale kòm yon depandans. Nan ka nou an, sous done a vini ak kòd la Plugin. Li nesesè tou pou gen yon modèl config.html ak yon kontwolè ConfigCtrl, ki pral itilize pou paj konfigirasyon enstans done ak kontwolè Datasource, ki aplike lojik sous done ou a.

Nan Plugin KubeGraf, nan pwen de vi koòdone itilizatè a, sous done a se yon egzanp yon gwoup kubernetes ki aplike kapasite sa yo (kòd sous ki disponib по ссылке):

  • kolekte done ki soti nan k8s api-sèvè a (jwenn yon lis espas non, deplwaman ...)
  • demann proxy pou prometheus-datasource (ki chwazi nan paramèt plugin yo pou chak gwoup espesifik) ak fòma repons pou itilize done tou de nan paj estatik ak nan tablodbò yo.
  • mete ajou done sou paj plugin estatik (ak yon pousantaj rafrechisman mete).
  • pwosesis demann pou jenere yon fèy modèl nan grafana-dashboards (metòd metriFindQuery())

Devlopman yon plugin pou Grafana: yon istwa gwo kout fe

Devlopman yon plugin pou Grafana: yon istwa gwo kout fe

Devlopman yon plugin pou Grafana: yon istwa gwo kout fe

  • tès koneksyon ak gwoup final k8s la.
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"};
       })
}

Yon pwen enteresan apa, nan opinyon nou an, se aplikasyon an nan yon mekanis otantifikasyon ak otorizasyon pou sous done a. Tipikman, soti nan bwat la, nou ka itilize entegre Grafana eleman datasourceHttpSettings pou konfigirasyon aksè nan sous done final la. Sèvi ak eleman sa a, nou ka konfigirasyon aksè nan sous done http la lè nou espesifye url la ak paramèt otantifikasyon/otorizasyon debaz yo: login-modpas, oswa kliyan-sèt/kliyan-kle. Yo nan lòd yo aplike kapasite nan konfigirasyon aksè lè l sèvi avèk yon siy pote (estanda defakto pou k8s), nou te oblije fè yon ti ajisteman.

Pou rezoud pwoblèm sa a, ou ka itilize mekanis Grafana "Plugin Routes" ki entegre (plis detay nan paj dokiman ofisyèl). Nan anviwònman yo nan sous done nou an, nou ka deklare yon seri règ routage ki pral trete pa sèvè a prokurasyon grafana. Pou egzanp, pou chak pwen final endividyèl li posib yo mete tèt oswa urls ak posibilite pou modèl, done pou ki ka pran nan jaden yo jsonData ak secureJsonData (pou estoke modpas oswa marqueur nan fòm chiffres). Nan egzanp nou an, demann tankou /__proxy/api/v1/namespaces pral proxy nan url fòm lan
/api/v8/namespaces ak Otorizasyon: Bearer header.

Devlopman yon plugin pou Grafana: yon istwa gwo kout fe

Devlopman yon plugin pou Grafana: yon istwa gwo kout fe

Natirèlman, pou travay avèk sèvè k8s api a nou bezwen yon itilizatè ki gen aksè pou lekti sèlman, manifès pou kreye ke ou ka jwenn tou nan kòd sous plugin.

Pati 5: lage

Devlopman yon plugin pou Grafana: yon istwa gwo kout fe

Yon fwa ou te ekri pwòp Plugin Grafana ou a, natirèlman ou pral vle fè li disponib piblikman. Nan Grafana sa a se yon bibliyotèk nan grefon ki disponib isit la grafana.com/grafana/plugins

Pou plugin ou a disponib sou magazen ofisyèl la, ou bezwen fè yon PR nan depo sa apa ajoute kontni tankou sa a nan fichye repo.json la:

Devlopman yon plugin pou Grafana: yon istwa gwo kout fe

kote vèsyon an se vèsyon an nan Plugin ou a, url se yon lyen ki mennen nan repozitwa a, ak komèt se hash nan komèt la pou ki yon vèsyon espesifik nan Plugin la ap disponib.

Ak nan pwodiksyon an ou pral wè yon foto bèl bagay tankou:

Devlopman yon plugin pou Grafana: yon istwa gwo kout fe

Done pou li pral otomatikman pwan nan Readme.md ou, Changelog.md ak dosye plugin.json la ak deskripsyon an plugin.

Pati 6: olye pou yo konklizyon

Nou pa t sispann devlope plugin nou an apre yo fin lage. Epi, koulye a nou ap travay sou kòrèkteman siveyans itilizasyon resous nan nœuds gwoup, entwodwi nouvo karakteristik amelyore UX, epi tou rato nan yon gwo kantite fidbak resevwa apre enstale Plugin la tou de pa kliyan nou yo ak nan men moun sou GitHub (si ou kite pwoblèm ou oswa demann rale, mwen pral trè kontan :)

Nou espere ke atik sa a pral ede w konprann tankou yon zouti bèl bagay tankou Grafana epi, petèt, ekri pwòp Plugin ou.

Mèsi!)

Sous: www.habr.com

Achte hosting serye pou sit ki gen pwoteksyon DDoS, sèvè VPS VDS 🔥 Achte yon hébergement sit entènèt serye ak pwoteksyon DDoS, sèvè VPS VDS | ProHoster