Idagbasoke ohun itanna kan fun Grafana: itan ti awọn iyaworan nla

Bawo ni gbogbo eniyan! Ni oṣu diẹ sẹhin, a ṣe ifilọlẹ iṣẹ orisun ṣiṣi tuntun wa sinu iṣelọpọ - ohun itanna Grafana fun abojuto kubernetes, eyiti a pe DevOpsProdigy KubeGraf. Awọn koodu orisun itanna wa ni ibi ipamọ ti gbogbo eniyan lori GitHub. Ati ninu nkan yii a fẹ lati pin pẹlu rẹ itan ti bii a ṣe ṣẹda ohun itanna naa, kini awọn irinṣẹ ti a lo ati iru awọn ipalara ti a pade lakoko ilana idagbasoke. Jeka lo!

Apakan 0 - ifihan: bawo ni a ṣe de aaye yii?

Ero lati kọ ohun itanna tiwa fun Grafan wa si wa lairotẹlẹ. Ile-iṣẹ wa ti n ṣe abojuto awọn iṣẹ akanṣe wẹẹbu ti awọn ipele pupọ ti idiju fun diẹ sii ju ọdun 10 lọ. Lakoko yii, a ti ṣajọpọ iye nla ti oye, awọn ọran ti o nifẹ, ati iriri ni lilo ọpọlọpọ awọn eto ibojuwo. Ati ni aaye kan a beere lọwọ ara wa: "Ṣe ohun elo idan kan wa fun mimojuto Kubernetes, nitorina, bi wọn ṣe sọ, "ṣeto rẹ ki o gbagbe rẹ"? Prometheus + Grafana apapo. Ati bi awọn solusan ti a ti ṣetan fun akopọ yii, ọpọlọpọ awọn iru irinṣẹ wa: prometheus-operator, ṣeto ti kubernetes-mixin dashboards, grafana-kubernetes-app.

Ohun itanna grafana-kubernetes-app dabi ẹnipe aṣayan ti o nifẹ julọ fun wa, ṣugbọn ko ṣe atilẹyin fun diẹ sii ju ọdun kan lọ ati, pẹlupẹlu, ko le ṣiṣẹ pẹlu awọn ẹya tuntun ti node-atporter ati kube-state-metrics. Ati ni aaye kan a pinnu: “Ṣe ko yẹ ki a ṣe ipinnu tiwa?”

Awọn imọran wo ni a pinnu lati ṣe ninu ohun itanna wa:

  • iworan ti “ maapu ohun elo ”: igbejade irọrun ti awọn ohun elo ninu iṣupọ, ti a ṣe akojọpọ nipasẹ awọn aaye orukọ, awọn imuṣiṣẹ…;
  • iworan ti awọn asopọ bi “imuṣiṣẹ - iṣẹ (+ awọn ibudo)”.
  • iworan ti pinpin awọn ohun elo iṣupọ kọja awọn apa iṣupọ.
  • ikojọpọ awọn metiriki ati alaye lati awọn orisun pupọ: Prometheus ati olupin api k8s.
  • Abojuto ti awọn mejeeji apakan amayederun (lilo akoko Sipiyu, iranti, eto disiki, nẹtiwọọki) ati ọgbọn ohun elo - awọn adarọ-ese ipo ilera, nọmba awọn ẹda ti o wa, alaye nipa gbigbe awọn idanwo igbesi aye / imurasilẹ.

Apá 1: Kí ni a "Grafana itanna"?

Lati oju iwoye imọ-ẹrọ, ohun itanna fun Grafana jẹ oluṣakoso angula, eyiti o wa ni ipamọ ninu itọsọna data Grafana (/var/grafana/awọn afikun/ /dist/module.js) ati ki o le wa ni ti kojọpọ bi SystemJS module. Paapaa ninu itọsọna yii yẹ ki o jẹ faili plugin.json ti o ni gbogbo alaye meta nipa ohun itanna rẹ: orukọ, ẹya, iru ohun itanna, awọn ọna asopọ si ibi ipamọ / aaye / iwe-aṣẹ, awọn igbẹkẹle, ati bẹbẹ lọ.

Idagbasoke ohun itanna kan fun Grafana: itan ti awọn iyaworan nla
module.ts

Idagbasoke ohun itanna kan fun Grafana: itan ti awọn iyaworan nla
itanna.json

