Pag-uswag sa usa ka plugin alang sa Grafana: usa ka kasaysayan sa dagkong mga shot

Kumusta tanan! Pipila ka bulan ang milabay, gilunsad namo ang among bag-ong open-source nga proyekto ngadto sa produksyon - ang Grafana plugin alang sa pagmonitor sa mga kubernetes, nga among gitawag DevOpsProdigy KubeGraf. Ang plugin source code anaa sa publiko nga repository sa GitHub. Ug sa niini nga artikulo gusto namong ipaambit kanimo ang istorya kung giunsa namo paghimo ang plugin, unsa nga mga himan ang among gigamit ug unsa nga mga lit-ag ang among nasugatan sa panahon sa proseso sa pagpalambo. Adto na ta!

Bahin 0 - pasiuna: giunsa nato pag-abot niini nga punto?

Ang ideya sa pagsulat sa among kaugalingon nga plugin para sa Grafan miabut kanamo sa aksidente. Ang among kompanya nag-monitor sa mga proyekto sa web sa lainlaing lebel sa pagkakomplikado sa sobra sa 10 ka tuig. Niining panahona, nakatigom kami ug daghang kahanas, makapaikag nga mga kaso, ug kasinatian sa paggamit sa lainlaing mga sistema sa pagmonitor. Ug sa usa ka punto among gipangutana ang among kaugalingon: "Aduna bay usa ka magic nga himan alang sa pag-monitor sa mga Kubernetes, aron, ingon sa ilang giingon, "ibutang kini ug kalimtan kini"?".. Ang sumbanan sa industriya alang sa pag-monitor sa mga k8, siyempre, dugay na nga ang Ang kombinasyon sa Prometheus + Grafana. Ug isip andam nga mga solusyon alang niini nga stack, adunay usa ka dako nga hugpong sa nagkalain-laing matang sa mga himan: prometheus-operator, usa ka set sa kubernetes-mixin dashboards, grafana-kubernetes-app.

Ang grafana-kubernetes-app plugin daw mao ang labing makaiikag nga kapilian alang kanamo, apan wala kini gisuportahan sulod sa kapin sa usa ka tuig ug, dugang pa, dili makatrabaho sa mga bag-ong bersyon sa node-exporter ug kube-state-metrics. Ug sa usa ka punto nakahukom kami: "Dili ba kinahanglan nga maghimo kami sa among kaugalingon nga desisyon?"

Unsa nga mga ideya ang among nakahukom nga ipatuman sa among plugin:

  • visualization sa "application map": sayon ​​nga presentasyon sa mga aplikasyon sa cluster, gigrupo sa namespaces, deployments...;
  • visualization sa mga koneksyon sama sa "deployment - service (+ports)".
  • pagtan-aw sa pag-apod-apod sa mga aplikasyon sa cluster sa mga cluster node.
  • koleksyon sa metrics ug impormasyon gikan sa daghang tinubdan: Prometheus ug k8s api server.
  • pagmonitor sa duha ka bahin sa imprastraktura (paggamit sa oras sa CPU, memorya, subsystem sa disk, network) ug lohika sa aplikasyon - mga status sa panglawas, gidaghanon sa magamit nga mga replika, impormasyon bahin sa pagpasa sa liveness/readyness tests.

Bahin 1: Unsa ang "Grafana plugin"?

Gikan sa teknikal nga punto sa panglantaw, ang plugin alang sa Grafana usa ka angular controller, nga gitipigan sa Grafana data directory (/var/grafana/plugins/ /dist/module.js) ug mahimong ikarga isip SystemJS module. Usab sa kini nga direktoryo kinahanglan adunay usa ka plugin.json file nga adunay tanan nga meta impormasyon bahin sa imong plugin: ngalan, bersyon, tipo sa plugin, mga link sa repositoryo / site / lisensya, dependency, ug uban pa.

Pag-uswag sa usa ka plugin alang sa Grafana: usa ka kasaysayan sa dagkong mga shot
module.ts

Pag-uswag sa usa ka plugin alang sa Grafana: usa ka kasaysayan sa dagkong mga shot
plugin.json

