Haɓaka plugin don Grafana: tarihin manyan hotuna

Sannu duka! Bayan 'yan watannin da suka gabata, mun ƙaddamar da sabon aikin buɗe tushen mu don samarwa - kayan aikin Grafana don saka idanu kubernetes, wanda muka kira. DevOpsProdigy KubeGraf. Ana samun lambar tushen plugin a ma'ajiyar jama'a akan GitHub. Kuma a cikin wannan labarin muna so mu raba tare da ku labarin yadda muka ƙirƙiri plugin, abin da kayan aikin da muka yi amfani da da kuma abin da pitfalls da muka ci karo da a lokacin ci gaban tsari. Mu tafi!

Sashe na 0 - Gabatarwa: ta yaya muka kai ga wannan batu?

Tunanin rubuta namu plugin don Grafan ya zo mana da haɗari sosai. Kamfaninmu yana lura da ayyukan yanar gizo na matakai daban-daban na rikitarwa fiye da shekaru 10. A wannan lokacin, mun tara ƙwararrun ƙwarewa, lokuta masu ban sha'awa, da ƙwarewa a cikin amfani da tsarin kulawa daban-daban. Kuma a wani lokaci mun tambayi kanmu: "Shin akwai kayan aiki na sihiri don saka idanu Kubernetes, don haka, kamar yadda suke cewa, "sata shi kuma manta da shi"? Haɗin Prometheus + Grafana. Kuma a matsayin shirye-shiryen mafita don wannan tari, akwai babban saiti na nau'ikan kayan aikin: prometheus-operator, saitin kubernetes-mixin dashboards, grafana-kubernetes-app.

The grafana-kubernetes-app plugin da alama ya zama mafi ban sha'awa zaɓi a gare mu, amma shi ba a goyan bayan fiye da shekara guda kuma, haka ma, ba zai iya aiki tare da sabon version na node-exporter da kube-state-metrics. Kuma a wani lokaci mun yanke shawara: "Ba za mu yanke shawarar kanmu ba?"

Wadanne ra'ayoyin da muka yanke shawarar aiwatarwa a cikin plugin ɗin mu:

  • hangen nesa na "taswirar aikace-aikacen": dacewa da gabatar da aikace-aikace a cikin tari, an haɗa su ta wuraren suna, turawa...;
  • hangen nesa na haɗin gwiwa kamar "aiwatarwa - sabis (+ tashar jiragen ruwa)".
  • hangen nesa na rarraba aikace-aikacen tari a cikin nodes na tari.
  • tarin ma'auni da bayanai daga tushe da yawa: Prometheus da k8s api sabar.
  • saka idanu na duka bangarorin abubuwan more rayuwa (amfani da lokacin CPU, ƙwaƙwalwar ajiya, tsarin faifai, hanyar sadarwa) da dabaru na aikace-aikacen - kwafin yanayin kiwon lafiya, adadin samfuran da ake samu, bayanai game da gwajin rayuwa/ shirye-shiryen wucewa.

Sashe na 1: Menene "Plugin Grafana"?

Daga ra'ayi na fasaha, plugin ɗin don Grafana shine mai sarrafa kusurwa, wanda aka adana a cikin kundin bayanan Grafana (/var/grafana/plugins/ /dist/module.js) kuma za'a iya lodawa azaman tsarin SystemJS. Hakanan a cikin wannan jagorar yakamata a sami fayil ɗin plugin.json mai ɗauke da duk bayanan meta game da plugin ɗin ku: suna, sigar, nau'in plugin, hanyoyin haɗi zuwa wurin ajiya/site/lasisi, dogaro, da sauransu.

Haɓaka plugin don Grafana: tarihin manyan hotuna
module.ts

Haɓaka plugin don Grafana: tarihin manyan hotuna
plugin.json

Kamar yadda kuke gani a cikin hoton, mun ƙayyade plugin.type = app. Domin plugins na Grafana na iya zama iri uku:

panel: mafi yawan nau'in plugins - panel ne don ganin kowane ma'auni, ana amfani da shi don gina dashboards daban-daban.
tushen bayanai: mai haɗin plugin zuwa wasu tushen bayanai (misali, Prometheus-datasource, ClickHouse-datasource, ElasticSearch-datasource).
app: Plugin da ke ba ku damar gina naku aikace-aikacen gaba a cikin Grafana, ƙirƙirar shafukan html na ku da hannu da hannu don ganin bayanan daban-daban. Hakanan, ana iya amfani da plugins na wasu nau'ikan (sourcesource, panel) da dashboards daban-daban azaman abin dogaro.

Haɓaka plugin don Grafana: tarihin manyan hotuna
Misalin abubuwan dogaro da plugin tare da type=app.

Kuna iya amfani da JavaScript da TypeScript a matsayin harshen shirye-shirye (mun zaɓe shi). Shirye-shirye don hello-duniya plugins na kowane nau'in da zaku iya nemo hanyar haɗin gwiwa: wannan ma'ajiyar tana ƙunshe da babban adadin fakitin farawa (akwai ma misali na gwaji na plugin a cikin React) tare da waɗanda aka riga aka shigar da kuma daidaita su.

