Grafana uchun plaginni ishlab chiqish: katta suratlar tarixi

Hammaga salom! Bir necha oy oldin biz yangi ochiq manbali loyihamizni - kubernetlarni kuzatish uchun Grafana plaginini ishga tushirdik. DevOpsProdigy KubeGraf. Plaginning manba kodi quyidagi manzilda mavjud GitHub-dagi umumiy ombor. Va ushbu maqolada biz siz bilan plaginni qanday yaratganimiz, qanday vositalardan foydalanganimiz va ishlab chiqish jarayonida qanday tuzoqlarga duch kelganimiz haqida hikoya qilmoqchimiz. Qani ketdik!

0-qism - kirish: bu nuqtaga qanday etib keldik?

Grafan uchun o'z plaginimizni yozish g'oyasi bizga tasodifan paydo bo'ldi. Bizning kompaniyamiz 10 yildan ortiq vaqt davomida turli darajadagi murakkablikdagi veb-loyihalarni kuzatib boradi. Shu vaqt ichida biz turli xil monitoring tizimlaridan foydalanish bo'yicha katta miqdordagi tajriba, qiziqarli holatlar va tajriba to'pladik. Va bir lahzada biz o'zimizga savol berdik: "Kubernetesni kuzatish uchun sehrli vosita bormi, ular aytganidek, "uni o'rnating va unuting"?.. Albatta, k8 monitoringi uchun sanoat standarti uzoq vaqtdan beri mavjud bo'lib kelgan Prometey + Grafana kombinatsiyasi. Va bu stek uchun tayyor echimlar sifatida turli xil vositalarning katta to'plami mavjud: prometey-operator, kubernetlar-mixin asboblar paneli to'plami, grafana-kubernetes-ilovasi.

Grana-kubernetes-ilova plagini biz uchun eng qiziqarli variant bo'lib tuyuldi, lekin u bir yildan ortiq vaqt davomida qo'llab-quvvatlanmaydi va bundan tashqari, tugun-eksportchi va kube-state-metriklarining yangi versiyalari bilan ishlay olmaydi. Va bir nuqtada biz qaror qildik: "O'zimiz qaror qabul qilmasligimiz kerakmi?"

Plaginimizda qanday g'oyalarni amalga oshirishga qaror qildik:

  • "ilovalar xaritasi" ning vizualizatsiyasi: klasterdagi ilovalarni nomlar bo'shliqlari, joylashtirishlar bo'yicha guruhlangan qulay taqdimoti ...;
  • "joylashtirish - xizmat (+portlar)" kabi ulanishlarni vizuallashtirish.
  • klaster ilovalarining klaster tugunlari bo'yicha taqsimlanishini vizualizatsiya qilish.
  • bir nechta manbalardan olingan ko'rsatkichlar va ma'lumotlar to'plami: Prometey va k8s api serveri.
  • infratuzilma qismini (protsessor vaqti, xotira, disk quyi tizimi, tarmoqdan foydalanish) va dastur mantig'ini kuzatish - sog'liq holati podslari, mavjud replikalar soni, jonlilik/tayyorlik testlaridan o'tish haqidagi ma'lumotlar.

1-qism: "Grafana plagini" nima?

Texnik nuqtai nazardan, Grafana plaginlari Grafana ma'lumotlar katalogida saqlanadigan burchak boshqaruvchisidir (/var/grafana/plugins/ /dist/module.js) va SystemJS moduli sifatida yuklanishi mumkin. Shuningdek, ushbu katalogda plaginingiz haqidagi barcha meta-ma'lumotlarni o'z ichiga olgan plugin.json fayli bo'lishi kerak: ism, versiya, plagin turi, ombor/sayt/litsenziyaga havolalar, bog'liqliklar va boshqalar.

Grafana uchun plaginni ishlab chiqish: katta suratlar tarixi
modul.ts

Grafana uchun plaginni ishlab chiqish: katta suratlar tarixi
plugin.json

Skrinshotda ko'rib turganingizdek, biz plugin.type = ilovasini ko'rsatdik. Chunki Grafana uchun plaginlar uch xil bo'lishi mumkin:

panel: plaginning eng keng tarqalgan turi - bu har qanday ko'rsatkichlarni vizualizatsiya qilish uchun panel bo'lib, turli xil asboblar panelini yaratish uchun ishlatiladi.
ma'lumotlar manbai: ba'zi ma'lumotlar manbalariga plagin ulagichi (masalan, Prometheus-datasource, ClickHouse-datasource, ElasticSearch-datasource).
ilova: Grafana ichida oʻz old ilovangizni yaratish, oʻz HTML sahifalaringizni yaratish va turli maʼlumotlarni vizuallashtirish uchun maʼlumotlar manbasiga qoʻlda kirish imkonini beruvchi plagin. Bundan tashqari, boshqa turdagi plaginlar (ma'lumotlar manbai, panel) va turli xil asboblar paneli qaramlik sifatida ishlatilishi mumkin.

Grafana uchun plaginni ishlab chiqish: katta suratlar tarixi
Type=app bilan plagin bog'liqliklariga misol.

Siz dasturlash tili sifatida JavaScript va TypeScript dan foydalanishingiz mumkin (biz uni tanladik). Har qanday turdagi salom dunyo plaginlari uchun tayyorgarlik havolani toping: bu omborda oldindan oʻrnatilgan va sozlangan quruvchilarga ega boʻlgan koʻp sonli boshlangʻich paketlar mavjud (hatto React-da plaginning eksperimental namunasi ham mavjud).

2-qism: mahalliy muhitni tayyorlash

Plagin ustida ishlash uchun bizga tabiiy ravishda barcha oldindan o'rnatilgan asboblarga ega kubernetlar klasteri kerak: prometey, node-exporter, kube-state-metrikalar, grafana. Atrof-muhit tez, oson va tabiiy ravishda sozlanishi va issiq qayta yuklanishini ta'minlash uchun Grafana ma'lumotlar katalogini to'g'ridan-to'g'ri ishlab chiquvchining mashinasidan o'rnatish kerak.

Bizning fikrimizcha, kubernetlar bilan mahalliy ishlashning eng qulay usuli minikube. Keyingi qadam prometey-operator yordamida Prometey + Grafana kombinatsiyasini o'rnatishdir. IN Ushbu maqola Minikube-ga prometey-operatorni o'rnatish jarayoni batafsil tavsiflangan. Qat'iylikni yoqish uchun siz parametrni o'rnatishingiz kerak qat'iyatlilik: to'g'ri charts/grafana/values.yaml faylida o'z PV va PVX ni qo'shing va ularni persistence.existingClaim parametrida belgilang.

Bizning yakuniy minikube ishga tushirish skriptimiz quyidagicha ko'rinadi:

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-qism: haqiqiy rivojlanish

Ob'ekt modeli

Plaginni amalga oshirishga tayyorgarlik ko'rish jarayonida biz TypeScript sinflari ko'rinishida ishlaydigan barcha asosiy Kubernetes ob'ektlarini tavsiflashga qaror qildik: pod, deployment, demonset, statefulset, job, cronjob, service, node, namespace. Ushbu sinflarning har biri umumiy BaseModel sinfidan meros bo'lib, konstruktor, destruktor, ko'rinishni yangilash va almashtirish usullarini tavsiflaydi. Sinflarning har biri boshqa ob'ektlar bilan ichki o'rnatilgan munosabatlarni tavsiflaydi, masalan, joylashtirish turidagi ob'ekt uchun podlar ro'yxati.

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

Qabul qiluvchilar va sozlagichlar yordamida biz o'zimizga kerakli ob'ekt ko'rsatkichlarini qulay va o'qiladigan shaklda ko'rsatishimiz yoki o'rnatishimiz mumkin. Masalan, ajratiladigan protsessor tugunlarining formatlangan chiqishi:

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

sahifalar

Barcha plagin sahifalarimiz ro'yxati dastlab bog'liqliklar bo'limidagi pluing.json da tasvirlangan:

Grafana uchun plaginni ishlab chiqish: katta suratlar tarixi

Har bir sahifa uchun blokda biz SAHIFA NOMIni ko'rsatishimiz kerak (keyin u ushbu sahifaga kirish mumkin bo'lgan slugga aylanadi); ushbu sahifaning ishlashi uchun mas'ul bo'lgan komponentning nomi (komponentlar ro'yxati module.ts ga eksport qilinadi); bu sahifa bilan ishlash mumkin bo'lgan foydalanuvchi rolini va yon panel uchun navigatsiya sozlamalarini ko'rsatadi.

Sahifaning ishlashi uchun mas'ul bo'lgan komponentda biz templateUrl ni o'rnatishimiz kerak, u erda markirovka bilan html fayliga yo'l o'tkazamiz. Tekshirgich ichida, qaramlik in'ektsiyasi orqali biz 2 tagacha muhim burchak xizmatlaridan foydalanishimiz mumkin:

  • backendSrv - Grafana API serveri bilan o'zaro aloqani ta'minlovchi xizmat;
  • datasourceSrv - Grafana-da o'rnatilgan barcha ma'lumotlar manbalari bilan mahalliy o'zaro aloqani ta'minlaydigan xizmat (masalan, .getAll() usuli - barcha o'rnatilgan ma'lumotlar manbalari ro'yxatini qaytaradi; .get( ) - ma'lum bir ma'lumot manbasining namuna ob'ektini qaytaradi.

Grafana uchun plaginni ishlab chiqish: katta suratlar tarixi

Grafana uchun plaginni ishlab chiqish: katta suratlar tarixi

Grafana uchun plaginni ishlab chiqish: katta suratlar tarixi

4-qism: ma'lumotlar manbai

Grafana nuqtai nazaridan, ma'lumotlar manbasi boshqalar bilan bir xil plagindir: uning modul.js o'z kirish nuqtasi bor, plagin.json meta-ma'lumotli fayl mavjud. Type = ilovali plaginni ishlab chiqishda biz mavjud maʼlumotlar manbalari (masalan, prometheus-datasource) va oʻzimizning maʼlumotlar manbalari bilan oʻzaro aloqada boʻlishimiz mumkin, ularni toʻgʻridan-toʻgʻri plagin katalogida (dist/datasource/*) saqlashimiz yoki bogʻliqlik sifatida oʻrnatishimiz mumkin. Bizning holatda, ma'lumotlar manbai plagin kodi bilan birga keladi. Shuningdek, config.html shabloniga va ConfigCtrl tekshirgichiga ega bo'lish kerak, ular ma'lumotlar manbasi namunasi konfiguratsiya sahifasi va ma'lumotlar manbangizning ishlash mantiqini amalga oshiradigan ma'lumotlar manbasi tekshirgichi uchun ishlatiladi.

KubeGraf plaginida, foydalanuvchi interfeysi nuqtai nazaridan, ma'lumotlar manbai quyidagi imkoniyatlarni amalga oshiradigan kubernetes klasterining namunasidir (manba kodi mavjud) aloqa):

  • k8s api-serveridan ma'lumotlarni yig'ish (nom bo'shliqlari ro'yxatini olish, joylashtirish ...)
  • prometheus-ma'lumotlar manbasiga proksi-server so'rovlari (bu har bir maxsus klaster uchun plagin sozlamalarida tanlangan) va statik sahifalarda va asboblar panelida ma'lumotlardan foydalanish uchun javoblarni formatlash.
  • statik plagin sahifalarida ma'lumotlarni yangilash (belgilangan yangilash tezligi bilan).
  • grafana boshqaruv panelida shablon varag'ini yaratish uchun so'rovlarni qayta ishlash (metriFindQuery() usuli)

Grafana uchun plaginni ishlab chiqish: katta suratlar tarixi

Grafana uchun plaginni ishlab chiqish: katta suratlar tarixi

Grafana uchun plaginni ishlab chiqish: katta suratlar tarixi

  • yakuniy k8s klasteri bilan ulanish 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"};
       })
}