Sama sa imong makita sa screenshot, among gipiho ang plugin.type = app. Tungod kay ang mga plugins alang sa Grafana mahimong adunay tulo ka klase:

panel: ang labing komon nga matang sa plugin - kini mao ang usa ka panel alang sa paghanduraw sa bisan unsa nga metrics, gigamit sa pagtukod sa lain-laing mga dashboard.
tinubdan sa datos: plugin connector sa pipila ka tinubdan sa datos (pananglitan, Prometheus-datasource, ClickHouse-datasource, ElasticSearch-datasource).
app: Usa ka plugin nga nagtugot kanimo sa paghimo sa imong kaugalingon nga frontend nga aplikasyon sa sulod sa Grafana, paghimo sa imong kaugalingon nga html nga mga panid ug mano-mano nga pag-access sa tinubdan sa datos aron mahanduraw ang lainlaing datos. Usab, ang mga plugins sa ubang mga matang (datasource, panel) ug lain-laing mga dashboard mahimong gamiton isip mga dependency.

Pag-uswag sa usa ka plugin alang sa Grafana: usa ka kasaysayan sa dagkong mga shot
Pananglitan nga mga dependency sa plugin nga adunay type=app.

Mahimo nimong gamiton ang JavaScript ug TypeScript isip usa ka programming language (gipili namo kini). Mga pagpangandam alang sa hello-world nga mga plugin sa bisan unsang matang nga mahimo nimo pangitaa ang link: kini nga repository adunay daghang gidaghanon sa mga starter-pack (adunay bisan usa ka eksperimento nga pananglitan sa usa ka plugin sa React) nga adunay pre-installed ug configured builders.

Bahin 2: pag-andam sa lokal nga palibot

Aron magtrabaho sa plugin, natural nga kinahanglan namon ang usa ka kubernetes cluster nga adunay tanan nga na-preinstall nga mga himan: prometheus, node-exporter, kube-state-metrics, grafana. Ang palibot kinahanglan nga ipahimutang dayon, dali ug natural, ug aron masiguro ang init nga pag-reload, ang direktoryo sa datos sa Grafana kinahanglan nga direkta nga i-mount gikan sa makina sa developer.

Ang labing kombenyente nga paagi, sa among opinyon, aron magtrabaho sa lokal sa mga kubernetes mao ang minikube. Ang sunod nga lakang mao ang pag-install sa Prometheus + Grafana nga kombinasyon gamit ang prometheus-operator. SA niini nga artikulo Ang proseso sa pag-instalar sa prometheus-operator sa minikube gihulagway sa detalye. Aron mahimo ang pagpadayon, kinahanglan nimo nga itakda ang parameter pagpadayon: tinuod sa charts/grafana/values.yaml file, idugang ang imong kaugalingong PV ug PVC ug ipiho kini sa persistence.existingClaim parameter

Ang among katapusang minikube launch script ingon niini:

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

Bahin 3: aktuwal nga kalamboan

Modelo sa butang

Sa pag-andam sa pagpatuman sa plugin, nakahukom kami nga ihulagway ang tanan nga mga batakang Kubernetes entity nga among buhaton sa porma sa TypeScript nga mga klase: pod, deployment, daemonset, statefulset, trabaho, cronjob, serbisyo, node, namespace. Ang matag usa niini nga mga klase nakapanunod gikan sa komon nga BaseModel nga klase, nga naghulagway sa constructor, destructor, mga pamaagi sa pag-update ug pagbalhin sa visibility. Ang matag usa sa mga klase naghulagway sa mga nested nga relasyon sa ubang mga entidad, pananglitan, usa ka lista sa mga pod alang sa usa ka entidad nga tipo nga deployment.

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

Uban sa tabang sa mga getter ug setter, mahimo natong ipakita o itakda ang mga sukatan sa entidad nga atong gikinahanglan sa usa ka kombenyente ug mabasa nga porma. Pananglitan, ang gi-format nga output sa mga igahin nga cpu node:

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

panid

Usa ka lista sa tanan namong mga panid sa plugin ang una nga gihulagway sa among pluing.json sa seksyon sa dependencies:

