Ngembangkeun plugin pikeun Grafana: sajarah nembak badag

Halo sadayana! Sababaraha bulan kapengker, urang ngaluncurkeun proyék open-source anyar urang kana produksi - plugin Grafana pikeun ngawaskeun kubernetes, anu kami sebut DevOpsProdigy KubeGraf. Kodeu sumber plugin sayogi di gudang umum dina GitHub. Sareng dina tulisan ieu kami hoyong bagikeun sareng anjeun carita kumaha urang nyiptakeun plugin, alat naon anu kami anggo sareng pitfalls naon anu kami tepang dina prosés pangwangunan. Hayu angkat!

Bagian 0 - bubuka: kumaha urang nepi ka titik ieu?

Gagasan pikeun nyerat plugin kami sorangan pikeun Grafan sumping ka kami sacara teu kahaja. Perusahaan kami parantos ngawaskeun proyék wéb tina sababaraha tingkat pajeulitna langkung ti 10 taun. Salila ieu, kami parantos ngumpulkeun seueur kaahlian, kasus anu pikaresepeun, sareng pangalaman dina ngagunakeun sababaraha sistem ngawaskeun. Sarta di sawatara titik kami nanya ka diri urang sorangan: "Naha aya alat magic pikeun ngawaskeun Kubernetes, ku kituna, sabab nyebutkeun, "Nyetél eta jeung poho"?".. Standar industri pikeun ngawaskeun k8s, tangtosna, geus lila geus Kombinasi Prometheus + Grafana. Jeung salaku solusi siap-dijieun pikeun tumpukan ieu, aya hiji set badag tina rupa-rupa parabot: prometheus-operator, susunan kubernetes-mixin dashboards, grafana-kubernetes-app.

Plugin grafana-kubernetes-app sigana mangrupikeun pilihan anu paling pikaresepeun pikeun urang, tapi éta henteu acan dirojong langkung ti sataun sareng, komo deui, teu tiasa dianggo sareng vérsi énggal-éksportir sareng kube-state-metrics. Sarta di sawatara titik urang mutuskeun: "Naha urang teu kudu nyieun kaputusan sorangan?"

Gagasan naon anu kami mutuskeun pikeun nerapkeun dina plugin kami:

  • visualisasi tina "peta aplikasi": presentasi merenah tina aplikasi dina klaster, dikelompokeun ku spasi ngaran, deployments ...;
  • visualisasi sambungan sapertos "deployment - service (+ports)".
  • visualisasi sebaran aplikasi klaster sakuliah titik klaster.
  • kumpulan metrics sarta informasi ti sababaraha sumber: Prometheus na k8s server api.
  • ngawaskeun duanana bagian infrastruktur (pamakéan waktu CPU, memori, subsistem disk, jaringan) jeung logika aplikasi - status kaséhatan pods, Jumlah réplika sadia, informasi ngeunaan lulus liveness / tes kesiapan.

Bagian 1: Naon téh "Grafana plugin"?

Tina sudut pandang téknis, plugin pikeun Grafana mangrupikeun pengontrol sudut, anu disimpen dina diréktori data Grafana (/var/grafana/plugins/ /dist/module.js) sarta bisa dimuat salaku modul SystemJS. Ogé dina diréktori ieu kedah aya file plugin.json anu ngandung sadaya inpormasi meta ngeunaan plugin anjeun: nami, versi, jinis plugin, tautan kana gudang/situs/lisensi, kagumantungan, sareng saterasna.

Ngembangkeun plugin pikeun Grafana: sajarah nembak badag
modul.ts

Ngembangkeun plugin pikeun Grafana: sajarah nembak badag
plugin.json

Sakumaha anjeun tiasa tingali dina screenshot, urang dieusian plugin.type = app. Kusabab plugins pikeun Grafana tiasa tina tilu jinis:

panel: tipe nu paling umum tina plugin - éta panel pikeun visualizing sagala metrics, dipaké pikeun ngawangun rupa dashboards.
sumber data: konektor plugin sababaraha sumber data (Contona, Prometheus-datasource, ClickHouse-datasource, ElasticSearch-datasource).
app: A plugin nu ngidinan Anjeun pikeun ngawangun aplikasi frontend sorangan jero Grafana, nyieun kaca html sorangan sarta sacara manual ngakses datasource pikeun visualize rupa data. Ogé, plugins tina tipe séjén (sumber data, panel) jeung sagala rupa dasbor bisa dipaké salaku kagumantungan.

Ngembangkeun plugin pikeun Grafana: sajarah nembak badag
Conto kagumantungan plugin sareng jinis = aplikasi.