Bi o ti le ri ninu sikirinifoto, a pato plugin.type = app. Nitori awọn afikun fun Grafana le jẹ ti awọn oriṣi mẹta:

panel: iru ohun itanna ti o wọpọ julọ - o jẹ nronu fun wiwo eyikeyi awọn metiriki, ti a lo lati kọ ọpọlọpọ awọn dasibodu.
orisun data: asopo ohun itanna si orisun data kan (fun apẹẹrẹ, Prometheus-datasource, ClickHouse-datasource, ElasticSearch-datasource).
app: Ohun itanna kan ti o fun ọ laaye lati kọ ohun elo iwaju ti tirẹ inu Grafana, ṣẹda awọn oju-iwe html tirẹ ki o wọle si orisun data pẹlu ọwọ lati wo ọpọlọpọ data. Paapaa, awọn afikun ti awọn iru miiran (orisun data, nronu) ati ọpọlọpọ awọn dasibodu le ṣee lo bi awọn igbẹkẹle.

Idagbasoke ohun itanna kan fun Grafana: itan ti awọn iyaworan nla
Apeere awọn igbẹkẹle itanna pẹlu iru=app.

O le lo mejeeji JavaScript ati TypeScript bi ede siseto (a yan rẹ). Awọn igbaradi fun awọn afikun-aye-aye ti eyikeyi iru ti o le ri ọna asopọ: ibi ipamọ yii ni nọmba nla ti awọn akopọ-ibẹrẹ (paapaa apẹẹrẹ esiperimenta ti ohun itanna kan ni React) pẹlu fifi sori ẹrọ tẹlẹ ati awọn akọle ti tunto.

Apá 2: ngbaradi agbegbe agbegbe

Lati ṣiṣẹ lori ohun itanna, nipa ti ara a nilo iṣupọ kubernetes pẹlu gbogbo awọn irinṣẹ ti a ti fi sii tẹlẹ: prometheus, node-atporter, kube-state-metrics, grafana. Ayika yẹ ki o ṣeto ni iyara, ni irọrun ati nipa ti ara, ati lati rii daju gbigbo gbona, itọsọna data Grafana yẹ ki o gbe taara lati inu ẹrọ olupilẹṣẹ.

Ọna ti o rọrun julọ, ninu ero wa, lati ṣiṣẹ ni agbegbe pẹlu kubernetes jẹ minikube. Igbesẹ ti o tẹle ni lati fi sori ẹrọ apapo Prometheus + Grafana nipa lilo prometheus-operator. IN Arokọ yi Ilana fifi sori ẹrọ prometheus-operator lori minikube jẹ apejuwe ni awọn alaye. Lati mu itẹramọṣẹ ṣiṣẹ, o gbọdọ ṣeto paramita naa itẹramọṣẹ: otitọ ninu faili shatti/grafana/values.yaml, ṣafikun PV tirẹ ati PVC ki o si pato wọn ni itẹramọṣẹ.existingClaim paramita

Iwe afọwọkọ ifilọlẹ minikube ikẹhin wa dabi eyi:

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

Apá 3: gangan idagbasoke

Awoṣe Nkan

Ni igbaradi fun imuse ohun itanna, a pinnu lati ṣapejuwe gbogbo awọn ile-iṣẹ Kubernetes ipilẹ ti a yoo ṣiṣẹ pẹlu irisi awọn kilasi TypeScript: pod, imuṣiṣẹ, daemonset, statefulset, iṣẹ, cronjob, iṣẹ, ipade, aaye orukọ. Ọkọọkan awọn kilasi wọnyi jogun lati kilasi BaseModel ti o wọpọ, eyiti o ṣapejuwe olupilẹṣẹ, apanirun, awọn ọna fun imudojuiwọn ati yiyi hihan. Ọkọọkan awọn kilasi n ṣapejuwe awọn ibatan itẹ-ẹiyẹ pẹlu awọn nkan miiran, fun apẹẹrẹ, atokọ ti awọn adarọ-ese fun nkan ti imuṣiṣẹ iru.

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

Pẹlu iranlọwọ ti awọn getters ati awọn oluṣeto, a le ṣafihan tabi ṣeto awọn metiriki nkan ti a nilo ni irọrun ati fọọmu kika. Fún àpẹrẹ, àgbékalẹ̀ àbájáde ti àwọn ìdìpọ̀ cpu tí a lè pín sí:

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