Pag-uswag sa usa ka plugin alang sa Grafana: usa ka kasaysayan sa dagkong mga shot

Sa block sa matag panid kinahanglan namong ipakita ang PAGE NAME (kini makombertir sa usa ka slug diin kini nga panid mahimong ma-access); ang ngalan sa component nga responsable sa operasyon niini nga panid (ang listahan sa mga component gi-eksport sa module.ts); nga nagpaila sa tahas sa tiggamit nga magamit sa kini nga panid ug mga setting sa nabigasyon alang sa sidebar.

Sa sangkap nga responsable sa pag-opera sa panid, kinahanglan namon nga itakda ang templateUrl, nga gipasa didto ang agianan sa html file nga adunay markup. Sa sulod sa controller, pinaagi sa dependency injection, maka-access kami sa 2 ka importante nga angular nga serbisyo:

  • backendSrv - usa ka serbisyo nga naghatag interaksyon sa Grafana API server;
  • datasourceSrv - usa ka serbisyo nga naghatag ug lokal nga interaksyon sa tanang mga tinubdan sa datos nga na-install sa imong Grafana (pananglitan, ang .getAll() nga pamaagi - nagbalik ug listahan sa tanang na-install nga datasources; .get( ) - nagbalik sa usa ka pananglitan nga butang sa usa ka piho nga tinubdan sa datos.

Pag-uswag sa usa ka plugin alang sa Grafana: usa ka kasaysayan sa dagkong mga shot

Pag-uswag sa usa ka plugin alang sa Grafana: usa ka kasaysayan sa dagkong mga shot

Pag-uswag sa usa ka plugin alang sa Grafana: usa ka kasaysayan sa dagkong mga shot

Bahin 4: tinubdan sa datos

Gikan sa punto sa pagtan-aw ni Grafana, ang datasource parehas ra nga plugin sa tanan nga uban pa: kini adunay kaugalingon nga entry point module.js, adunay file nga adunay meta information plugin.json. Kung nag-develop ug usa ka plugin nga adunay type = app, mahimo kaming makig-uban sa parehas nga mga gigikanan sa datos (pananglitan, prometheus-datasource) ug sa among kaugalingon, nga mahimo namon nga itago direkta sa direktoryo sa plugin (dist / datasource / *) o i-install ingon usa ka dependency. Sa among kaso, ang datasource nag-uban sa plugin code. Kinahanglan usab nga adunay config.html template ug usa ka ConfigCtrl controller, nga gamiton alang sa datasource instance configuration page ug ang Datasource controller, nga nagpatuman sa logic sa imong datasource.

Sa KubeGraf plugin, gikan sa user interface point of view, ang datasource usa ka pananglitan sa kubernetes cluster nga nagpatuman sa mosunod nga mga kapabilidad (source code anaa link):

  • pagkolekta sa datos gikan sa k8s api-server (pagkuha ug lista sa mga namespace, deployment...)
  • proxying nga mga hangyo sa prometheus-datasource (nga gipili sa mga setting sa plugin alang sa matag piho nga cluster) ug pag-format sa mga tubag aron magamit ang datos sa mga static nga panid ug sa mga dashboard.
  • pag-update sa datos sa static nga mga panid sa plugin (nga adunay gitakda nga refresh rate).
  • pagproseso sa mga pangutana aron makamugna og template sheet sa grafana-dashboards (metriFindQuery() method)

Pag-uswag sa usa ka plugin alang sa Grafana: usa ka kasaysayan sa dagkong mga shot

Pag-uswag sa usa ka plugin alang sa Grafana: usa ka kasaysayan sa dagkong mga shot

Pag-uswag sa usa ka plugin alang sa Grafana: usa ka kasaysayan sa dagkong mga shot

  • pagsulay sa koneksyon sa katapusan nga k8s cluster.
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"};
       })
}

