Maendeleo ya programu-jalizi ya Grafana: historia ya picha kubwa

Salaam wote! Miezi michache iliyopita, tulizindua mradi wetu mpya wa chanzo huria katika uzalishaji - programu-jalizi ya Grafana ya ufuatiliaji wa kubernetes, tuliyoiita. DevOpsProdigy KubeGraf. Msimbo wa chanzo cha programu-jalizi unapatikana hazina ya umma kwenye GitHub. Na katika makala hii tunataka kushiriki nawe hadithi ya jinsi tulivyounda programu-jalizi, ni zana gani tulizotumia na ni mitego gani tuliyokutana nayo wakati wa mchakato wa ukuzaji. Twende!

Sehemu ya 0 - utangulizi: tulifikiaje hatua hii?

Wazo la kuandika programu-jalizi yetu wenyewe kwa Grafan lilikuja kwetu kwa bahati mbaya. Kampuni yetu imekuwa ikifuatilia miradi ya wavuti ya viwango tofauti vya ugumu kwa zaidi ya miaka 10. Wakati huu, tumekusanya kiasi kikubwa cha ujuzi, matukio ya kuvutia, na uzoefu katika kutumia mifumo mbalimbali ya ufuatiliaji. Na wakati fulani tulijiuliza: "Je, kuna chombo cha uchawi cha kufuatilia Kubernetes, ili, kama wanasema, "kuiweka na kuisahau"?" .. Kiwango cha sekta ya ufuatiliaji k8s, bila shaka, kwa muda mrefu imekuwa Mchanganyiko wa Prometheus + Grafana. Na kama suluhu zilizotengenezwa tayari kwa rafu hii, kuna seti kubwa ya aina mbalimbali za zana: prometheus-operator, seti ya dashibodi za kubernetes-mixin, programu ya grafana-kubernetes.

Programu-jalizi ya grafana-kubernetes-programu ilionekana kuwa chaguo la kuvutia zaidi kwetu, lakini haijaauniwa kwa zaidi ya mwaka mmoja na, zaidi ya hayo, haiwezi kufanya kazi na matoleo mapya ya node-exporter na kube-state-metrics. Na wakati fulani tuliamua: "Je, hatupaswi kufanya uamuzi wetu wenyewe?"

Ni maoni gani tuliamua kutekeleza kwenye programu-jalizi yetu:

  • taswira ya "ramani ya maombi": uwasilishaji unaofaa wa programu katika nguzo, iliyopangwa kwa nafasi za majina, kupelekwa...;
  • taswira ya miunganisho kama "kupeleka - huduma (+bandari)".
  • taswira ya usambazaji wa programu za nguzo kwenye nodi za nguzo.
  • ukusanyaji wa vipimo na taarifa kutoka vyanzo kadhaa: Prometheus na seva ya k8s api.
  • ufuatiliaji wa sehemu zote mbili za miundombinu (matumizi ya muda wa CPU, kumbukumbu, mfumo mdogo wa diski, mtandao) na mantiki ya programu - maganda ya hali ya afya, idadi ya nakala zinazopatikana, taarifa kuhusu kufaulu majaribio ya uhai/utayari.

Sehemu ya 1: "Plugin ya Grafana" ni nini?

Kwa mtazamo wa kiufundi, programu-jalizi ya Grafana ni kidhibiti cha angular, ambacho kimehifadhiwa kwenye saraka ya data ya Grafana (/var/grafana/plugins/ /dist/module.js) na inaweza kupakiwa kama moduli ya SystemJS. Pia katika saraka hii kunapaswa kuwa na faili ya plugin.json iliyo na taarifa zote za meta kuhusu programu-jalizi yako: jina, toleo, aina ya programu-jalizi, viungo vya hifadhi/tovuti/leseni, vitegemezi, na kadhalika.

Maendeleo ya programu-jalizi ya Grafana: historia ya picha kubwa
moduli.ts

Maendeleo ya programu-jalizi ya Grafana: historia ya picha kubwa
plugin.json