Sashe na 2: shirya yanayin gida

Don yin aiki akan plugin ɗin, a zahiri muna buƙatar gungu kubernetes tare da duk kayan aikin da aka riga aka shigar: prometheus, node-exporter, kube-state-metrics, grafana. Ya kamata a saita yanayin da sauri, cikin sauƙi da ta halitta, kuma don tabbatar da sake kunnawa mai zafi, ya kamata a saka kundin bayanan Grafana kai tsaye daga injin mai haɓakawa.

Hanya mafi dacewa, a cikin ra'ayinmu, yin aiki a gida tare da kubernetes shine minikube. Mataki na gaba shine shigar da haɗin Prometheus + Grafana ta amfani da prometheus-operator. IN wannan labarin An bayyana tsarin shigar da prometheus-operator akan minikube dalla-dalla. Don kunna dagewa, dole ne ka saita siga dagewa: gaskiya a cikin ginshiƙi/grafana/values.yaml fayil, ƙara PV naka da PVC kuma saka su a cikin madaidaicin da'awar da'awar.

Rubutun ƙaddamar da minikube ɗin mu na ƙarshe yayi kama da haka:

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

Sashe na 3: ainihin ci gaba

Samfurin abu

A cikin shiri don aiwatar da kayan aikin, mun yanke shawarar bayyana duk abubuwan asali da za mu yi aiki tare da nau'i na rubutun. Kowane ɗayan waɗannan azuzuwan ya gaji daga rukunin BaseModel gama gari, wanda ke bayyana maginin gini, mai ɓarna, hanyoyin haɓakawa da canza ganuwa. Kowanne daga cikin azuzuwan yana bayyana alaƙar gida tare da wasu ƙungiyoyi, alal misali, jerin fasfo don mahaɗan nau'in turawa.

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

Tare da taimakon getters da saiti, za mu iya nunawa ko saita ma'aunin mahaɗan da muke buƙata a cikin tsari mai dacewa da karantawa. Misali, tsararrun fitarwa na nodes na cpu waɗanda za a iya raba su:

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

pages

An fara bayanin jerin duk shafukan mu na plugin ɗin a cikin pluing.json a cikin sashin abubuwan dogaro:

Haɓaka plugin don Grafana: tarihin manyan hotuna

