Hi omnes! Paucis abhinc mensibus, novum consilium apertum in productione - plugin Grafana kubernetes vigilantes, quam appellavimus, nostrum inmisimus.
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.
module.ts
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.
Exemplum plugin clientelas cum type = app.
Tum JavaScript et TypeScript uti potes ut lingua programmandi (delegimus). Praeparationes ad salve-mundum plugins cuiuslibet generis potes
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
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:
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.
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.
- 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)
- 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.
/api/v8/nomina LICENTIA: Vexillum header.
Naturaliter ad operandum cum servo api k8s usorem prompto accessu opus est, manifestat ad creandum quem etiam invenire potes.
Pars V: release
Plugin Grafana tua olim scripseras, naturaliter vis ut promptum publice facias. In Grafana haec bibliotheca plugins hic praesto est
Ut plugin tuum in promptu officiali praesto sint, debes facere PR in
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;
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