Grafana üçün plagin inkişafı: doldurulmuş konusların tarixi

Hamıya salam! Bir neçə ay əvvəl biz yeni açıq mənbə layihəmizi istehsala başladıq - kubernetləri izləmək üçün Grafana-plugini adlandırdığımız. DevOpsProdigy KubeGraf. Plugin mənbə kodu burada mövcuddur GitHub-da ictimai depo. Və bu yazıda plaqini necə yaratdığımız, hansı vasitələrdən istifadə etdiyimiz və inkişaf prosesində hansı tələlərlə qarşılaşdığımız barədə hekayəni sizinlə bölüşmək istəyirik. Gedək!

Hissə 0 - giriş: bu nöqtəyə necə gəldik?

Grafan üçün öz plaginimizi yazmaq ideyası tamamilə təsadüfən yaranıb. Şirkətimiz 10 ildən artıqdır ki, müxtəlif mürəkkəblik səviyyələrində veb-layihələrin monitorinqini aparır. Bu müddət ərzində biz müxtəlif monitorinq sistemlərindən istifadə ilə bağlı çoxlu təcrübə, maraqlı keyslər və təcrübə qazandıq. Və bir anda özümüzdən soruşduq: "Kuberneti izləmək üçün sehrli bir vasitə varmı ki, necə deyərlər, "qoydu və unut"?" Və bu yığın üçün hazır həllər olaraq, müxtəlif növ alətlərin böyük dəsti var: prometheus-operator, kubernetes-mixin panelləri dəsti, grafana-kubernetes-app.

Grana-kubernetes-app plagini bizim üçün ən maraqlı seçim kimi görünürdü, lakin o, bir ildən artıqdır dəstəklənmir və üstəlik, node-exporter və kube-state-in yeni versiyaları ilə necə işləməyi bilmir. ölçülər. Və bir anda qərar verdik: "Biz özümüz qərar verməməliyikmi?"

Pluginimizdə hansı ideyaları həyata keçirməyə qərar verdik:

  • “Tətbiq xəritəsi”nin vizuallaşdırılması: ad boşluqları, yerləşdirmələr üzrə qruplaşdırılmış klasterdə tətbiqlərin rahat təqdimatı;
  • "yerləşdirmə - xidmət (+portlar)" kimi bağlantıların vizuallaşdırılması.
  • klaster proqramlarının klaster qovşaqları üzrə paylanmasının vizuallaşdırılması.
  • bir neçə mənbədən ölçülərin və məlumatların toplanması: Prometheus və k8s api server.
  • həm infrastruktur hissəsinin (prosessor vaxtının, yaddaşın, disk altsisteminin, şəbəkənin istifadəsi), həm də tətbiq məntiqinin monitorinqi - podların sağlamlıq vəziyyəti, mövcud replikaların sayı, canlılıq/hazırlıq-zondlarının keçməsi haqqında məlumat.

1-ci hissə: "Qrafana üçün plagin" nədir?

Texniki nöqteyi-nəzərdən, Grafana üçün plagin Grafana-nın məlumat kataloqunda saxlanılan açısal nəzarətçidir (/var/grafana/plugins/ /dist/module.js) və SystemJS modulu kimi yüklənə bilər. Həmçinin bu kataloqda plagininiz haqqında bütün meta məlumatlardan ibarət plugin.json faylı olmalıdır: ad, versiya, plagin növü, repozitoriya/sayt/lisenziyaya keçidlər, asılılıqlar və s.

Grafana üçün plagin inkişafı: doldurulmuş konusların tarixi
modul.ts

Grafana üçün plagin inkişafı: doldurulmuş konusların tarixi
plugin.json

Ekran görüntüsündə gördüyünüz kimi, biz plugin.type = app təyin etdik. Grafana üçün plaginlər üçün üç növ ola bilər:

paneli: plaginlərin ən çox yayılmış növü - müxtəlif tablolar yaratmaq üçün istifadə olunan istənilən ölçüləri vizuallaşdırmaq üçün paneldir.
Verilənlər mənbəyi: hər hansı məlumat mənbəyinə plug-in birləşdiricisi (məsələn, Prometheus-datasource, ClickHouse-datasource, ElasticSearch-datasource).
app: Grafana daxilində öz qabaqcıl proqramınızı yaratmağa, öz html səhifələrinizi yaratmağa və müxtəlif məlumatları göstərmək üçün verilənlər mənbəyinə əl ilə daxil olmağa imkan verən plagin. Digər növ plaginlərdən (məlumat mənbəyi, panel) və müxtəlif tablolar da asılılıq kimi istifadə edilə bilər.

Grafana üçün plagin inkişafı: doldurulmuş konusların tarixi
Növü = app ilə plagin asılılıqlarına nümunə.

Proqramlaşdırma dili olaraq siz həm JavaScript, həm də TypeScript istifadə edə bilərsiniz (biz onu seçdik). İstənilən növ salam-dünya plaginləri üçün şablonlar yarada bilərsiniz link vasitəsilə tapın: bu repozitoriyada əvvəlcədən quraşdırılmış və konfiqurasiya edilmiş qurucuları olan çoxlu sayda başlanğıc paketləri var (hətta React plagininin eksperimental nümunəsi var).

2-ci hissə: yerli mühitin hazırlanması

Plugin üzərində işləmək üçün, əlbəttə ki, bizə əvvəlcədən quraşdırılmış bütün alətləri olan kubernetlər klasteri lazımdır: prometheus, node-exporter, kube-state-metrics, grafana. Mühit tez, asan və təbii şəkildə qurulmalı və məlumat qovluğunun isti yenidən yüklənməsini təmin etmək üçün Grafana birbaşa tərtibatçının maşınından quraşdırılmalıdır.

Bizim fikrimizcə, kubernetlərlə yerli işləməyin ən əlverişli yolu minikube. Növbəti addım prometheus-operatordan istifadə edərək Prometheus + Grafana paketini quraşdırmaqdır. IN bu məqalə minikube-də prometey-operatorun quraşdırılması prosesi ətraflı təsvir edilmişdir. Davamlılığı aktivləşdirmək üçün parametri təyin etməlisiniz əzmkarlıq: doğrudur charts/grafana/values.yaml faylında öz PV və PVC-nizi əlavə edin və onları persistence.existingClaim parametrində göstərin.

Son minikube başlanğıc skripti belə görünür:

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

3-cü hissə: birbaşa inkişaf

Obyekt Modeli

Pluginin tətbiqinə hazırlıq olaraq, TypeScript sinifləri şəklində işləyəcəyimiz bütün əsas Kubernetes obyektlərini təsvir etmək qərarına gəldik: pod, yerləşdirmə, demonset, statuslu dəst, iş, cronjob, xidmət, node, ad sahəsi. Bu siniflərin hər biri konstruktoru, destruktoru, görmə qabiliyyətini yeniləmək və dəyişdirmək üsullarını təsvir edən ümumi BaseModel sinfindən miras qalır. Siniflərin hər biri digər obyektlərlə iç içə əlaqələri təsvir edir, məsələn, yerləşdirmə tipli obyekt üçün podların siyahısı.

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

Alıcıların və təyinedicilərin köməyi ilə biz lazım olan obyekt ölçülərini rahat və oxunaqlı formada göstərə və ya təyin edə bilərik. Məsələn, ayrıla bilən cpu nodlarının formatlaşdırılmış çıxışı:

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

Səhifələr

Pluginimizin bütün səhifələrinin siyahısı əvvəlcə pluing.json-da asılılıqlar bölməsində təsvir edilmişdir:

Grafana üçün plagin inkişafı: doldurulmuş konusların tarixi