A cikin block na kowane shafi dole ne mu nuna SUNA PAGE (sa'an nan za a canza shi zuwa slug wanda wannan shafin za a iya samu); sunan bangaren da ke da alhakin gudanar da wannan shafi (ana fitar da jerin abubuwan da aka haɗa zuwa module.ts); yana nuna rawar mai amfani wanda akwai aiki tare da wannan shafin da saitunan kewayawa don mashigin gefe.

A cikin ɓangaren da ke da alhakin aiwatar da shafin, dole ne mu saita templateUrl, wucewa a can hanyar zuwa fayil ɗin html tare da alama. A cikin mai sarrafawa, ta hanyar allurar dogaro, za mu iya samun damar zuwa mahimman sabis na kusurwa guda biyu:

  • backendSrv - sabis ɗin da ke ba da hulɗa tare da uwar garken API na Grafana;
  • datasourceSrv - sabis ɗin da ke ba da hulɗar gida tare da duk tushen bayanan da aka shigar a cikin Grafana (misali, hanyar .getAll() - yana dawo da jerin duk tushen bayanan da aka shigar; ) - mayar da wani misali abu na takamaiman tushen bayanai.

Haɓaka plugin don Grafana: tarihin manyan hotuna

Haɓaka plugin don Grafana: tarihin manyan hotuna

Haɓaka plugin don Grafana: tarihin manyan hotuna

Kashi na 4: tushen bayanai

Daga ra'ayi na Grafana, datasource daidai da plugin iri ɗaya ne kamar sauran sauran: yana da module ɗin shigarwa na kansa.js, akwai fayil tare da bayanan meta plugin.json. Lokacin haɓaka plugin tare da nau'in = app, zamu iya yin hulɗa tare da tushen bayanan data kasance (misali, prometheus-datasource) da namu, waɗanda zamu iya adanawa kai tsaye a cikin kundin adireshi (dist/datasource/*) ko shigar azaman abin dogaro. A cikin yanayinmu, tushen bayanan yana zuwa tare da lambar plugin. Hakanan wajibi ne a sami samfuri na config.html da mai sarrafa ConfigCtrl, waɗanda za a yi amfani da su don shafin daidaitawa na tushen bayanai da kuma mai sarrafa Datasource, wanda ke aiwatar da dabaru na tushen bayanan ku.

A cikin plugin ɗin KubeGraf, daga mahaɗan mai amfani, tushen bayanai misali ne na gungu na kubernetes wanda ke aiwatar da iyakoki masu zuwa (ana samun lambar tushe. mahada):

  • tattara bayanai daga k8s api-uwar garken (samun jerin sunayen wuraren aiki, turawa...)
  • proxying buƙatun zuwa tushen bayanan-prometheus (wanda aka zaɓa a cikin saitunan plugin don kowane tari na musamman) da tsara martani don amfani da bayanai duka a cikin shafuka masu tsayi da a cikin dashboards.
  • ana sabunta bayanai akan shafukan plugin ɗin a tsaye (tare da saita adadin wartsakewa).
  • sarrafa tambayoyin don samar da takardar samfuri a cikin grafana-dashboards (hanyar metriFindQuery())

Haɓaka plugin don Grafana: tarihin manyan hotuna

Haɓaka plugin don Grafana: tarihin manyan hotuna

Haɓaka plugin don Grafana: tarihin manyan hotuna

  • gwajin haɗin gwiwa tare da gungu na k8s na ƙarshe.
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"};
       })
}

Wani batu mai ban sha'awa daban, a ra'ayinmu, shine aiwatar da tsarin tabbatarwa da izini don tushen bayanai. Yawanci, daga cikin akwatin, za mu iya amfani da ginanniyar kayan aikin Grafana datasourceHttpSettings don saita damar zuwa tushen bayanan ƙarshe. Yin amfani da wannan bangaren, za mu iya saita damar zuwa tushen bayanan http ta hanyar ƙididdige url da ainihin saitunan tabbatarwa / izini: kalmar wucewa, ko abokin ciniki-cert/maɓallin abokin ciniki. Domin aiwatar da ikon daidaita hanyar shiga ta amfani da alamar mai ɗaukar hoto (ma'auni na de facto na k8s), dole ne mu ɗan yi tweaking kaɗan.

Don magance wannan matsalar, zaku iya amfani da ginanniyar hanyar Grafana “Plugin Routes” (ƙarin cikakkun bayanai a official takardun shafi). A cikin saitunan tushen bayanan mu, za mu iya ayyana saitin ƙa'idodin kewayawa waɗanda uwar garken wakili na grafana za su sarrafa su. Misali, ga kowane maƙasudin ƙarshen mutum yana yiwuwa a saita masu kai ko url tare da yuwuwar gwaji, bayanai waɗanda za a iya ɗaukar su daga jsonData da amintattun filayen JsonData (don adana kalmomin sirri ko alamu a cikin rufaffen tsari). A cikin misalinmu, tambayoyin kamar /__proxy/api/v1/namespaces za a yi proxied zuwa url na form
/api/v8/spaces tare da izini: Mai ba da labari.

Haɓaka plugin don Grafana: tarihin manyan hotuna

Haɓaka plugin don Grafana: tarihin manyan hotuna

A zahiri, don aiki tare da uwar garken api k8s muna buƙatar mai amfani tare da damar karantawa kawai, bayyananne don ƙirƙirar wanda kuma zaku iya samu a ciki. plugin tushen code.

Kashi na 5: saki

Haɓaka plugin don Grafana: tarihin manyan hotuna

Da zarar ka rubuta naka plugin ɗin na Grafana, a zahiri za ka so ka sa shi a fili. A Grafana wannan ɗakin karatu ne na plugins da ake samu anan grafana.com/grafana/plugins

Domin plugin ɗin ku ya kasance a kan kantin sayar da kayan aiki, kuna buƙatar yin PR a ciki wannan ma'ajiyarta ƙara abun ciki kamar wannan zuwa fayil ɗin repo.json:

Haɓaka plugin don Grafana: tarihin manyan hotuna

inda sigar ita ce sigar plugin ɗin ku, url hanyar haɗi ce zuwa ma'ajiyar, kuma ƙaddamar shine zanta na ƙaddamar wanda takamaiman nau'in plugin ɗin zai kasance.

Kuma a fitowar za ku ga hoto mai ban mamaki kamar:

Haɓaka plugin don Grafana: tarihin manyan hotuna

Za a karɓi bayanan ta ta atomatik daga Readme.md, Changelog.md da fayil ɗin plugin.json tare da bayanin plugin ɗin.

Sashe na 6: maimakon kammalawa

Ba mu daina haɓaka kayan aikin mu ba bayan an saki. Kuma yanzu muna aiki kan sa ido daidai yadda ake amfani da albarkatu na nodes na gungu, gabatar da sabbin abubuwa don haɓaka UX, da kuma raking a cikin babban adadin martani da aka samu bayan shigar da plugin ɗin duka ta abokan cinikinmu da kuma daga mutane akan GitHub (idan kun tafi. Batun ku ko buƙatar ja, Zan yi farin ciki sosai :)

Muna fatan wannan labarin zai taimaka muku fahimtar irin wannan kayan aiki mai ban mamaki kamar Grafana kuma, watakila, rubuta plugin ɗin ku.

Na gode!)

source: www.habr.com

Add a comment