Anjeun tiasa nganggo JavaScript sareng TypeScript salaku basa pamrograman (kami milih éta). Olahan pikeun plugins hello-world tina jinis naon waé anu anjeun tiasa manggihan link: Repository ieu ngandung angka nu gede ngarupakeun starter-pak (malah aya hiji conto ékspériméntal plugin di meta) jeung tukang tos dipasang na ngonpigurasi.

Bagian 2: Nyiapkeun lingkungan lokal

Pikeun ngerjakeun plugin, urang sacara alami peryogi klaster kubernetes sareng sadaya alat anu tos dipasang: prometheus, node-eksportir, kube-state-metrics, grafana. Lingkungan kudu disetél gancang, gampang jeung alami, sarta pikeun mastikeun panas-reload, diréktori data Grafana kudu dipasang langsung ti mesin pamekar urang.

Cara anu pangmerenahna, dina pamadegan urang, pikeun digawé sacara lokal sareng kubernetes nyaéta minikube. Lengkah saterusna nyaeta masang kombinasi Prometheus + Grafana ngagunakeun prometheus-operator. DI Artikel ieu Prosés masang prometheus-operator dina minikube dijelaskeun sacara rinci. Pikeun ngaktifkeun kegigihan, anjeun kedah nyetél parameter kegigihan: leres dina grafik/grafana/values.yaml file, tambahkeun PV anjeun sorangan jeung PVC sarta nangtukeun aranjeunna dina persistence.existingClaim parameter

Skrip peluncuran minikube ahir urang sapertos kieu:

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

Bagian 3: ngembangkeun sabenerna

Modél objék

Dina préparasi palaksanaan plugin, urang mutuskeun pikeun ngajelaskeun sakabéh éntitas Kubernetes dasar nu urang bakal gawé bareng dina bentuk kelas TypeScript: pod, deployment, daemonset, statefulset, pakasaban, cronjob, jasa, titik, namespace. Unggal kelas ieu inherits ti kelas BaseModel umum, nu ngajelaskeun constructor nu, destructor, métode pikeun ngamutahirkeun sarta pindah pisibilitas. Unggal kelas ngajelaskeun hubungan nested kalawan éntitas séjén, contona, daptar pods pikeun éntitas tipe deployment.

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

Kalayan bantosan getter sareng setters, urang tiasa ningalikeun atanapi nyetél métrik éntitas anu urang peryogikeun dina bentuk anu merenah sareng tiasa dibaca. Contona, kaluaran formatna tina titik cpu anu tiasa dialokasikeun:

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

kaca

Daptar sadaya halaman plugin urang mimitina dijelaskeun dina pluing.json kami dina bagian dependensi:

Ngembangkeun plugin pikeun Grafana: sajarah nembak badag

Dina blok pikeun unggal halaman urang kedah nunjukkeun NAME HALAMAN (satuluyna bakal dirobih janten slug dimana halaman ieu tiasa diaksés); nami komponén jawab operasi kaca ieu (daptar komponén diékspor ka module.ts); nuduhkeun peran pamaké nu gawéna kalawan kaca ieu sadia tur setelan navigasi pikeun sidebar.

Dina komponén anu tanggung jawab pikeun operasi halaman, urang kedah nyetél templateUrl, ngalangkungan jalur kana file html kalayan markup. Di jero controller, ngaliwatan suntikan dependensi, urang tiasa ngaksés nepi ka 2 jasa sudut penting:

  • backendSrv - layanan nu nyadiakeun interaksi jeung server API Grafana;
  • datasourceSrv - layanan nu nyadiakeun interaksi lokal jeung sakabeh datasources dipasang dina Grafana Anjeun (contona, metoda .getAll () - mulih daptar sadaya datasources dipasang; .get (). ) - mulih hiji objek conto tina sumber data husus.

Ngembangkeun plugin pikeun Grafana: sajarah nembak badag

Ngembangkeun plugin pikeun Grafana: sajarah nembak badag

Ngembangkeun plugin pikeun Grafana: sajarah nembak badag

Bagian 4: sumber data

Tina sudut pandang Grafana, sumber data persis plugin anu sami sareng anu sanésna: gaduh modul.js titik éntri sorangan, aya file sareng inpormasi meta plugin.json. Nalika ngamekarkeun plugin kalawan tipe = aplikasi, urang tiasa berinteraksi sareng duanana datasources aya (contona, prometheus-datasource) jeung urang sorangan, nu urang tiasa nyimpen langsung dina diréktori plugin (dist / datasource / *) atawa install salaku kagumantungan a. Dina kasus urang, sumber data hadir sareng kode plugin. Éta ogé kudu boga template config.html jeung controller ConfigCtrl, nu bakal dipaké pikeun kaca konfigurasi conto sumber data jeung controller Datasource, nu implements logika sumber data Anjeun.

