Progressio plugin pro Grafana: historia magni ictus

Hi omnes! Paucis abhinc mensibus, novum consilium apertum in productione - plugin Grafana kubernetes vigilantes, quam appellavimus, nostrum inmisimus. DevOpsProdigy KubeGraf. Plugin source code is available at repositio publica in GitHub. Et in hoc articulo fabulam vobiscum communicare volumus quomodo plugin creavimus, quae instrumenta usi sumus et quae scandala in processu evolutionis invenimus. Abeamus!

Pars 0 - introductorium: quomodo ad hoc pervenimus?

Idea scribendarum nostrarum plugin pro Grafan nobis admodum fortuito venit. Societas nostra interretialem incepta variarum complexionis gradus plus quam X annos fuit. Hoc tempore magnam vim peritia, causarum iucundarum, et experientiam in variis systematibus vigilantiae utendi. Et aliquando nosmetipsos interrogavimus: β€œEstne instrumentum magiae Kubernetes vigilantiae, ut, ut aiunt, β€œpone et obliviscere”? Prometheus + Grafana complexio. Et cum solutiones ad hunc acervum paratae factae sunt, magna copia instrumentorum varii generis est: operarius prometheus, copia kubernetes-mixin dashboards, grafana-kubernetes-app.

Grafana-kubernetes-app plugin nobis optimae optionis esse videbantur, sed non plus quam per annum sustentata est, et praeterea laborare non potest novis versionibus nodi exportatorii et kube-statis-metricis. Et aliquando decrevimus: "Nonne nostrum consilium facimus?"

Quae notiones constituimus efficere in plugin nostro:

  • visualisatio per "applicationem tabulae": apta propositio applicationum in botro, spatiis spatiis distinctis, instruere ....;
  • visualisation of connections like "instruere - service (+ports)".
  • visualizationis distributionis applicationum botri per nodos botri.
  • collectio metrica et notitia ex pluribus auctoribus : Prometheus et k8s api cultor.
  • vigilantia utriusque partis infrastructurae (usus temporis CPU, memoriae, orbis subsystem, retis) ac applicationis logicae - status sanitatis siliquae, quot replicationes in promptu, informationes de vitatione transeunte/paratu probat.

Pars 1: Quid est "Grafana plugin"?

Ex parte technica, plugin pro Grafana moderatoris angularis est, quod in Grafana notitiae directorium reponitur (/var/grafana/plugins/ /dist/module.js) et ut moduli SystemJS onerari potest. Etiam in hoc indice debet esse plugin.json fasciculus continens omnia meta informationis de tuo plugin: nomen, versio, genus plugin, nexus repositorio/site/licentiae, clientelas et cetera.

Progressio plugin pro Grafana: historia magni ictus
module.ts

Progressio plugin pro Grafana: historia magni ictus
plugin.json

Ut videre potes in screenshot, plugin.type = app. Quia plugins in Grafana trium generum esse potest:

Panel: genus plugin frequentissimum - tabula est pro quavis metrica visualisandi, variis dashboards construendis adhibita.
datasource: plugin iungo ad fontem aliquem datae (exempli gratia Prometheus-datasource, ClickHouse-datasource, ElasticSearch-datasource).
App: Pluginum quod sinit te in Grafana applicatione ante-finem tuam aedificare, tua HTML pagina crea et manually datas res ad varias notitias visualizandas accedere. Item, plugins aliarum generum (datasource, tabula) et variae dashboards pro clientelam adhiberi possunt.

Progressio plugin pro Grafana: historia magni ictus
Exemplum plugin clientelas cum type = app.

Tum JavaScript et TypeScript uti potes ut lingua programmandi (delegimus). Praeparationes ad salve-mundum plugins cuiuslibet generis potes invenire nexum: hoc repositum magnum numerum sarcinarum startertarum continet (est etiam experimentale exemplum plugin in React) cum aedificatoribus praestructis et figuratis.

Pars II: parans loci ambitus

Ad opus in plugin naturaliter kubernetes botrum cum omnibus instrumentis praeordinatis egent: prometheus, exportator nodi, metricus kube-statuticus, grafana. Ambituum cito, facile et naturaliter constituendum est, et ut calidum reload curet, Grafana directorium notitia directo e machina elit conscendatur.

Commodissimum est, in nostra sententia, localiter laborare cum kubernetes minikube. Proximum est Prometheum + Grafana compositum utens operante prometheo. IN' hoc Commentarium Processus institutionis promethei operantis in minikube fuse describitur. Ut pertinacia, modulum appone oportet pertinacia: verum in chartis/grafana/values.yaml fasciculum, tuum PV et PVC adde et in perseverantia.existingClaim parametri definias.

Nostrae litterae finalis minikube Lorem scriptum hoc spectat:

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

Pars III, ipsa progressio

Object Model

In praeparatione ad plugin exsequendam, omnia fundamentalia Kubernetes entitates fundamentales describere decrevimus quae in forma TypeScript classes operabimus: vasculum, instruere, daemonset, statefulset, officium, cronjob, ministerium, nodi, spatii nominandi. Singulae hae classes a communi BaseModel genere, quod fabricator, destructor, methodos ad augendae et mutandi visibilitatem describit. Singulae classes relationes nestas cum aliis entibus describit, exempli gratia, siliquarum index pro entitate generis instruere.

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

Auxiliantibus getters et peregrinis entitatem metricam quam oportet apta et lecta forma ostendere vel exponere possumus. Exempli gratia formatae output of nodi CPU allocabilium;

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

pages

