{"id":52343,"date":"2019-11-06T00:00:00","date_gmt":"2019-11-05T21:00:00","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/razrabotka-plagina-dlya-grafana-istoriya-nabityh-shishek"},"modified":"2020-02-18T14:00:02","modified_gmt":"2020-02-18T11:00:02","slug":"razrabotka-plagina-dlya-grafana-istoriya-nabityh-shishek","status":"publish","type":"post","link":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/razrabotka-plagina-dlya-grafana-istoriya-nabityh-shishek","title":{"rendered":"Grafana plugina arendamine: kogemuste jagamine","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Tere k\u00f5ik! Mitme kuu eest k\u00e4ivitasime tootmisse meie uue avatud l\u00e4htekoodiga projekti \u2014 Grafana plugina, mis on m\u00f5eldud Kubernetes'e j\u00e4lgimiseks ja mille nimeks saime <b><noindex><a rel=\"nofollow\" href=\"https:\/\/grafana.com\/grafana\/plugins\/devopsprodigy-kubegraf-app\">DevOpsProdigy KubeGraf<\/a><\/noindex><\/b>. Plugina l\u00e4htekood on saadaval <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/devopsprodigy\/kubegraf\">avalikus GitHubi repos<\/a><\/noindex>. Selles artiklis soovime jagada teiega lugu sellest, kuidas me plugina l\u00f5ime, milliseid t\u00f6\u00f6riistu kasutasime ja milliste takistustega arendamise k\u00e4igus silmitsi seisisime. Alustame!<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h4>Osa 0 \u2014 sissejuhatus: kuidas me niimoodi siia j\u00f5udsime?<\/h4>\n<p>\nIdee kirjutada oma plugina Grafanale tuli meile t\u00e4iesti juhuslikult. Meie ettev\u00f5te on juba \u00fcle 10 aasta tegelenud erineva keerukusega veebiprojektide monitooringuga. Selle aja jooksul oleme kogunud suure hulga teadmisi, huvitavaid n\u00e4iteid ja kogemusi erinevate monitooringus\u00fcsteemide kasutamisel. Ja mingil hetkel k\u00fcsisime endalt: \"Kas on olemas maagiline t\u00f6\u00f6riist Kubernetes'e monitooringuks, et, nagu \u00f6eldakse, 'pane ja unusta'\"?.. K8s monitooringu standardiks on loomulikult ammu juba kombinatsioon Prometheus + Grafana. Ja antud tehnoloogiakomplekti jaoks on olemas suur hulk erinevaid lahendusi: prometheus-operator, kubernetes-mixin dashi komplekt, grafana-kubernetes-app. <\/p>\n<p>Meie jaoks tundus k\u00f5ige huvitavam variant olema plugina grafana-kubernetes-app, kuid seda ei toetata enam rohkem kui aasta ja lisaks ei suuda see t\u00f6\u00f6tada uute node-exporteri ja kube-state-metrics'e versioonidega. Ja mingil hetkel otsustasime: \"Kas me ei peaks tegema oma lahenduse?\"<\/p>\n<p>Milliseid ideid otsustasime oma plugina ellu viia:<\/p>\n<ul>\n<li>rakenduste \"rakenduse kaart\": mugav rakenduste esitamine klassis, r\u00fchmitatuna namespace'i ja deployment'ite kaupa\u2026;<\/li>\n<li>seoste visualiseerimine t\u00fc\u00fcbis \"deployment \u2014 teenus (+ports)\".<\/li>\n<li>rakenduste jaotuse visualiseerimine klassi nod'ides.<\/li>\n<li>m\u00f5\u00f5dikute ja teabe kogumine mitmest allikast: Prometheus ja k8s api server.<\/li>\n<li>monitoring nii infrastruktuuri osana (kasutatud protsessori aega, m\u00e4lu, diskiallikat, v\u00f5rku) kui ka rakenduste loogika \u2014 pod'ide health-status, saadaval olevate replikate arv, teave liveness\/readyness testide l\u00e4bimise kohta.<\/li>\n<\/ul>\n<p><\/p>\n<h4>Osa 1: Mis on \"Grafana plugin\"?<\/h4>\n<p>\nTehnilisest vaatepunktist on Grafana plugin angular-kontroller, mis asub Grafana data-kaustas (<i>\/var\/grafana\/plugins\/&lt;your_plugin_name&gt;\/dist\/module.js<\/i>) ja saab laadida SystemJS-moodulina. Samuti peaks selles kaustas olema fail plugin.json, mis sisaldab kogu metaandmeid teie plugina kohta: nimi, versioon, plugina t\u00fc\u00fcp, lingid hoidla\/veebi\/ litsentsi, s\u00f5ltuvused jne.<\/p>\n<p><img decoding=\"async\" alt=\"Grafana plugina arendamine: kogemuste jagamine\" src=\"\/wp-content\/uploads\/2019\/11\/5993fec77a3904ed8b9e19a5addbb6ea.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>module.ts<\/i><\/p>\n<p><img decoding=\"async\" alt=\"Grafana plugina arendamine: kogemuste jagamine\" src=\"\/wp-content\/uploads\/2019\/11\/1e5b780837e5a9385e5e22a27d83f567.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>plugin.json<\/i><\/p>\n<p>Kuidas on pildil n\u00e4ha, oleme m\u00e4\u00e4ranud plugin.type = app. Sest Grafana pluginad v\u00f5ivad olla kolme t\u00fc\u00fcpi:<\/p>\n<p><b>paneel<\/b>: k\u00f5ige levinum pluginat\u00fc\u00fcp \u2013 esindab paneeli, mis visualiseerib teatud n\u00e4itajaid, ja kasutatakse erinevate juhtpaneelide loomiseks.<br \/>\n<b>andmeallikaks<\/b>: andmeallika konnektoriplaan (nt Prometheus-datasource, ClickHouse-datasource, ElasticSearch-datasource).<br \/>\n<b>app<\/b>: plugin, mis v\u00f5imaldab teil luua omaenda front-end rakenduse Grafana-s, luua oma HTML-lehti ja manuaalselt p\u00f6\u00f6rduda andmeallika poole erinevate andmete visualiseerimiseks. Samuti v\u00f5ivad s\u00f5ltuvustena kasutada teisi t\u00fc\u00fcpe pluginaid (datasource, panel) ja erinevaid juhtpaneele.<\/p>\n<p><img decoding=\"async\" alt=\"Grafana plugina arendamine: kogemuste jagamine\" src=\"\/wp-content\/uploads\/2019\/11\/3cd53c7c3a2635f3f20831d52198b5f0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Pluginate s\u00f5ltuvuste n\u00e4idis t\u00fc\u00fcbi = rakendus<\/i>.<\/p>\n<p>Programmeerimiskeelena saab kasutada nii JavaScripti kui ka TypeScripti (meie valik langes viimasele). Igasuguste pluginat\u00fc\u00fcbi hello-world malli leiate <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/CorpGlory\">lingilt<\/a><\/noindex>: selles hoidlas on suur hulk starter-packe (seal on isegi eksperimentaalne Reacti plugin) eelinstallitud ja konfigureeritud ehitajatega. <\/p>\n<h4>Osa 2: kohaliku keskkonna ettevalmistamine<\/h4>\n<p>\nPluginiga t\u00f6\u00f6tamiseks on meil loomulikult vaja kubernetes-kl\u00f5ster k\u00f5igi eelinstallitud t\u00f6\u00f6riistadega: prometheus, node-exporter, kube-state-metrics, grafana. Keskkond peab olema kiiresti, lihtsalt ja mugavalt seadistatud ning hot-reloadi tagamiseks peab Grafana andmekaust olema otse arendaja masina k\u00fclge monteeritud.<\/p>\n<p>Meie arvates on mugavaim viis kohaliku t\u00f6\u00f6 tegemiseks kubernetesega <noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/docs\/tasks\/tools\/install-minikube\/\">minikube<\/a><\/noindex>. J\u00e4rgmise sammu k\u00e4igus installime Prometheus + Grafana komplekti prometheus-operatori abil. <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/faun\/trying-prometheus-operator-with-helm-minikube-b617a2dccfa3\">selles artiklis<\/a><\/noindex> Protsessi prometheus-operatori installimiseks minikubes on kirjeldatud \u00fcksikasjalikult. P\u00fcsivuse lubamiseks tuleb seadistada parameeter <i>persistence: true<\/i> failis charts\/grafana\/values.yaml, lisada oma PV ja PVC ning viidata neile parameetriga persistence.existingClaim.<\/p>\n<p>L\u00f5ppkokkuv\u00f5ttes n\u00e4eb meie minikube'i k\u00e4ivitus skript v\u00e4lja selline:<\/p>\n<pre><code class=\"plaintext\">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\nminikube mount \n\/home\/sergeisporyshev\/Projects\/Grafana:\/var\/grafana --gid=472 --uid=472 --9p-version=9p2000.L<\/code><\/pre>\n<p><\/p>\n<h4>Osa 3: arendust\u00f6\u00f6<\/h4>\n<p>\n<b>Objekti mudel<\/b><\/p>\n<p>Plugin'i rakendamiseks valmistudes otsustasime kirjeldada k\u00f5iki Kubernetes'i p\u00f5hielemente, millega me t\u00f6\u00f6tame, TypeScript'i klasside kujul: pod, deployment, daemonset, statefulset, job, cronjob, service, node, namespace. Iga\u00fcks neist klassidest p\u00e4rineb \u00fchest baasklassist BaseModel, kus on kirjeldatud konstruktor, deconstructor, meetodid uuendamiseks ja n\u00e4htavuse muutmiseks. Igas klassis on kirjas loetelud, mis on seotud teiste elementidega, n\u00e4iteks deployment'i t\u00fc\u00fcpi elemendi pod'ide nimekiri.<\/p>\n<pre><code class=\"plaintext\">import {Pod} from \".\/pod\";\nimport {Service} from \".\/service\";\nimport {BaseModel} from '.\/traits\/baseModel';\n\nexport class Deployment extends BaseModel{\n   pods: Array;\n   services: Array;\n\n   constructor(data: any){\n       super(data);\n       this.pods = [];\n       this.services = [];\n   }\n}<\/code><\/pre>\n<p>\nGetter'ite ja setter'ite abil saame n\u00e4idata v\u00f5i m\u00e4\u00e4rata vajalikud elemendi m\u00f5\u00f5dikud mugavas ja arusaadavas vormingus. N\u00e4iteks vormindatud v\u00e4ljund allocatable cpu nod'ile:<\/p>\n<pre><code class=\"plaintext\">get cpuAllocatableFormatted(){\n   let cpu = this.data.status.allocatable.cpu;\n   if(cpu.indexOf('m') &gt; -1){\n       cpu = parseInt(cpu)\/1000;\n   }\n   return cpu;\n}<\/code><\/pre>\n<p>\n<b>Lehed<\/b><\/p>\n<p>Meie plugina k\u00f5igi lehtede loetelu on algselt kirjeldatud meie pluing.json-is s\u00f5ltuvuste jaos:<\/p>\n<p><img decoding=\"async\" alt=\"Grafana plugina arendamine: kogemuste jagamine\" src=\"\/wp-content\/uploads\/2019\/11\/b86c74839ad0d9c64b97ffc3f2a84bdf.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIga lehe jaotises peame n\u00e4itama LEHE PEALKIRJA (see konverteeritakse hiljem slug'iks, mille kaudu see leht on saadaval); komponendi nimetuse, mis vastutab selle lehe toimimise eest (komponentide nimekiri eksporditakse module.ts); kasutaja rolli m\u00e4\u00e4ramine, kellele see leht on saadaval ja k\u00fclgriba navigeerimise seadistamine. <\/p>\n<p>Lehe t\u00f6\u00f6tluse komponendis peame seadma templateUrl, edastades sinna html-faili tee, kus on m\u00e4rgistamine. Kontrolleris saame dependency injection'i kaudu ligip\u00e4\u00e4su kahele olulisele angular-teenusele:<\/p>\n<ul>\n<li>backendSrv \u2014 teenus, mis tagab suhtlemise grafana api-serveriga;<\/li>\n<li>datasourceSrv \u2014 teenus, mis tagab kohaliku suhtluse k\u00f5igi teie Grafanas installitud andmeallikatega (n\u00e4iteks meetod .getAll() \u2014 tagastab k\u00f5igi installitud andmeallikate nimekirja; .get(&lt;n\u0430me&gt;) \u2014 tagastab kindla andmeallika objekti-instantsse.<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Grafana plugina arendamine: kogemuste jagamine\" src=\"\/wp-content\/uploads\/2019\/11\/e616e74c2e31ca3a81b7ed91ca333208.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Grafana plugina arendamine: kogemuste jagamine\" src=\"\/wp-content\/uploads\/2019\/11\/5e1d45f570dda50774088405abb41c9f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Grafana plugina arendamine: kogemuste jagamine\" src=\"\/wp-content\/uploads\/2019\/11\/c072867623824e799518984c7b1bee93.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h4>Osa 4: andmeallikas<\/h4>\n<p>\nGrafana vaatepunktist on andmeallikas t\u00e4pselt samasugune plugin nagu k\u00f5ik teised: sellel on oma sissejuhatus module.js, ning metainfo fail plugin.json. Rakenduse t\u00fc\u00fcbi plugina arendamisel saame suhelda nii olemasolevate andmeallikatega (n\u00e4iteks prometheus-datasource) kui ka meie enda andmeallikatega, mida saame hoida otse plugina kataloogis (dist\/datasource\/*) v\u00f5i installida s\u00f5ltuvusena. Meie puhul tuleb andmeallikas koos plugina koodiga. Samuti on vajalik config.html malli olemasolu ja ConfigCtrl kontroller, mida kasutatakse andmeallika eksemplari konfigureerimise lehe jaoks ning andmeallika kontroller, mille sees toimub teie andmeallika toimimisloogika.<\/p>\n<p>KubeGraf plugina puhul, kasutajaliidese vaatepunktist, on andmeallikas kubernetes klastrite eksemplar, millel on j\u00e4rgmised v\u00f5imalused (allikakood on saadaval <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/devopsprodigy\/kubegraf\/tree\/master\/src\/datasource\">lingi kaudu<\/a><\/noindex>):<\/p>\n<ul>\n<li>andmete hankimine k8s api-server'ist (namespace'ide, deployment'ide jne loetelu saamine\u2026)<\/li>\n<li>proksimise p\u00e4ringud prometheus-datasource'is (mida valitakse plugina seadetes iga konkreetse r\u00fchma jaoks) ja vastuste vormindamine andmete kasutamiseks nii staatilistes lehtedes kui ka armatuurlaudades.<\/li>\n<li>andmete uuendamine plugina staatilistes lehtedes (kindlaksm\u00e4\u00e4ratud uuendamise ajaga).<\/li>\n<li>p\u00e4ringute t\u00f6\u00f6tlemine template-loendi koostamiseks grafana-dashboards'is (meetod .metriFindQuery())<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Grafana plugina arendamine: kogemuste jagamine\" src=\"\/wp-content\/uploads\/2019\/11\/18159bbb41144ebceb457df28b35e7b1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Grafana plugina arendamine: kogemuste jagamine\" src=\"\/wp-content\/uploads\/2019\/11\/a62665b4409566fbe24f56f88a376d5a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Grafana plugina arendamine: kogemuste jagamine\" src=\"\/wp-content\/uploads\/2019\/11\/7f2d61fce623ce2a3cf62feb6d0447ac.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ul>\n<li>\u00fchenduse testimine l\u00f5pliku k8s-r\u00fchma suhtes.<\/li>\n<\/ul>\n<pre><code class=\"plaintext\">testDatasource(){\n   let url = '\/api\/v1\/namespaces';\n   let _url = this.url;\n   if(this.accessViaToken)\n       _url += '\/__proxy';\n   _url += url;\n   return this.backendSrv.datasourceRequest({\n       url: _url,\n       method: \"GET\",\n       headers: {\"Content-Type\": 'application\/json'}\n   })\n       .then(response =&gt; {\n           if (response.status === 200) {\n               return {status: \"success\", message: \"Andmeallikas on OK\", title: \"Edulugu\"};\n           }else{\n               return {status: \"error\", message: \"Andmeallikas ei ole OK\", title: \"Viga\"};\n           }\n       }, error =&gt; {\n           return {status: \"error\", message: \"Andmeallikas ei ole OK\", title: \"Viga\"};\n       })\n}<\/code><\/pre>\n<p>\nMeie arvates on eriliselt huvitav punkt andmeallika autentimise ja autoriseerimise mehhanismi rakendamine. T\u00fc\u00fcpiliselt saame andmeallika l\u00f5pp-punkti ligip\u00e4\u00e4su konfigureerimiseks kasutada Grafana sisseehitatud komponenti \u2014 datasourceHttpSettings. Selle komponendi abil saame seadistada ligip\u00e4\u00e4su http-andmeallikale, m\u00e4\u00e4rates url ja autentimise\/autoriseerimise p\u00f5hiseaded: kasutajanimi-parool v\u00f5i client-cert\/client-key. Bearer-tunnuse (de facto standard k8s-i jaoks) abil ligip\u00e4\u00e4su seadistamine n\u00f5udis natuke \u201ekeemiat\u201c.<\/p>\n<p>Selle \u00fclesande t\u00e4itmiseks v\u00f5ime kasutada Grafana sisseehitatud mehhanismi \u201ePlugin Routes\u201c (lisainfot leiate <noindex><a rel=\"nofollow\" href=\"https:\/\/grafana.com\/docs\/plugins\/developing\/auth-for-datasources\/\">ametlikult dokumentatsioonilehelt<\/a><\/noindex>). Andmeallika seadistustes saame deklareerida reeglite kogumi, mida t\u00f6\u00f6tleb Grafana proxy-server. N\u00e4iteks iga eraldi l\u00f5pp-punkti jaoks on v\u00f5imalus m\u00e4\u00e4rata p\u00e4iseid v\u00f5i url-e \u0161abloonimise v\u00f5imalusega, mille andmed v\u00f5ivad p\u00e4rineda jsonData ja secureJsonData v\u00e4ljadest (paroolide v\u00f5i tokenite salvestamiseks kr\u00fcpteeritud kujul). Meie n\u00e4ites sarnased p\u00e4ringud <i>\/__proxy\/api\/v1\/namespaces<\/i> proksitakse url vormis<br \/>\n\/api\/v1\/namespaces, lisades Authorization: Bearer p\u00e4ise.<\/p>\n<p><img decoding=\"async\" alt=\"Grafana plugina arendamine: kogemuste jagamine\" src=\"\/wp-content\/uploads\/2019\/11\/ca73ff0fef62fba3edab7907c83639b6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Grafana plugina arendamine: kogemuste jagamine\" src=\"\/wp-content\/uploads\/2019\/11\/9dab7537d7ccba90c9fb62dfa70b9fe2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMuidugi on k8s api-serveriga suhtlemiseks vajalik kasutaja, kellel on ainult lugemis\u00f5igused; manifeste nende loomiseks leiate samuti <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/devopsprodigy\/kubegraf\/tree\/master\/kubernetes\/\">plugin\u2019i l\u00e4htekoodist.<\/a><\/noindex>.<\/p>\n<h4>Osa 5: v\u00e4ljaanne<\/h4>\n<p>\n<img decoding=\"async\" alt=\"Grafana plugina arendamine: kogemuste jagamine\" src=\"\/wp-content\/uploads\/2019\/11\/3991a5d412f362770157fc567bb8009c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nP\u00e4rast oma plugina kirjutamist Grafa jaoks soovite loomulikult selle avatud juurdep\u00e4\u00e4su jaoks jagada. Grafanas on see pluginabiblioteek, mis on saadaval aadressil <noindex><a rel=\"nofollow\" href=\"https:\/\/grafana.com\/grafana\/plugins\">grafana.com\/grafana\/plugins.<\/a><\/noindex> <\/p>\n<p>Et teie plugin oleks ametlikus poes saadaval, peate tegema PR <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/grafana\/grafana-plugin-repository\">sellesse repositooriumi<\/a><\/noindex>, lisades repo.json faili sisu j\u00e4rgmisel kujul:<\/p>\n<p><img decoding=\"async\" alt=\"Grafana plugina arendamine: kogemuste jagamine\" src=\"\/wp-content\/uploads\/2019\/11\/160650bf37f8f2f3e12ef7dd291e90eb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nkus version on teie plugin`i versioon, url on lingi allikas ja commit on hash, mille j\u00e4rgi on saadaval konkreetne versioon. <\/p>\n<p>Ja v\u00e4lja tulevad uimastavad pildid nagu see:<\/p>\n<p><img decoding=\"async\" alt=\"Grafana plugina arendamine: kogemuste jagamine\" src=\"\/wp-content\/uploads\/2019\/11\/ff906396596e9c4c15c59f8d53555f52.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAndmed selle jaoks hangitakse automaatselt teie Readme.md, Changelog.md ja plugin.json failist, kus on plugina kirjeldus.<\/p>\n<h4>Osa 6: j\u00e4relduste asemel<\/h4>\n<p>\nMe ei ole p\u00e4rast v\u00e4ljalaskmist meie pistikprogrammi arendamist l\u00f5petanud. T\u00f6\u00f6 k\u00e4ib praegu korrektse j\u00e4lgimise kallal, et j\u00e4lgida klastrite s\u00f5lmede ressursikasutust, uute funktsioonide rakendamiseks kasutajakogemuse parandamiseks ning lahendame suure hulga tagasisidet, mida oleme saanud pistikprogrammi installimise ajal nii meie klientidelt kui ka GitHubis esitatud k\u00fcsimustest (kui j\u00e4tate oma k\u00fcsimuse v\u00f5i pull request'i, oleksin ma v\u00e4ga \u00f5nnelik \ud83d\ude42 ).<\/p>\n<p>Loodame, et see artikkel aitab teil tutvuda sellise toreda t\u00f6\u00f6riistaga nagu Grafana ja v\u00f5ib-olla kirjutada oma pistikprogrammi. <\/p>\n<p>Ait\u00e4h!)<br \/>\n<br \/>Allikas: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/itsumma\/blog\/474500\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0435\u0441\u044f\u0446\u0435\u0432 \u043d\u0430\u0437\u0430\u0434 \u043c\u044b \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b\u0438 \u0432 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u043d \u043d\u0430\u0448 \u043d\u043e\u0432\u044b\u0439 open-source \u043f\u0440\u043e\u0435\u043a\u0442 \u2014 Grafana-\u043f\u043b\u0430\u0433\u0438\u043d \u0434\u043b\u044f \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 kubernetes, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0437\u0432\u0430\u043b\u0438 DevOpsProdigy KubeGraf. \u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0432 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u043d\u0430 GitHub. \u0410 \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0441 \u0432\u0430\u043c\u0438 \u0438\u0441\u0442\u043e\u0440\u0438\u0435\u0439 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0438 \u043f\u043b\u0430\u0433\u0438\u043d, \u043a\u0430\u043a\u0438\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0438 \u0441 \u043a\u0430\u043a\u0438\u043c\u0438 \u043f\u043e\u0434\u0432\u043e\u0434\u043d\u044b\u043c\u0438 \u043a\u0430\u043c\u043d\u044f\u043c\u0438 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-52343","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0435\u0441\u044f\u0446\u0435\u0432 \u043d\u0430\u0437\u0430\u0434 \u043c\u044b \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b\u0438 \u0432 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u043d \u043d\u0430\u0448 \u043d\u043e\u0432\u044b\u0439 open-source \u043f\u0440\u043e\u0435\u043a\u0442 \u2014 Grafana-\u043f\u043b\u0430\u0433\u0438\u043d \u0434\u043b\u044f \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 kubernetes, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0437\u0432\u0430\u043b\u0438 DevOpsProdigy KubeGraf. \u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0432 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u043d\u0430 GitHub. \u0410 \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0441 \u0432\u0430\u043c\u0438 \u0438\u0441\u0442\u043e\u0440\u0438\u0435\u0439 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0438 \u043f\u043b\u0430\u0433\u0438\u043d, \u043a\u0430\u043a\u0438\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0438 \u0441 \u043a\u0430\u043a\u0438\u043c\u0438 \u043f\u043e\u0434\u0432\u043e\u0434\u043d\u044b\u043c\u0438 \u043a\u0430\u043c\u043d\u044f\u043c\u0438\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/razrabotka-plagina-dlya-grafana-istoriya-nabityh-shishek\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"et_EE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u0434\u043b\u044f Grafana: \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u043d\u0430\u0431\u0438\u0442\u044b\u0445 \u0448\u0438\u0448\u0435\u043a | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0435\u0441\u044f\u0446\u0435\u0432 \u043d\u0430\u0437\u0430\u0434 \u043c\u044b \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b\u0438 \u0432 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u043d \u043d\u0430\u0448 \u043d\u043e\u0432\u044b\u0439 open-source \u043f\u0440\u043e\u0435\u043a\u0442 \u2014 Grafana-\u043f\u043b\u0430\u0433\u0438\u043d \u0434\u043b\u044f \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 kubernetes, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0437\u0432\u0430\u043b\u0438 DevOpsProdigy KubeGraf. \u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0432 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u043d\u0430 GitHub. \u0410 \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0441 \u0432\u0430\u043c\u0438 \u0438\u0441\u0442\u043e\u0440\u0438\u0435\u0439 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0438 \u043f\u043b\u0430\u0433\u0438\u043d, \u043a\u0430\u043a\u0438\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0438 \u0441 \u043a\u0430\u043a\u0438\u043c\u0438 \u043f\u043e\u0434\u0432\u043e\u0434\u043d\u044b\u043c\u0438 \u043a\u0430\u043c\u043d\u044f\u043c\u0438\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/razrabotka-plagina-dlya-grafana-istoriya-nabityh-shishek\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-11-05T21:00:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-18T11:00:02+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Pistikprogrammi arendamine Grafana jaoks: kogemuste jagamine | ProHoster","description":"Tere k\u00f5igile! M\u00f5ni kuu tagasi k\u00e4ivitasime meie uue open-source projekti \u2014 Grafana pistikprogrammi Kubernetes'e j\u00e4lgimiseks, mille nimeks on DevOpsProdigy KubeGraf. Pistikprogrammi l\u00e4htekood on saadaval avalikus repositooriumis GitHubis. Ja selles artiklis soovime jagada teiega lugu sellest, kuidas me pistikprogrammi l\u00f5ime, milliseid t\u00f6\u00f6riistu kasutasime ja millega me kokku puutusime.","canonical_url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/razrabotka-plagina-dlya-grafana-istoriya-nabityh-shishek","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"et_EE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u0434\u043b\u044f Grafana: \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u043d\u0430\u0431\u0438\u0442\u044b\u0445 \u0448\u0438\u0448\u0435\u043a | ProHoster","og:description":"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0435\u0441\u044f\u0446\u0435\u0432 \u043d\u0430\u0437\u0430\u0434 \u043c\u044b \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b\u0438 \u0432 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u043d \u043d\u0430\u0448 \u043d\u043e\u0432\u044b\u0439 open-source \u043f\u0440\u043e\u0435\u043a\u0442 \u2014 Grafana-\u043f\u043b\u0430\u0433\u0438\u043d \u0434\u043b\u044f \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 kubernetes, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0437\u0432\u0430\u043b\u0438 DevOpsProdigy KubeGraf. \u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0432 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u043d\u0430 GitHub. \u0410 \u0432 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u0441 \u0432\u0430\u043c\u0438 \u0438\u0441\u0442\u043e\u0440\u0438\u0435\u0439 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0438 \u043f\u043b\u0430\u0433\u0438\u043d, \u043a\u0430\u043a\u0438\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0438 \u0441 \u043a\u0430\u043a\u0438\u043c\u0438 \u043f\u043e\u0434\u0432\u043e\u0434\u043d\u044b\u043c\u0438 \u043a\u0430\u043c\u043d\u044f\u043c\u0438","og:url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/razrabotka-plagina-dlya-grafana-istoriya-nabityh-shishek","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-11-05T21:00:00+00:00","article:modified_time":"2020-02-18T11:00:02+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"52343","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-24 03:18:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 20:45:28","updated":"2026-01-24 03:18:19"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/52343","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/comments?post=52343"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/52343\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media?parent=52343"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/categories?post=52343"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/tags?post=52343"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}