Dina plugin KubeGraf, tina sudut pandang antarbeungeut pangguna, sumber data mangrupikeun conto tina klaster kubernetes anu ngalaksanakeun kamampuan di handap ieu (kode sumber sayogi link):

  • ngumpulkeun data tina k8s api-server (meunang daptar ngaranspasi, deployments ...)
  • requests proxying ka prometheus-datasource (anu dipilih dina setélan plugin pikeun tiap klaster husus) jeung réspon pormat ngagunakeun data boh dina kaca statik jeung di dashboards.
  • ngamutahirkeun data dina kaca plugin statik (kalawan laju refresh set).
  • ngolah query pikeun ngahasilkeun lambar template dina grafana-dashboards (metriFindQuery() métode)

Ngembangkeun plugin pikeun Grafana: sajarah nembak badag

Ngembangkeun plugin pikeun Grafana: sajarah nembak badag

Ngembangkeun plugin pikeun Grafana: sajarah nembak badag

  • test sambungan kalawan k8s kluster final.
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"};
       })
}

Hiji titik metot misah, dina pamadegan urang, nyaéta palaksanaan hiji auténtikasi sarta otorisasina mékanisme pikeun sumber data. Ilaharna, out of the box, urang tiasa nganggo diwangun-di Grafana komponén datasourceHttpSettings pikeun ngonpigurasikeun aksés ka sumber data ahir. Ngagunakeun komponén ieu, urang bisa ngonpigurasikeun aksés ka sumber data http ku nangtukeun url na dasar auténtikasi / setélan otorisasina: login-sandi, atawa klien-cert/klien-konci. Dina raraga nerapkeun kamampuhan pikeun ngonpigurasikeun aksés maké token bearer (standar de facto pikeun k8s), urang kungsi ngalakukeun hiji tweaking saeutik.

Pikeun ngabéréskeun masalah ieu, anjeun tiasa nganggo mékanisme Grafana "Plugin Routes" anu diwangun (detail langkung seueur di kaca dokuméntasi resmi). Dina setélan sumber data urang, urang tiasa nyatakeun sakumpulan aturan routing anu bakal diolah ku server proxy grafana. Contona, pikeun tiap titik tungtung individu kasebut nyaéta dimungkinkeun pikeun nyetél headers atanapi url kalawan kamungkinan template, data nu bisa dicokot tina widang jsonData na secureJsonData (pikeun nyimpen kecap akses atawa tokens dina formulir énkripsi). Dina conto urang, queries kawas /__proxy/api/v1/namespaces bakal proxied kana url formulir
/api/v8/namespaces kalawan Otorisasina: header Bearer.

Ngembangkeun plugin pikeun Grafana: sajarah nembak badag

Ngembangkeun plugin pikeun Grafana: sajarah nembak badag

Alami, pikeun digawe sareng server api k8s urang peryogi pamaké kalawan aksés readonly, manifests pikeun nyieun nu ogé bisa manggihan di kode sumber plugin.

Bagian 5: ngaleupaskeun

Ngembangkeun plugin pikeun Grafana: sajarah nembak badag

Sakali anjeun parantos nyerat plugin Grafana anjeun nyalira, anjeun sacara alami hoyong ngajantenkeun éta sayogi umum. Dina Grafana ieu perpustakaan plugins sadia di dieu grafana.com/grafana/plugins

Supados plugin anjeun sayogi dina toko resmi, anjeun kedah ngadamel PR gudang ieuku nambahkeun eusi kawas kieu kana file repo.json:

Ngembangkeun plugin pikeun Grafana: sajarah nembak badag

dimana versi mangrupikeun versi plugin anjeun, url mangrupikeun tautan kana gudang, sareng commit mangrupikeun hash commit dimana versi khusus plugin bakal sayogi.

Sareng dina kaluaran anjeun bakal ningali gambar anu saé sapertos:

Ngembangkeun plugin pikeun Grafana: sajarah nembak badag

Data pikeun éta bakal otomatis dicandak tina Readme.md anjeun, Changelog.md sareng file plugin.json sareng pedaran plugin.

Bagian 6: tinimbang conclusions

Kami henteu lirén ngembangkeun plugin kami saatos dileupaskeun. Sareng ayeuna urang nuju ngusahakeun leres-leres ngawaskeun pamakean sumber daya titik kluster, ngenalkeun fitur-fitur anyar pikeun ningkatkeun UX, sareng ogé nyéépkeun seueur eupan balik anu ditampi saatos masang plugin ku klien kami sareng ti jalma-jalma di GitHub (upami anjeun ngantunkeun. masalah anjeun atanapi pamenta tarik, kuring bakal bagja pisan :)

Kami ngarepkeun tulisan ieu bakal ngabantosan anjeun ngartos alat anu saé sapertos Grafana sareng, panginten, nyerat plugin anjeun nyalira.

Hatur nuhun!)

sumber: www.habr.com

Tambahkeun komentar