ojúewé

Atokọ ti gbogbo awọn oju-iwe itanna wa ni akọkọ ṣapejuwe ninu pluing.json wa ni apakan awọn igbẹkẹle:

Idagbasoke ohun itanna kan fun Grafana: itan ti awọn iyaworan nla

Ninu bulọki fun oju-iwe kọọkan a gbọdọ tọkasi ORUKO IWE (a yoo yipada si slug nipasẹ eyiti oju-iwe yii yoo wa); orukọ paati lodidi fun isẹ ti oju-iwe yii (akojọ awọn paati ti wa ni okeere si module.ts); nfihan ipa olumulo fun eyiti iṣẹ pẹlu oju-iwe yii wa ati awọn eto lilọ kiri fun ẹgbẹ ẹgbẹ.

Ninu paati ti o ni iduro fun iṣiṣẹ ti oju-iwe naa, a gbọdọ ṣeto templateUrl, gbigbe sibẹ ọna si faili html pẹlu isamisi. Ninu oludari, nipasẹ abẹrẹ igbẹkẹle, a le wọle si awọn iṣẹ igun pataki meji:

  • backendSrv - iṣẹ kan ti o pese ibaraenisepo pẹlu olupin API Grafana;
  • datasourceSrv - iṣẹ kan ti o pese ibaraenisepo agbegbe pẹlu gbogbo awọn orisun data ti a fi sori ẹrọ ni Grafana rẹ (fun apẹẹrẹ, ọna .getAll() - da akojọ gbogbo awọn orisun data ti a fi sori ẹrọ pada; .gba() ) - pada ohun apẹẹrẹ ti orisun data kan pato.

Idagbasoke ohun itanna kan fun Grafana: itan ti awọn iyaworan nla

Idagbasoke ohun itanna kan fun Grafana: itan ti awọn iyaworan nla

Idagbasoke ohun itanna kan fun Grafana: itan ti awọn iyaworan nla

Apá 4: data orisun

