Kev txhim kho ntawm lub plugin rau Grafana: keeb kwm ntawm kev txhaj tshuaj loj

Nyob zoo sawv daws! Ob peb lub hlis dhau los, peb tau tshaj tawm peb txoj haujlwm qhib tshiab rau hauv kev tsim khoom - Grafana plugin rau kev saib xyuas kubernetes, uas peb hu ua DevOpsProdigy KubeGraf. Lub plugin qhov chaws muaj nyob ntawm public repository ntawm GitHub. Thiab nyob rau hauv tsab xov xwm no peb xav qhia rau koj zaj dab neeg ntawm yuav ua li cas peb tsim lub plugin, dab tsi cov cuab yeej peb siv thiab dab tsi pitfalls peb ntsib thaum lub sij hawm txoj kev loj hlob. Wb mus!

Part 0 - introductory: Peb tau mus txog qhov twg?

Lub tswv yim los sau peb tus kheej plugin rau Grafan tuaj rau peb heev los ntawm kev sib tsoo. Peb lub tuam txhab tau saib xyuas lub vev xaib ntawm ntau theem ntawm kev nyuaj rau ntau tshaj 10 xyoo. Lub sijhawm no, peb tau sau ntau qhov kev txawj ntse, nthuav dav, thiab kev paub txog kev siv ntau yam kev saib xyuas. Thiab ntawm qee lub sijhawm peb nug peb tus kheej: "Puas muaj cov cuab yeej ua khawv koob rau kev saib xyuas Kubernetes, yog li ntawd, raws li lawv hais, "tsim nws thiab tsis nco qab nws"?". Prometheus + Grafana ua ke. Thiab raws li cov kev daws teeb meem npaj txhij rau pawg no, muaj ntau txheej ntau yam ntawm cov cuab yeej: prometheus-tus neeg teb xov tooj, txheej kubernetes-mixin dashboards, grafana-kubernetes-app.

Lub grafana-kubernetes-app plugin zoo li yog qhov kev xaiv nthuav tshaj plaws rau peb, tab sis nws tsis tau txais kev txhawb nqa rau ntau tshaj ib xyoos thiab, ntxiv rau, tsis tuaj yeem ua haujlwm nrog cov tshiab versions ntawm node-exporter thiab kube-state-metrics. Thiab qee lub sijhawm peb txiav txim siab: "Peb puas yuav tsum txiav txim siab peb tus kheej?"

Cov tswv yim dab tsi peb txiav txim siab los siv hauv peb lub plugin:

  • visualization ntawm "daim ntawv qhia daim ntawv thov": yooj yim nthuav qhia ntawm daim ntawv thov nyob rau hauv pawg, pab pawg los ntawm namespaces, deployments ...;
  • kev pom kev sib txuas zoo li "kev xa tawm - kev pabcuam (+ chaw nres nkoj)".
  • visualization ntawm kev faib ntawm cov ntawv thov hauv pawg hauv pawg pawg.
  • sau cov kev ntsuas thiab cov ntaub ntawv los ntawm ntau qhov chaw: Prometheus thiab k8s api server.
  • kev saib xyuas ntawm ob qho tib si infrastructure (siv lub sij hawm CPU, nco, disk subsystem, network) thiab daim ntawv thov logic - kev noj qab haus huv-status pods, tus naj npawb ntawm replicas muaj, cov ntaub ntawv hais txog kev xeem dhau lub neej / kev npaj txhij.

Part 1: Dab tsi yog "Grafana plugin"?

Los ntawm cov kev taw qhia ntawm kev pom, lub plugin rau Grafana yog tus tswj angular, uas yog khaws cia hauv Grafana cov ntaub ntawv teev npe (/var/grafana/plugins/ /dist/module.js) thiab tuaj yeem thauj khoom raws li SystemJS module. Tsis tas li ntawd hauv phau ntawv teev npe no yuav tsum muaj cov ntaub ntawv plugin.json uas muaj tag nrho cov ntaub ntawv meta txog koj lub plugin: lub npe, version, hom plugin, txuas mus rau qhov chaw cia khoom / chaw / ntawv tso cai, kev vam khom, thiab lwm yam.

Kev txhim kho ntawm lub plugin rau Grafana: keeb kwm ntawm kev txhaj tshuaj loj
module.ts

Kev txhim kho ntawm lub plugin rau Grafana: keeb kwm ntawm kev txhaj tshuaj loj
plugin.json

Raws li koj tuaj yeem pom hauv lub screenshot, peb teev plugin.type = app. Vim tias plugins rau Grafana tuaj yeem yog peb hom:

vaj huam sib luag: hom plugin ntau tshaj plaws - nws yog lub vaj huam sib luag rau kev pom cov kev ntsuas, siv los tsim ntau yam dashboards.
datasource: plugin connector rau qee cov ntaub ntawv qhov chaw (piv txwv li, Prometheus-datasource, ClickHouse-datasource, ElasticSearch-datasource).
app: Lub plugin uas tso cai rau koj los tsim koj tus kheej daim ntawv thov frontend hauv Grafana, tsim koj tus kheej html nplooj ntawv thiab manually nkag mus rau datasource kom pom ntau yam ntaub ntawv. Tsis tas li ntawd, plugins ntawm lwm hom (datasource, vaj huam sib luag) thiab ntau yam dashboards tuaj yeem siv los ua kev vam khom.

Kev txhim kho ntawm lub plugin rau Grafana: keeb kwm ntawm kev txhaj tshuaj loj
Piv txwv plugin dependencies nrog hom = app.

Koj tuaj yeem siv JavaScript thiab TypeScript ua hom lus programming (peb xaiv nws). Kev npaj rau hello-world plugins ntawm txhua yam koj ua tau nrhiav qhov txuas: qhov chaw cia khoom no muaj ntau lub pob pib pib (tseem muaj qhov kev sim piv txwv ntawm lub plugin hauv React) nrog cov neeg tsim ua ntej thiab teeb tsa.

Ntu 2: npaj ib puag ncig hauv zos

Txhawm rau ua haujlwm ntawm lub plugin, peb ib txwm xav tau kubernetes pawg nrog tag nrho cov cuab yeej preinstalled: prometheus, node-exporter, kube-state-metrics, grafana. Ib puag ncig yuav tsum tau teeb tsa sai, yooj yim thiab ib txwm, thiab txhawm rau kom kub-reload, Grafana cov ntaub ntawv teev npe yuav tsum tau txuas ncaj qha los ntawm tus tsim tawm lub tshuab.

Txoj kev yooj yim tshaj plaws, hauv peb lub tswv yim, ua haujlwm hauv zos nrog kubernetes yog mini kub. Cov kauj ruam tom ntej yog rau nruab Prometheus + Grafana ua ke siv prometheus-neeg ua haujlwm. IN tsab xov xwm no Cov txheej txheem ntawm kev txhim kho prometheus-tus neeg teb xov tooj ntawm minikube tau piav qhia ntxaws. Txhawm rau ua kom tsis muaj zog, koj yuav tsum teeb tsa qhov ntsuas persistence: tseeb nyob rau hauv cov kab kos / grafana/values.yaml cov ntaub ntawv, ntxiv koj tus kheej PV thiab PVC thiab qhia lawv nyob rau hauv lub persistence.existingClaim parameter

Peb qhov kawg minikube tso tsab ntawv zoo li no:

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

Ntu 3: kev txhim kho tiag tiag

Yam khoom Model

Hauv kev npaj rau kev siv lub plugin, peb tau txiav txim siab los piav qhia tag nrho cov ntsiab lus Kubernetes cov chaw uas peb yuav ua haujlwm nrog rau hauv cov chav kawm TypeScript: pod, deployment, daemonset, statefulset, job, cronjob, service, node, namespace. Txhua chav kawm no tau txais txiaj ntsig los ntawm cov chav kawm BaseModel, uas piav qhia txog tus tsim, tus tsim, kev tsim kho, kev hloov kho thiab hloov qhov pom kev. Txhua chav kawm piav qhia txog kev sib raug zoo nrog lwm cov koom haum, piv txwv li, ib daim ntawv teev cov pods rau ib qho chaw ntawm hom kev xa tawm.

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

Nrog kev pab los ntawm getters thiab setters, peb tuaj yeem tso saib lossis teeb tsa qhov chaw ntsuas peb xav tau hauv daim ntawv yooj yim thiab nyeem tau. Piv txwv li, formatted tso zis ntawm allocatable cpu nodes:

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

nplooj ntawv

Ib daim ntawv teev npe ntawm tag nrho peb cov nplooj ntawv plugin yog pib piav qhia hauv peb lub pluing.json nyob rau hauv seem dependencies:

Kev txhim kho ntawm lub plugin rau Grafana: keeb kwm ntawm kev txhaj tshuaj loj