Ang usa ka lahi nga makapaikag nga punto, sa among opinyon, mao ang pagpatuman sa usa ka mekanismo sa pag-authenticate ug pagtugot alang sa gigikanan sa datos. Kasagaran, gawas sa kahon, mahimo namong gamiton ang built-in nga Grafana component datasourceHttpSettings aron ma-configure ang pag-access sa katapusang tinubdan sa datos. Gamit kini nga component, mahimo natong i-configure ang pag-access sa http nga tinubdan sa datos pinaagi sa pagpiho sa url ug mga batakang authentication/authorization settings: login-password, o client-cert/client-key. Aron mapatuman ang abilidad sa pag-configure sa pag-access gamit ang usa ka tigdala nga token (ang de facto nga sumbanan alang sa k8s), kinahanglan namong buhaton ang gamay nga tweaking.

Aron masulbad kini nga problema, mahimo nimong gamiton ang built-in nga Grafana "Mga Ruta sa Plugin" (dugang mga detalye sa opisyal nga dokumentasyon nga panid). Sa mga setting sa among datasource, makadeklarar kami og set sa mga lagda sa pag-ruta nga iproseso sa grafana proxy server. Pananglitan, alang sa matag indibidwal nga endpoint posible nga magbutang og mga ulohan o mga url nga adunay posibilidad sa pag-templat, ang datos nga makuha gikan sa jsonData ug secureJsonData nga mga natad (alang sa pagtipig sa mga password o mga token sa encrypted nga porma). Sa among pananglitan, mga pangutana sama sa /__proxy/api/v1/namespaces i-proxy sa url sa porma
/api/v8/namespaces nga adunay Authorization: Bearer header.

Pag-uswag sa usa ka plugin alang sa Grafana: usa ka kasaysayan sa dagkong mga shot

Pag-uswag sa usa ka plugin alang sa Grafana: usa ka kasaysayan sa dagkong mga shot

Natural, aron magtrabaho kauban ang k8s api server kinahanglan namon ang usa ka tiggamit nga adunay readonly nga pag-access, mga pagpakita alang sa paghimo nga mahimo usab nimo makit-an sa source code sa plugin.

Bahin 5: pagpagawas

Pag-uswag sa usa ka plugin alang sa Grafana: usa ka kasaysayan sa dagkong mga shot

Kung nasulat na nimo ang imong kaugalingon nga Grafana plugin, natural nga gusto nimo nga magamit kini sa publiko. Sa Grafana kini usa ka librarya sa mga plugins nga magamit dinhi grafana.com/grafana/plugins

Aron magamit ang imong plugin sa opisyal nga tindahan, kinahanglan nimo nga maghimo usa ka PR sa kini nga tipigananpinaagi sa pagdugang sa sulod nga sama niini sa repo.json file:

Pag-uswag sa usa ka plugin alang sa Grafana: usa ka kasaysayan sa dagkong mga shot

diin ang bersyon mao ang bersyon sa imong plugin, ang url usa ka link sa repository, ug ang commit mao ang hash sa commit diin ang usa ka piho nga bersyon sa plugin mahimong magamit.

Ug sa output imong makita ang usa ka nindot nga hulagway sama sa:

Pag-uswag sa usa ka plugin alang sa Grafana: usa ka kasaysayan sa dagkong mga shot

Ang datos alang niini awtomatiko nga makuha gikan sa imong Readme.md, Changelog.md ug ang plugin.json file nga adunay deskripsyon sa plugin.

Bahin 6: imbes nga mga konklusyon

Wala kami mohunong sa pagpalambo sa among plugin human sa pagpagawas. Ug karon nagtrabaho kami sa husto nga pag-monitor sa paggamit sa mga kahinguhaan sa mga cluster node, pagpaila sa mga bag-ong bahin aron mapaayo ang UX, ug usab pag-rake sa daghang mga feedback nga nadawat pagkahuman ma-install ang plugin sa among mga kliyente ug gikan sa mga tawo sa GitHub (kung mobiya ka. imong issue or pull request, I will be very happy :)

Kami nanghinaut nga kini nga artikulo makatabang kanimo nga masabtan ang usa ka talagsaon nga himan sama sa Grafana ug, tingali, pagsulat sa imong kaugalingong plugin.

Salamat!)

Source: www.habr.com

Idugang sa usa ka comment