Alohida qiziqarli nuqta, bizning fikrimizcha, ma'lumotlar manbai uchun autentifikatsiya va avtorizatsiya mexanizmini amalga oshirishdir. Odatda, biz yakuniy ma'lumotlar manbasiga kirishni sozlash uchun o'rnatilgan Grafana komponentining datasourceHttpSettings-dan foydalanishimiz mumkin. Ushbu komponentdan foydalanib, biz url va asosiy autentifikatsiya/avtorizatsiya sozlamalarini belgilash orqali http ma'lumotlar manbasiga kirishni sozlashimiz mumkin: login-parol yoki mijoz-sertifikat/mijoz-kalit. Tashuvchi token (k8s uchun de-fakto standarti) yordamida kirishni sozlash qobiliyatini amalga oshirish uchun biz biroz sozlashimiz kerak edi.

Ushbu muammoni hal qilish uchun siz o'rnatilgan Grafana "Plugin Routes" mexanizmidan foydalanishingiz mumkin (batafsilroq: rasmiy hujjatlar sahifasi). Ma'lumotlar manbamiz sozlamalarida biz grafana proksi-server tomonidan qayta ishlanadigan marshrutlash qoidalari to'plamini e'lon qilishimiz mumkin. Misol uchun, har bir alohida so'nggi nuqta uchun shablonlash imkoniyati bilan sarlavhalar yoki urllarni o'rnatish mumkin, ular uchun ma'lumotlar jsonData va secureJsonData maydonlaridan olinishi mumkin (parollar yoki tokenlarni shifrlangan shaklda saqlash uchun). Bizning misolimizda, kabi so'rovlar /__proxy/api/v1/namespaces formaning url manziliga proksi-server qilinadi
Avtorizatsiya bilan /api/v8/namespaces: Tashuvchi sarlavhasi.