Nyob rau hauv lub thaiv rau txhua nplooj ntawv peb yuav tsum qhia lub PAGE NAME (nws mam li hloov mus rau ib tug slug uas nplooj ntawv no yuav siv tau); lub npe ntawm lub luag haujlwm rau kev ua haujlwm ntawm nplooj ntawv no (cov npe ntawm cov khoom raug xa tawm mus rau module.ts); qhia txog tus neeg siv lub luag haujlwm uas ua haujlwm nrog nplooj ntawv no muaj thiab navigation nqis rau lub sidebar.

Hauv kev tivthaiv lub luag haujlwm rau kev ua haujlwm ntawm nplooj ntawv, peb yuav tsum teeb tsa templateUrl, dhau qhov ntawd mus rau cov ntaub ntawv html nrog markup. Nyob rau hauv tus maub los, los ntawm kev vam khom kev txhaj tshuaj, peb tuaj yeem nkag mus txog 2 qhov kev pabcuam angular tseem ceeb:

  • backendSrv - ib qho kev pabcuam uas muab kev cuam tshuam nrog Grafana API server;
  • datasourceSrv - ib qho kev pabcuam uas muab kev sib cuam tshuam hauv zos nrog txhua cov ntaub ntawv tau teeb tsa hauv koj lub Grafana (piv txwv li, txoj kev .getAll() - rov qab cov npe ntawm tag nrho cov ntaub ntawv tau teeb tsa; .get( ) - xa cov khoom piv txwv ntawm cov ntaub ntawv tshwj xeeb.

Kev txhim kho ntawm lub plugin rau Grafana: keeb kwm ntawm kev txhaj tshuaj loj

Kev txhim kho ntawm lub plugin rau Grafana: keeb kwm ntawm kev txhaj tshuaj loj

Kev txhim kho ntawm lub plugin rau Grafana: keeb kwm ntawm kev txhaj tshuaj loj

Part 4: Cov ntaub ntawv qhov chaw

Los ntawm Grafana txoj kev xav, datasource yog tib yam plugin raws li tag nrho lwm tus: nws muaj nws tus kheej nkag point module.js, muaj cov ntaub ntawv nrog meta cov ntaub ntawv plugin.json. Thaum tsim lub plugin nrog hom = app, peb tuaj yeem cuam tshuam nrog ob qho tib si cov ntaub ntawv uas twb muaj lawm (piv txwv li, prometheus-datasource) thiab peb tus kheej, uas peb tuaj yeem khaws ncaj qha rau hauv plugin directory (dist/datasource/*) lossis nruab raws li kev vam khom. Nyob rau hauv peb cov ntaub ntawv, cov ntaub ntawv los nrog lub plugin code. Nws tseem yuav tsum muaj config.html template thiab ConfigCtrl maub los, uas yuav siv rau datasource piv txwv configuration nplooj ntawv thiab Datasource maub los, uas siv lub logic ntawm koj datasource.

Nyob rau hauv KubeGraf plugin, los ntawm cov neeg siv interface ntawm qhov pom, cov ntaub ntawv yog ib qho piv txwv ntawm kubernetes pawg uas siv cov peev txheej hauv qab no (qhov chaws muaj. txuas):

  • sau cov ntaub ntawv los ntawm k8s api-server (tau txais ib daim ntawv teev npe, kev xa tawm ...)
  • proxying thov rau prometheus-datasource (uas yog xaiv nyob rau hauv lub plugin teeb tsa rau txhua pawg tshwj xeeb) thiab formatting cov lus teb siv cov ntaub ntawv ob qho tib si hauv nplooj ntawv zoo li qub thiab hauv dashboards.
  • hloov kho cov ntaub ntawv ntawm nplooj ntawv plugin zoo li qub (nrog rau tus nqi refresh).
  • ua cov lus nug los tsim ib daim ntawv template hauv grafana-dashboards (metriFindQuery() txoj kev)

Kev txhim kho ntawm lub plugin rau Grafana: keeb kwm ntawm kev txhaj tshuaj loj

Kev txhim kho ntawm lub plugin rau Grafana: keeb kwm ntawm kev txhaj tshuaj loj

Kev txhim kho ntawm lub plugin rau Grafana: keeb kwm ntawm kev txhaj tshuaj loj

  • kev sib txuas kuaj nrog qhov kawg k8s pawg.
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"};
       })
}

Ib qho kev nthuav qhia tshwj xeeb, hauv peb lub tswv yim, yog kev ua raws li kev lees paub thiab kev tso cai mechanism rau datasource. Feem ntau, tawm ntawm lub thawv, peb tuaj yeem siv qhov tsim-hauv Grafana tivthaiv datasourceHttpSettings los teeb tsa kev nkag mus rau cov ntaub ntawv zaum kawg. Siv cov khoom siv no, peb tuaj yeem teeb tsa kev nkag mus rau http cov ntaub ntawv los ntawm kev qhia qhov url thiab qhov yooj yim authentication/authorization settings: tus ID nkag mus-password, los yog tus neeg siv-cert/client-key. Txhawm rau siv lub peev xwm los teeb tsa kev nkag mus siv tus lej cim (tus qauv de facto rau k8s), peb yuav tsum tau ua me ntsis tweaking.

Yuav kom daws tau qhov teeb meem no, koj tuaj yeem siv lub built-in Grafana "Plugin Routes" mechanism (ntxiv cov ntsiab lus ntawm nplooj ntawv cov ntaub ntawv). Hauv kev teeb tsa ntawm peb cov ntaub ntawv, peb tuaj yeem tshaj tawm cov txheej txheem routing uas yuav ua tiav los ntawm grafana proxy server. Piv txwv li, rau txhua tus neeg qhov kawg nws tuaj yeem teeb tsa lub taub hau lossis urls nrog qhov ua tau ntawm templateing, cov ntaub ntawv uas tuaj yeem coj los ntawm jsonData thiab ruaj ntsegJsonData teb (rau khaws cov passwords lossis tokens hauv daim ntawv encrypted). Hauv peb qhov piv txwv, cov lus nug zoo li /__proxy/api/v1/namespaces yuav raug xa mus rau url ntawm daim ntawv
/api/v8/namespaces nrog Kev Tso Cai: Bearer header.

Kev txhim kho ntawm lub plugin rau Grafana: keeb kwm ntawm kev txhaj tshuaj loj

Kev txhim kho ntawm lub plugin rau Grafana: keeb kwm ntawm kev txhaj tshuaj loj

Lawm, ua haujlwm nrog k8s api server peb xav tau tus neeg siv nrog nyeem nkaus xwb, qhia rau kev tsim uas koj tuaj yeem pom hauv plugin qhov chaws code.

Ntu 5: tso tawm

Kev txhim kho ntawm lub plugin rau Grafana: keeb kwm ntawm kev txhaj tshuaj loj

Thaum koj tau sau koj tus kheej Grafana plugin, koj yuav xav ua kom nws muaj rau pej xeem. Hauv Grafana qhov no yog lub tsev qiv ntawv ntawm plugins muaj nyob ntawm no grafana.com/grafana/plugins

Txhawm rau kom koj lub plugin muaj nyob rau ntawm lub khw muag khoom, koj yuav tsum ua PR hauv qhov chaw khaws cialos ntawm kev ntxiv cov ntsiab lus zoo li no rau cov ntaub ntawv repo.json:

Kev txhim kho ntawm lub plugin rau Grafana: keeb kwm ntawm kev txhaj tshuaj loj

qhov twg version yog qhov version ntawm koj lub plugin, url yog qhov txuas mus rau qhov chaw cia khoom, thiab cog lus yog qhov hash ntawm kev cog lus rau qhov tshwj xeeb version ntawm lub plugin yuav muaj.

Thiab ntawm cov zis koj yuav pom ib daim duab zoo li:

Kev txhim kho ntawm lub plugin rau Grafana: keeb kwm ntawm kev txhaj tshuaj loj

Cov ntaub ntawv rau nws yuav tau txais los ntawm koj lub Readme.md, Changelog.md thiab cov ntaub ntawv plugin.json nrog cov lus piav qhia plugin.

Ntu 6: tsis yog cov lus xaus

Peb tsis tau tso tseg kev tsim peb plugin tom qab tso tawm. Thiab tam sim no peb tab tom ua haujlwm kom raug saib xyuas kev siv cov peev txheej ntawm pawg nodes, qhia cov yam ntxwv tshiab los txhim kho UX, thiab tseem raking ntau cov lus pom zoo tau txais tom qab txhim kho lub plugin ob qho tib si los ntawm peb cov neeg siv khoom thiab los ntawm cov neeg ntawm GitHub (yog tias koj tawm mus. koj qhov teeb meem lossis rub thov, Kuv yuav zoo siab heev :)

Peb cia siab tias tsab xov xwm no yuav pab koj nkag siab txog cov cuab yeej zoo li Grafana thiab, tej zaum, sau koj tus kheej plugin.

Ua tsaug!)

Tau qhov twg los: www.hab.com

Ntxiv ib saib