Kama unavyoona kwenye picha ya skrini, tulibainisha plugin.type = programu. Kwa sababu programu-jalizi za Grafana zinaweza kuwa za aina tatu:

jopo: aina ya kawaida ya programu-jalizi - ni paneli ya kuibua metriki yoyote, inayotumiwa kuunda dashibodi mbalimbali.
chanzo cha data: kiunganishi cha programu-jalizi kwa baadhi ya chanzo cha data (kwa mfano, Prometheus-datasource, ClickHouse-datasource, ElasticSearch-datasource).
programu: Programu-jalizi inayokuruhusu kuunda programu yako ya mbele ndani ya Grafana, unda kurasa zako za html na ufikie mwenyewe chanzo cha data ili kuibua data mbalimbali. Pia, programu-jalizi za aina nyingine (chanzo cha data, paneli) na dashibodi mbalimbali zinaweza kutumika kama vitegemezi.

Maendeleo ya programu-jalizi ya Grafana: historia ya picha kubwa
Mfano utegemezi wa programu-jalizi na type=app.

Unaweza kutumia JavaScript na TypeScript kama lugha ya programu (tuliichagua). Maandalizi ya programu jalizi za ulimwengu wa hello za aina yoyote unayoweza tafuta kiungo: hazina hii ina idadi kubwa ya vifurushi vya kuanza (kuna hata mfano wa majaribio wa programu-jalizi katika React) iliyo na wajenzi waliosakinishwa awali na kusanidiwa.

Sehemu ya 2: kuandaa mazingira ya ndani

Ili kufanya kazi kwenye programu-jalizi, kwa kawaida tunahitaji kundi la kubernetes lenye zana zote zilizosakinishwa awali: prometheus, nodi-exporter, kube-state-metrics, grafana. Mazingira yanapaswa kusanidiwa haraka, kwa urahisi na kawaida, na ili kuhakikisha kupakia upya, saraka ya data ya Grafana inapaswa kupachikwa moja kwa moja kutoka kwa mashine ya msanidi.

Njia rahisi zaidi, kwa maoni yetu, kufanya kazi ndani ya nchi na kubernetes ni minikube. Hatua inayofuata ni kufunga mchanganyiko wa Prometheus + Grafana kwa kutumia prometheus-operator. KATIKA Makala hii Mchakato wa kusanidi prometheus-operator kwenye minikube umeelezewa kwa undani. Ili kuwezesha kuendelea, lazima uweke parameter kuendelea: kweli katika chati/grafana/values.yaml faili, ongeza PV yako na PVC na uzibainishe katika kigezo cha persistence.existingClaim.

Hati yetu ya mwisho ya uzinduzi wa minikube inaonekana kama hii:

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

Sehemu ya 3: Maendeleo halisi

Mfano wa kitu

Katika maandalizi ya kutekeleza programu-jalizi, tuliamua kuelezea huluki zote za msingi za Kubernetes ambazo tutafanya kazi nazo katika mfumo wa madarasa ya TypeScript: ganda, uwekaji, daemoset, statefulset, kazi, cronjob, huduma, nodi, nafasi ya majina. Kila moja ya madarasa haya hurithi kutoka kwa darasa la kawaida la BaseModel, ambalo linaelezea mjenzi, mharibifu, mbinu za kusasisha na kubadili mwonekano. Kila moja ya madarasa inaelezea uhusiano uliowekwa na vyombo vingine, kwa mfano, orodha ya maganda ya chombo cha aina ya uwekaji.

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

Kwa usaidizi wa geti na seti, tunaweza kuonyesha au kuweka vipimo vya huluki tunachohitaji kwa njia rahisi na inayoweza kusomeka. Kwa mfano, matokeo yaliyoumbizwa ya nodi za cpu zinazoweza kugawiwa:

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

kuhusiana

Orodha ya kurasa zetu zote za programu-jalizi imeelezewa awali katika pluing.json yetu katika sehemu ya utegemezi:

Maendeleo ya programu-jalizi ya Grafana: historia ya picha kubwa