Hər səhifə üçün blokda biz SƏHİFƏ ADI-nı göstərməliyik (daha sonra bu səhifənin mövcud olacağı şlaka çevriləcək); bu səhifənin işinə cavabdeh olan komponentin adı (komponentlərin siyahısı module.ts-ə ixrac olunur); bu səhifə ilə işləmək mümkün olan istifadəçi rolunun və yan panel üçün naviqasiya parametrlərinin müəyyən edilməsi.

Səhifə üçün cavabdeh olan komponentdə, orada işarələmə ilə html faylının yolunu keçərək templateUrl təyin etməliyik. Nəzarətçinin daxilində asılılıq inyeksiyası vasitəsilə biz 2-ə qədər mühüm angular xidmətə daxil ola bilərik:

  • backendSrv - grafana api-server ilə qarşılıqlı əlaqəni təmin edən xidmət;
  • datasourceSrv - Grafana-da quraşdırılmış bütün məlumat mənbələri ilə yerli qarşılıqlı əlaqəni təmin edən xidmət (məsələn, .getAll() metodu - bütün quraşdırılmış məlumat mənbələrinin siyahısını qaytarır; .get( ) - xüsusi məlumat mənbəyinin nümunə obyektini qaytarır.

Grafana üçün plagin inkişafı: doldurulmuş konusların tarixi

Grafana üçün plagin inkişafı: doldurulmuş konusların tarixi

Grafana üçün plagin inkişafı: doldurulmuş konusların tarixi

4-cü hissə: məlumat mənbəyi

Grafana nöqteyi-nəzərindən məlumat mənbəyi bütün digərləri ilə tam olaraq eyni plagindir: onun öz module.js giriş nöqtəsi var, meta məlumatı olan plugin.json faylı var. Type = app ilə plagin hazırlayarkən biz həm mövcud məlumat mənbələri (məsələn, prometheus-datasource), həm də birbaşa plagin kataloqunda (dist/datasource/*) saxlaya və ya asılılıq kimi quraşdıra biləcəyimiz öz verilənlərimizlə qarşılıqlı əlaqə yarada bilərik. . Bizim vəziyyətimizdə məlumat mənbəyi plagin kodu ilə gəlir. Həmçinin məlumat mənbəyi nümunəsinin konfiqurasiya səhifəsi üçün istifadə olunacaq config.html şablonu və ConfigCtrl nəzarətçisinə və məlumat mənbəyinizin məntiqini həyata keçirən Datasource nəzarətçisinə malik olmaq lazımdır.

KubeGraf plaginində istifadəçi interfeysi baxımından məlumat mənbəyi aşağıdakı xüsusiyyətləri həyata keçirən kubernetes klasterinin nümunəsidir (mənbə kodu mövcuddur) по ссылке):

  • k8s api-serverindən məlumatların alınması (ad boşluqlarının, yerləşdirmələrin siyahısını əldə etmək…)
  • prometheus-məlumat mənbəyinə (hər bir xüsusi klaster üçün plagin parametrlərində seçilir) proxy sorğuları və həm statik səhifələrdə, həm də idarə panellərində verilənlərdən istifadə etmək üçün cavabların formatlaşdırılması.
  • plaginin statik səhifələrində məlumatların yenilənməsi (müəyyən edilmiş yeniləmə sürəti ilə).
  • qrafana idarə panellərində şablon vərəqi yaratmaq üçün sorğuların işlənməsi (metod .metriFindQuery())

Grafana üçün plagin inkişafı: doldurulmuş konusların tarixi

Grafana üçün plagin inkişafı: doldurulmuş konusların tarixi

Grafana üçün plagin inkişafı: doldurulmuş konusların tarixi

  • son k8s çoxluğu ilə əlaqə testi.
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"};
       })
}

Ayrı bir maraqlı məqam, fikrimizcə, məlumat mənbəyi üçün autentifikasiya və avtorizasiya mexanizminin həyata keçirilməsidir. Bir qayda olaraq, qutudan kənarda, son məlumat mənbəyinə girişi konfiqurasiya etmək üçün daxili Grafana komponentindən - datasourceHttpSettings-dən istifadə edə bilərik. Bu komponentdən istifadə edərək, biz url və əsas autentifikasiya/avtorizasiya parametrlərini göstərərək http məlumat mənbəyinə girişi konfiqurasiya edə bilərik: giriş-parol və ya müştəri sertifikatı/müştəri açarı. Daşıyıcı nişanı (k8s üçün faktiki standart) istifadə edərək girişi konfiqurasiya etmək qabiliyyətini həyata keçirmək üçün bir az "aldatma" etməli oldum.

Bu problemi həll etmək üçün daxili Grafana "Plugin Routes" mexanizmindən istifadə edə bilərsiniz (daha çox rəsmi sənədlər səhifəsi). Məlumat mənbəyimizin parametrlərində grafana proksi serveri tərəfindən işlənəcək bir sıra marşrutlaşdırma qaydaları elan edə bilərik. Məsələn, hər bir fərdi son nöqtə üçün şablonlaşdırma imkanı ilə başlıqlar və ya url təyin etmək imkanı var, bunun üçün məlumatlar jsonData və secureJsonData sahələrindən götürülə bilər (şifrələnmiş formada parol və ya nişanların saxlanması üçün). Bizim nümunəmizdə, kimi sorğular /__proxy/api/v1/namespaces formanın url-sinə proksilənəcək
/api/v8/namespaces başlığı ilə Səlahiyyət: Daşıyıcı .

Grafana üçün plagin inkişafı: doldurulmuş konusların tarixi

Grafana üçün plagin inkişafı: doldurulmuş konusların tarixi

Təbii ki, k8s api serveri ilə işləmək üçün bizə yalnız oxunaqlı girişi olan, yaratmaq üçün manifestləri olan istifadəçi lazımdır. plugin mənbə kodu.

5-ci hissə: buraxılış

Grafana üçün plagin inkişafı: doldurulmuş konusların tarixi

Öz Grafana plagininizi yazdıqdan sonra təbii olaraq onu ictimaiyyətə təqdim etmək istəyəcəksiniz. Grafana-da bu, linkdə mövcud olan plagin kitabxanasıdır grafana.com/grafana/plugins

Plugininizin rəsmi mağazada olması üçün siz orada PR etməlisiniz bu depo, repo.json faylına aşağıdakı məzmunu əlavə etməklə:

Grafana üçün plagin inkişafı: doldurulmuş konusların tarixi

versiya plaqinin versiyasıdır, url depoya keçiddir və commit xüsusi plagin versiyasını əlçatan edəcək öhdəliyin hashıdır.

Və çıxışda formanın gözəl şəklini görəcəksiniz:

Grafana üçün plagin inkişafı: doldurulmuş konusların tarixi

Onun məlumatları Readme.md, Changelog.md və plugin təsviri olan plugin.json faylınızdan avtomatik olaraq oğurlanacaq.

6-cı hissə: nəticələr əvəzinə

Buraxılışdan sonra plaqinimizi inkişaf etdirməyi dayandırmadıq. İndi biz klaster qovşaqlarının resurslarından istifadənin düzgün monitorinqi, UX-i təkmilləşdirmək üçün yeni funksiyaların tətbiqi üzərində işləyirik və həm də plaqini quraşdırdıqdan sonra həm müştərilərimiz, həm də github-da ishshui (məsələnizi tərk etsəniz və ya sorğunu götürsəniz, çox xoşbəxt olacağam 🙂).

Ümid edirik ki, bu məqalə Grafana kimi əla aləti başa düşməyə və bəlkə də öz plagininizi yazmağa kömək edəcəkdir.

Təşəkkürlər!)

Mənbə: www.habr.com

Добавить комментарий