Lati oju wiwo Grafana, orisun data jẹ ohun itanna kanna gangan bi gbogbo awọn miiran: o ni aaye titẹsi tirẹ module.js, faili kan wa pẹlu alaye meta plugin.json. Nigbati o ba n ṣe agbekalẹ ohun itanna kan pẹlu iru = app, a le ṣe ajọṣepọ pẹlu awọn orisun data ti o wa tẹlẹ (fun apẹẹrẹ, prometheus-datasource) ati tiwa, eyiti a le fipamọ taara sinu itọsọna itanna (dist/datasource/*) tabi fi sii bi igbẹkẹle. Ninu ọran wa, orisun data wa pẹlu koodu itanna naa. O tun jẹ dandan lati ni awoṣe config.html kan ati oluṣakoso ConfigCtrl kan, eyiti yoo ṣee lo fun oju-iwe iṣeto orisun orisun data ati oluṣakoso orisun Data, eyiti o ṣe adaṣe ọgbọn ti orisun data rẹ.

Ninu ohun itanna KubeGraf, lati oju wiwo wiwo olumulo, orisun data jẹ apẹẹrẹ ti iṣupọ kubernetes ti o ṣe awọn agbara wọnyi (koodu orisun wa asopọ):

  • gbigba data lati k8s api-server (ngba atokọ ti awọn aaye orukọ, awọn imuṣiṣẹ…)
  • awọn ibeere proxying si orisun data prometheus (eyiti o yan ninu awọn eto itanna fun iṣupọ kan pato kọọkan) ati awọn idahun ọna kika lati lo data mejeeji ni awọn oju-iwe aimi ati ni awọn dasibodu.
  • n ṣe imudojuiwọn data lori awọn oju-iwe itanna aimi (pẹlu iwọn isọdọtun ti a ṣeto).
  • awọn ibeere ṣiṣe lati ṣe agbekalẹ iwe awoṣe kan ni grafana-dashboards (ọna metriFindQuery())

Idagbasoke ohun itanna kan fun Grafana: itan ti awọn iyaworan nla

Idagbasoke ohun itanna kan fun Grafana: itan ti awọn iyaworan nla

Idagbasoke ohun itanna kan fun Grafana: itan ti awọn iyaworan nla

  • igbeyewo asopọ pẹlu ik k8s iṣupọ.
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"};
       })
}

Ojuami iyanilenu lọtọ, ninu ero wa, jẹ imuse ti ijẹrisi ati ẹrọ aṣẹ fun orisun data. Ni deede, lati inu apoti, a le lo datasourceHttpEto paati Grafana ti a ṣe sinu lati tunto iraye si orisun data ikẹhin. Lilo paati yii, a le tunto iraye si orisun data http nipa sisọ url ati ipilẹ ijẹrisi/awọn eto igbanilaaye: ọrọ igbaniwọle-iwọle, tabi alabara-cert/bọtini alabara. Lati le ṣe imuse agbara lati tunto iwọle si nipa lilo ami-ami ti nrù (boṣewa de facto fun k8s), a ni lati ṣe tweaking kekere kan.

Lati yanju iṣoro yii, o le lo ẹrọ ti a ṣe sinu Grafana “Awọn ipa ọna itanna” (awọn alaye diẹ sii ni osise iwe iwe). Ninu awọn eto orisun orisun data wa, a le kede ṣeto awọn ofin ipa-ọna ti yoo ṣe ilana nipasẹ olupin aṣoju grafana. Fun apẹẹrẹ, fun aaye ipari kọọkan o ṣee ṣe lati ṣeto awọn akọle tabi awọn url pẹlu iṣeeṣe ti idanwo, data fun eyiti o le gba lati awọn aaye jsonData ati aaboJsonData (fun titoju awọn ọrọ igbaniwọle tabi awọn ami ni fọọmu fifi ẹnọ kọ nkan). Ninu apẹẹrẹ wa, awọn ibeere bii /__aṣoju/api/v1/awọn aaye orukọ yoo jẹ aṣoju si url ti fọọmu naa
/api/v8/namespaces pẹlu Aṣẹ: Akọsori Akọsori.

Idagbasoke ohun itanna kan fun Grafana: itan ti awọn iyaworan nla

Idagbasoke ohun itanna kan fun Grafana: itan ti awọn iyaworan nla

Nipa ti, lati ṣiṣẹ pẹlu olupin api k8s a nilo olumulo kan pẹlu iwọle kika nikan, ṣafihan fun ṣiṣẹda eyiti o tun le rii ninu itanna orisun koodu.

Apá 5: Tu

Idagbasoke ohun itanna kan fun Grafana: itan ti awọn iyaworan nla

Ni kete ti o ti kọ ohun itanna Grafana tirẹ, iwọ yoo fẹ nipa ti ara lati jẹ ki o wa ni gbangba. Ni Grafana eyi jẹ ile-ikawe ti awọn afikun ti o wa nibi grafana.com/grafana/plugins

Ni ibere fun ohun itanna rẹ lati wa lori ile itaja osise, o nilo lati ṣe PR kan ninu ibi ipamọ yiinipa fifi akoonu bii eyi kun faili repo.json:

Idagbasoke ohun itanna kan fun Grafana: itan ti awọn iyaworan nla

nibiti ikede jẹ ẹya ti ohun itanna rẹ, url jẹ ọna asopọ si ibi ipamọ, ati ṣe ni hash ti ifaramọ eyiti ẹya kan pato ti ohun itanna yoo wa.

Ati ni iṣelọpọ iwọ yoo rii aworan iyanu bi:

Idagbasoke ohun itanna kan fun Grafana: itan ti awọn iyaworan nla

Awọn data fun o yoo wa ni laifọwọyi dimu lati rẹ Readme.md, Changelog.md ati plugin.json faili pẹlu awọn ohun itanna apejuwe.

Apá 6: dipo awọn ipari

A ko dẹkun idagbasoke ohun itanna wa lẹhin itusilẹ. Ati ni bayi a n ṣiṣẹ ni abojuto ni deede lilo awọn orisun ti awọn apa iṣupọ, ṣafihan awọn ẹya tuntun lati mu ilọsiwaju UX, ati tun raking ni iye nla ti awọn esi ti o gba lẹhin fifi sori ẹrọ itanna mejeeji nipasẹ awọn alabara wa ati lati ọdọ eniyan lori GitHub (ti o ba lọ kuro Ọrọ rẹ tabi ibeere fa, Emi yoo dun pupọ :)

A nireti pe nkan yii yoo ran ọ lọwọ lati loye iru irinṣẹ iyanu bi Grafana ati, boya, kọ ohun itanna tirẹ.

E dupe!)

orisun: www.habr.com

Fi ọrọìwòye kun