Katika kizuizi kwa kila ukurasa lazima tuonyeshe PAGE NAME (kisha itabadilishwa kuwa koa ambayo ukurasa huu utaweza kufikiwa); jina la sehemu inayohusika na uendeshaji wa ukurasa huu (orodha ya vipengele inasafirishwa kwa module.ts); ikionyesha jukumu la mtumiaji ambalo kazi yake na ukurasa huu inapatikana na mipangilio ya kusogeza ya utepe.

Katika sehemu inayohusika na uendeshaji wa ukurasa, lazima tuweke templateUrl, tukipitisha hapo njia ya faili ya html na markup. Ndani ya kidhibiti, kupitia sindano ya utegemezi, tunaweza kufikia hadi huduma 2 muhimu za angular:

  • backendSrv - huduma ambayo hutoa mwingiliano na seva ya API ya Grafana;
  • datasourceSrv - huduma ambayo hutoa mwingiliano wa ndani na vyanzo vyote vya data vilivyosakinishwa kwenye Grafana yako (kwa mfano, mbinu ya .getAll() - hurejesha orodha ya vyanzo vyote vya data vilivyosakinishwa; .get( ) - inarudisha kitu cha mfano cha chanzo maalum cha data.

Maendeleo ya programu-jalizi ya Grafana: historia ya picha kubwa

Maendeleo ya programu-jalizi ya Grafana: historia ya picha kubwa

Maendeleo ya programu-jalizi ya Grafana: historia ya picha kubwa

Sehemu ya 4: Chanzo cha data

Kwa mtazamo wa Grafana, chanzo cha data ni programu-jalizi sawa kabisa na zingine zote: ina sehemu yake ya kuingilia module.js, kuna faili iliyo na habari ya meta plugin.json. Tunapotengeneza programu-jalizi yenye type = app, tunaweza kuingiliana na vyanzo vyote viwili vya data vilivyopo (kwa mfano, prometheus-datasource) na zetu, ambazo tunaweza kuhifadhi moja kwa moja kwenye saraka ya programu-jalizi (dist/datasource/*) au kusakinisha kama tegemezi. Kwa upande wetu, chanzo cha data kinakuja na nambari ya programu-jalizi. Ni muhimu pia kuwa na kiolezo cha config.html na kidhibiti cha ConfigCtrl, ambacho kitatumika kwa ukurasa wa usanidi wa mfano wa chanzo cha data na kidhibiti cha Datasource, ambacho hutekeleza mantiki ya uendeshaji wa chanzo chako cha data.

Katika programu-jalizi ya KubeGraf, kutoka kwa mtazamo wa kiolesura cha mtumiaji, chanzo cha data ni mfano wa nguzo ya kubernetes inayotekeleza uwezo ufuatao (msimbo wa chanzo unapatikana. ΠΏΠΎ ссылкС):

  • kukusanya data kutoka kwa seva ya api ya k8s (kupata orodha ya nafasi za majina, upelekaji...)
  • maombi ya uwakilishi kwa prometheus-datasource (ambayo imechaguliwa katika mipangilio ya programu-jalizi kwa kila kundi mahususi) na kupangilia majibu ya kutumia data katika kurasa tuli na kwenye dashibodi.
  • kusasisha data kwenye kurasa za programu-jalizi tuli (kwa kiwango kilichowekwa cha kuonyesha upya).
  • kuchakata maswali ili kutoa kiolezo cha karatasi katika grafana-dashibodi (metriFindQuery() mbinu)

Maendeleo ya programu-jalizi ya Grafana: historia ya picha kubwa

Maendeleo ya programu-jalizi ya Grafana: historia ya picha kubwa

Maendeleo ya programu-jalizi ya Grafana: historia ya picha kubwa

  • mtihani wa unganisho na nguzo ya mwisho ya k8s.
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"};
       })
}

Jambo tofauti la kufurahisha, kwa maoni yetu, ni utekelezaji wa utaratibu wa uthibitishaji na uidhinishaji wa chanzo cha data. Kwa kawaida, nje ya kisanduku, tunaweza kutumia kijenzi cha Grafana datasourceHttpSettings ili kusanidi ufikiaji wa chanzo cha mwisho cha data. Kwa kutumia kipengele hiki, tunaweza kusanidi ufikiaji wa chanzo cha data cha http kwa kubainisha url na mipangilio ya msingi ya uthibitishaji/uidhinishaji: kuingia-nenosiri, au client-cert/client-key. Ili kutekeleza uwezo wa kusanidi ufikiaji kwa kutumia ishara ya mtoaji (kiwango cha de facto kwa k8s), tulilazimika kufanya marekebisho kidogo.

Ili kutatua tatizo hili, unaweza kutumia utaratibu uliojengewa ndani wa Grafana "Njia za programu-jalizi" (maelezo zaidi katika ukurasa rasmi wa nyaraka) Katika mipangilio ya chanzo chetu cha data, tunaweza kutangaza seti ya sheria za uelekezaji ambazo zitachakatwa na seva mbadala ya grafana. Kwa mfano, kwa kila sehemu ya mwisho ya mtu binafsi inawezekana kuweka vichwa au urls na uwezekano wa kuiga, data ambayo inaweza kuchukuliwa kutoka kwa jsonData na sehemu za salamaJsonData (kwa kuhifadhi nywila au ishara katika fomu iliyosimbwa). Katika mfano wetu, maswali kama /__proxy/api/v1/namespaces itatumwa kwa url ya fomu
/api/v8/namespaces na Uidhinishaji: Kichwa cha Bearer.

Maendeleo ya programu-jalizi ya Grafana: historia ya picha kubwa

Maendeleo ya programu-jalizi ya Grafana: historia ya picha kubwa

Kwa kawaida, kufanya kazi na seva ya k8s api tunahitaji mtumiaji aliye na ufikiaji wa kusoma tu, maonyesho ya kuunda ambayo unaweza pia kupata ndani. msimbo wa chanzo cha programu-jalizi.

Sehemu ya 5: kutolewa

Maendeleo ya programu-jalizi ya Grafana: historia ya picha kubwa

Mara tu unapoandika programu-jalizi yako ya Grafana, kwa kawaida utataka kuifanya ipatikane kwa umma. Katika Grafana hii ni maktaba ya programu-jalizi zinazopatikana hapa grafana.com/grafana/plugins

Ili programu-jalizi yako ipatikane kwenye duka rasmi, unahitaji kufanya PR ndani hazina hiikwa kuongeza yaliyomo kama hii kwenye faili ya repo.json:

Maendeleo ya programu-jalizi ya Grafana: historia ya picha kubwa

ambapo toleo ni toleo la programu-jalizi yako, url ni kiungo cha hazina, na ahadi ni heshi ya ahadi ambayo toleo maalum la programu-jalizi litapatikana.

Na kwenye pato utaona picha nzuri kama:

Maendeleo ya programu-jalizi ya Grafana: historia ya picha kubwa

Data yake itanyakuliwa kiotomatiki kutoka kwa Readme.md, Changelog.md yako na faili ya plugin.json yenye maelezo ya programu-jalizi.

Sehemu ya 6: badala ya hitimisho

Hatukuacha kukuza programu-jalizi yetu baada ya kutolewa. Na sasa tunafanya kazi ya kufuatilia kwa usahihi utumiaji wa rasilimali za nodi za nguzo, kuanzisha vipengee vipya ili kuboresha UX, na pia kuongeza idadi kubwa ya maoni yaliyopokelewa baada ya kusanikisha programu-jalizi na wateja wetu na kutoka kwa watu kwenye GitHub (ikiwa utaondoka. suala lako au ombi la kuvuta, nitafurahi sana :)

Tunatumahi kuwa nakala hii itakusaidia kuelewa zana nzuri kama Grafana na, labda, andika programu-jalizi yako mwenyewe.

Asante!)

Chanzo: mapenzi.com

Kuongeza maoni