Grafana uchun plaginni ishlab chiqish: katta suratlar tarixi

Grafana uchun plaginni ishlab chiqish: katta suratlar tarixi

Tabiiyki, k8s api serveri bilan ishlash uchun bizga faqat o'qish uchun ruxsatga ega foydalanuvchi kerak, uni yaratish uchun manifestlarni ham topishingiz mumkin. plagin manba kodi.

5-qism: chiqarish

Grafana uchun plaginni ishlab chiqish: katta suratlar tarixi

O'zingizning Grafana plaginingizni yozganingizdan so'ng, uni hamma uchun ochiq qilishni xohlaysiz. Grafana'da bu plaginlar kutubxonasi bu yerda mavjud grafana.com/grafana/plugins

Plaginingiz rasmiy do'konda mavjud bo'lishi uchun siz PR qilishingiz kerak bu omborrepo.json fayliga shunga o'xshash tarkibni qo'shish orqali:

Grafana uchun plaginni ishlab chiqish: katta suratlar tarixi

bu erda versiya plaginingizning versiyasi, url - omborga havola va commit - plaginning ma'lum bir versiyasi mavjud bo'lgan majburiyat xeshi.

Va chiqishda siz ajoyib rasmni ko'rasiz:

Grafana uchun plaginni ishlab chiqish: katta suratlar tarixi

Uning ma'lumotlari avtomatik ravishda Readme.md, Changelog.md va plagin tavsifi bilan plugin.json faylidan olinadi.

6-qism: xulosalar o'rniga

Chiqarilganidan keyin biz plaginimizni ishlab chiqishni to'xtatmadik. Va endi biz klaster tugunlari resurslaridan to'g'ri foydalanishni monitoring qilish, UX-ni yaxshilash uchun yangi xususiyatlarni joriy qilish, shuningdek, plaginni o'rnatgandan so'ng mijozlarimiz va GitHub foydalanuvchilari tomonidan olingan ko'plab fikr-mulohazalarni olish ustida ishlamoqdamiz (agar siz tark etsangiz). Sizning muammoingiz yoki tortishish so'rovingiz, men juda xursand bo'laman :)

Umid qilamizki, ushbu maqola Grafana kabi ajoyib vositani tushunishga yordam beradi va, ehtimol, o'z plaginingizni yozing.

Rahmat!)

Manba: www.habr.com

a Izoh qo'shish