Index omnium paginarum plugin nostrarum initio in pluing.json descriptus est in sectione dependentiarum:

Progressio plugin pro Grafana: historia magni ictus

In singulis paginis stipitem PAGE NOMINE indicandum est (in limacem convertetur quo haec pagina pervia erit); nomen componentis operationis huius paginae (indicem componentium ad moduli.ts exportatum); ostendens munus usoris ad quod opus cum hac pagina praesto est et occasus navigationis pro sidebar.

In componentibus responsalis operationis paginae, templateUrl ponemus, ibi transitum ad html lima cum markup. Intra moderatorem, per iniectionem dependentiam, accedere possumus ad officia angularis magni momenti:

  • backendSrv β€” officium, quod cum Grafana API servo commercium praebet;
  • datasourceSrv - officium, quod commercium locale cum omnibus datorum datorum in Grafana institutis (exempli gratia modum .getAll() praebet - indicem refert omnium notitiarum inauguratarum;.get( ) - redit instantia obiecti specifica notitiasource.

Progressio plugin pro Grafana: historia magni ictus

Progressio plugin pro Grafana: historia magni ictus

Progressio plugin pro Grafana: historia magni ictus

Pars IV: data fons

Ex Grafana sententia, datas fons prorsus idem est plugin ac ceteri omnes: suum aculeum moduli habet.js, fasciculus cum meta indicio est plugin.json. Cum plugin typum = app enucleans, inter se agere possumus cum datasources utriusque existentibus (exempli gratia prometheus-datasource) et nostra, quod in directorio plugin (dist/datasource/*) directe condere vel depen- dere possumus. In nostro casu, datasource venit cum codice plugin. Necesse est etiam habere config.html templates et ConfigCtrl moderatoris, qui adhibebitur ad exemplum figurae paginae et datasource moderatoris, quae logicam datorum tuorum operantem exercet.

In plugin KubeGraf, ex parte interfaciei usoris, datasource exemplum est botri kubernetes qui sequentes facultates instrumenti (source codice praesto est. Link):

  • colligendis notitias ex k8s api-servo (isto indice spatiorum, instruere...)
  • petitiones prometheo-datasources proxendi (quae in uncinis plugin pro singulis speciebus botri seliguntur) et responsiones formatting utendi notitias tam in paginis static quam in dashboards.
  • adaequationis notitia in paginas static plugin (cum a paro refresh rate).
  • dispensando queries generare exemplum template in grafana-dashboards (metriFindQuery() methodo)

Progressio plugin pro Grafana: historia magni ictus

Progressio plugin pro Grafana: historia magni ictus

Progressio plugin pro Grafana: historia magni ictus

  • nexum test cum ultima k8s botrum portassent.
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"};
       })
}

Separatum interest, in opinione nostra, exsecutionem authenticae et auctoritatis mechanismi pro datas. Typice ex archa uti possumus constructum in Grafana componente datasourceHttpSettings ad configurandum accessum ad fontem finalem datae. Hoc componente utentes, accessum ad http datam fontem configurare possumus, url ac fundamentales authenticas/auctorationis occasus denotans: login-password, vel client-cert/clientem-clavem. Ad efficiendum facultatem accessum configurandi utendi signiferum indicium (de facto vexillum pro k8s), paulo tweaking facere debebamus.

Ad hanc solvendam quaestionem, constructo in Grafana "Plugin Itineribus" mechanismum uti potes (details at. officialis documenta pagina). In uncinis notitiae nostrae positis, declarare possumus praecepta evitandi praecepta quae a grafana ineundo ministrabuntur. Exempli gratia, pro singulis terminis potest capita vel URLs ponere cum possibilitate templandi, data pro quibus sumi potest ex agris jsonDatis et secure JsonDatis (ad deponendas passwords vel signa in forma encrypted). In exemplo nostro, queries similia /__proxy/api/v1/nominum spatia erit proxi- mus per formam
/api/v8/nomina LICENTIA: Vexillum header.

Progressio plugin pro Grafana: historia magni ictus

Progressio plugin pro Grafana: historia magni ictus

Naturaliter ad operandum cum servo api k8s usorem prompto accessu opus est, manifestat ad creandum quem etiam invenire potes. plugin source code.

Pars V: release

Progressio plugin pro Grafana: historia magni ictus

Plugin Grafana tua olim scripseras, naturaliter vis ut promptum publice facias. In Grafana haec bibliotheca plugins hic praesto est grafana.com/grafana/plugins

Ut plugin tuum in promptu officiali praesto sint, debes facere PR in hoc repositioaddendo content sicut hoc ad lima repo.json:

Progressio plugin pro Grafana: historia magni ictus

ubi versio est versio plugin tui, url nexus repositorium est, et committe est detrahere commissi pro quo certa versio plugin praesto erit.

Et in output videbis imaginem mirabilem similem;

Progressio plugin pro Grafana: historia magni ictus

Data sponte adprehensa erit ex Readme.md, Changelog.md et tabula plugin.json cum descriptione plugin.

Pars VI, pro conclusionibus

Non destitimus plugin nostrum post emissionem evolvere. Nunc autem recte vigilantia usu facultatum nodis botri laboramus, novas notas ad UX emendandas inducentes, ac etiam in magna opinionerum copia corridentes, insertis plugin tam a nostris clientibus quam ab hominibus GitHub (si exeatis. tui exitus seu petitionem viverra, ego laetus ero :)

Speramus hunc articulum adiuvaturum te tam mirificum instrumentum ut Grafana intelligas et fortasse plugin tuum scribes.

Gratias tibi!)

Source: www.habr.com