{"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: \u00f5ppetunnid ja kogemused","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Tere k\u00f5igile! M\u00f5ned kuud tagasi k\u00e4ivitasime tootmises meie uue avatud l\u00e4htekoodiga projekti \u2014 Grafana plugina Kubernetes'i j\u00e4lgimiseks, 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 GitHub'i hoidlas<\/a><\/noindex>. Ja selles artiklis tahame jagada teiega lugu sellest, kuidas me plugina loomisega alustasime, milliseid t\u00f6\u00f6riistu kasutasime ja milliste takistustega silmitsi seisisime arenduse k\u00e4igus. Alustame!<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h4>Osa 0 \u2014 sissejuhatus: kuidas me siia j\u00f5udsime?<\/h4>\n<p>\nM\u00f5te kirjutada omaenda plugin Grafanale tekkis meile t\u00e4iesti juhuslikult. Meie ettev\u00f5te on enam kui 10 aastat tegelenud erineva keerukusega veebiprojektide j\u00e4lgimisega. Selle aja jooksul oleme kogunud suure hulga teadmisi, huvitavaid juhtumeid ja kogemusi erinevate j\u00e4lgimiss\u00fcsteemide kasutamisest. Ja mingil hetkel k\u00fcsisime endalt: \u201eKas on olemas maagiline t\u00f6\u00f6riist Kubernetes'i j\u00e4lgimiseks, et nagu \u00f6eldakse, \u201epaned paika ja unustad\u201d?..\u201c Kubernetes'i j\u00e4lgimise valdkonna standardiks on juba ammu olnud kombinatsioon Prometheus + Grafana. Ja selle tehnoloogiapaki jaoks on olemas suur hulk erinevaid t\u00f6\u00f6riistu: prometheus-operator, kubernetes-mixin paneelide kogum, grafana-kubernetes-app. <\/p>\n<p>Meile n\u00e4is k\u00f5ige huvitavam valik olevat grafana-kubernetes-app plugin, kuid see ei ole enam \u00fcle aasta toetust saanud ning lisaks ei oska see t\u00f6\u00f6tada uusimate versioonide node-exporter'i ja kube-state-metrics'iga. Ja mingil hetkel otsustasime: \u201e\u00c4kki ei tee me oma lahendust?\u201d<\/p>\n<p>Milliseid ideid otsustasime oma plugina realiseerida:<\/p>\n<ul>\n<li>rakenduse kaardi visualiseerimine: mugav rakenduste esitus klastris, r\u00fchmitatuna namespace'ide, deployment'ite kaupa\u2026;<\/li>\n<li>suhete visualiseerimine t\u00fc\u00fcpi \u201edeployment \u2014 teenus (+portid)\u201d.<\/li>\n<li>klastri rakenduste jaotumise visualiseerimine klastris olevate nod'i vahel.<\/li>\n<li>metriikide ja teabe kogumine mitmest allikast: Prometheus ja Kubernetes'i API server.<\/li>\n<li>infrastruktuuri j\u00e4lgimine (protsessoriaja, m\u00e4lu, k\u00f5vakettateenuse ja v\u00f5rgu kasutamine), samuti rakenduste loogika j\u00e4lgimine \u2014 pod'ide tervisestatus, saadaval olevate koopiate arv, teave liveness\/readyness testide l\u00e4bimise kohta.<\/li>\n<\/ul>\n<p><\/p>\n<h4>Osa 1: Mis on \u201eGrafana plugin\u201c?<\/h4>\n<p>\nTehnilisest vaatenurgast on Grafana plugin Angulari kontrollija, mis salvestatakse Grafana data katalooge.<i>\/var\/grafana\/plugins\/&lt;your_plugin_name&gt;\/dist\/module.js<\/i>) ja v\u00f5ib laadida SystemJS-modulina. Samuti peab selle katalooge olema fail plugin.json, mis sisaldab kogu teavet teie plugina kohta: nimi, versioon, plugina t\u00fc\u00fcp, lingid hoidla\/sait\/ litsents, s\u00f5ltuvused ja nii edasi.<\/p>\n<p><img decoding=\"async\" alt=\"Grafana plugina arendamine: \u00f5ppetunnid ja kogemused\" 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: \u00f5ppetunnid ja kogemused\" src=\"\/wp-content\/uploads\/2019\/11\/1e5b780837e5a9385e5e22a27d83f567.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>plugin.json<\/i><\/p>\n<p>Nagu n\u00e4ha ekraanipildilt, oleme m\u00e4\u00e4ranud plugin.type = app. Grafana pluginaid on kolm t\u00fc\u00fcpi:<\/p>\n<p><b>paneel<\/b>: k\u00f5ige levinum plugina t\u00fc\u00fcp \u2014 esindab paneeli, mis visualiseerib teatud m\u00f5\u00f5dikuid, kasutatakse erinevate armatuurlaudade loomiseks.<br \/>\n<b>andmeallika<\/b>: andmeallika konnektor (n\u00e4iteks Prometheus-datasource, ClickHouse-datasource, ElasticSearch-datasource).<br \/>\n<b>app<\/b>: plugin, mis v\u00f5imaldab teil luua oma frontendi rakenduse Grafanas, luua oma html-lehti ja manuaalselt p\u00f6\u00f6rduda andmeallika poole, et visualiseerida erinevaid andmeid. Samuti v\u00f5ivad s\u00f5ltuvustena kasutada muid plugina t\u00fc\u00fcpe (andmeallikas, paneel) ja erinevaid armatuurlaudu.<\/p>\n<p><img decoding=\"async\" alt=\"Grafana plugina arendamine: \u00f5ppetunnid ja kogemused\" src=\"\/wp-content\/uploads\/2019\/11\/3cd53c7c3a2635f3f20831d52198b5f0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>N\u00e4ide plugina s\u00f5ltuvustest t\u00fc\u00fcbi = app kohta<\/i>.<\/p>\n<p>Programmeerimiskeelena saab kasutada nii JavaScripti kui ka TypeScripti (me oleme valinud viimase). Valmistooted hello-world pluginate jaoks igasugustes t\u00fc\u00fcpidest leiate <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/CorpGlory\">\u00fchenduse kaudu<\/a><\/noindex>: see hoidla sisaldab suurt hulka starter-pack'e (sealhulgas eksperimenteerimiste n\u00e4olu plugina React'i peal) koos eelinstallitud ja konfigureeritud kogumikega. <\/p>\n<h4>Osa 2: kohaliku keskkonna ettevalmistamine<\/h4>\n<p>\nPlugina arendamiseks on meil loomulikult vaja kubernetes klastri k\u00f5igi eelkohustuslike t\u00f6\u00f6riistadega: prometheus, node-exporter, kube-state-metrics, grafana. Keskkond peab olema seadistatav kiiresti, kergelt ja vaevata, ja hot-reload andmete kausta jaoks peab Grafana kaust olema otseselt arendaja masinast m\u00e4hitud.<\/p>\n<p>Meie arvates on kubernetes'ega kohalikuks t\u00f6\u00f6ks k\u00f5ige mugavam <noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/docs\/tasks\/tools\/install-minikube\/\">minikube<\/a><\/noindex>. J\u00e4rgmine samm on installida Prometheus + Grafana koos prometheus-operatoriga. K\u00e4esolevas <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/faun\/trying-prometheus-operator-with-helm-minikube-b617a2dccfa3\">selles artiklis<\/a><\/noindex> on \u00fcksikasjalikult kirjeldatud prometheus-operatori installimise protsessi minikube'is. P\u00fcsivuse sissel\u00fclitamiseks on vajalik seadistada parameeter <i>persistence: true<\/i> charts\/grafana\/values.yaml failis, lisada oma PV ja PVC ning m\u00e4\u00e4rata need parameetrisse persistence.existingClaim<\/p>\n<p>Meie l\u00f5plik minikube'i k\u00e4ivitamisskript n\u00e4eb v\u00e4lja j\u00e4rgmine:<\/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: arendamine<\/h4>\n<p>\n<b>Objektimudel<\/b><\/p>\n<p>Plugin'i rakendamise ettevalmistamiseks otsustasime kirjeldada k\u00f5iki p\u00f5hielemente Kubernetes'is, millega me t\u00f6\u00f6tame, TypeScript'i klassidena: pod, deployment, daemonset, statefulset, job, cronjob, service, node, namespace. Iga\u00fcks neist klassidest p\u00e4rib \u00fcldklassist BaseModel, milles on kirjeldatud konstruktor, destruktor, meetodid uuendamiseks ja n\u00e4htavuse vahetamiseks. Igas klassis on kirjeldatud ka sisemised suhted teiste elementidega, n\u00e4iteks deployment'i t\u00fc\u00fcpi elemendi pod'id.<\/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 v\u00e4lja tuua v\u00f5i seada meile vajalikud metrikad elementide m\u00f5istetaval ja loetaval kujul. N\u00e4iteks vormindatud v\u00e4ljund allocatable cpu nod'ist:<\/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 plugin'i k\u00f5igi lehtede nimekiri on algselt kirjeldatud meie pluing.json failis s\u00f5ltuvuste osas:<\/p>\n<p><img decoding=\"async\" alt=\"Grafana plugina arendamine: \u00f5ppetunnid ja kogemused\" src=\"\/wp-content\/uploads\/2019\/11\/b86c74839ad0d9c64b97ffc3f2a84bdf.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIga lehe jaoks peame m\u00e4\u00e4rama LEHE NIME (mille abil see leht hiljem slug'iks konvertitakse); komponendi nime, mis vastutab selle lehe t\u00f6\u00f6 eest (komponentide nimekiri eksporditakse module.ts); kasutaja rolli, kellele on see leht ja sidumise seaded saadaval, ning navigatsiooni seadistused k\u00fclgriba jaoks. <\/p>\n<p>Komponendis, mis vastutab lehe t\u00f6\u00f6 eest, peame seadma templateUrl, edastades sinna html-faili tee, kus on mark-up. Kontrollija sees saame s\u00f5ltuvuse sisestamise kaudu juurdep\u00e4\u00e4su kahele olulisele angular-teenusele:<\/p>\n<ul>\n<li>backendSrv \u2014 teenus, mis tagab suhtluse grafana api-serveriga;<\/li>\n<li>datasourceSrv \u2014 teenus, mis tagab kohapealse suhtluse k\u00f5igi sinu Grafanas installitud andmeallikatega (n\u00e4iteks meetod .getAll() \u2014 tagastab nimekirja k\u00f5igist installitud andmeallikatest; .get() \u2014 tagastab konkreetse andmeallika objekti-instandi.<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Grafana plugina arendamine: \u00f5ppetunnid ja kogemused\" 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: \u00f5ppetunnid ja kogemused\" 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: \u00f5ppetunnid ja kogemused\" 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 datasource t\u00e4pselt sama t\u00fc\u00fcpi plugin nagu k\u00f5ik teised: sellel on oma sisenemispunkt module.js ja metaandmete fail plugin.json. Kui arendame pluginat t\u00fc\u00fcbiga app, saame suhelda nii olemasolevate datasource'idega (n\u00e4iteks prometheus-datasource) kui ka omaenda, mida saame hoida otse pluginakataloogis (dist\/datasource\/*) v\u00f5i paigaldada s\u00f5ltuvusena. Meie puhul tarnitakse datasource koos pluginakoodiga. Samuti on vajalik config.html mall ja ConfigCtrl kontrollija, mida kasutatakse datasource'i eksemplari konfigureerimise lehel ja Datasource kontrollija jaoks, kus on teostatud teie datasource'i t\u00f6\u00f6d loogika.<\/p>\n<p>Pluginas KubeGraf, kasutajaliidese vaatenurgast, esindab datasource kubernetes-klastri eksemplari, kus on rakendatud j\u00e4rgmised v\u00f5imalused (allikakood on saadaval <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/devopsprodigy\/kubegraf\/tree\/master\/src\/datasource\">linki pidi<\/a><\/noindex>):<\/p>\n<ul>\n<li>andmete kogumine k8s api-server'ist (namespace'ide, deployment'ide jne. loendi saamine)<\/li>\n<li>p\u00e4ringute edastamine prometheus-datasource'ile (mis valitakse pluginaseadetes iga konkreetse klastrite jaoks) ja vastuste vormindamine andmete kasutamiseks nii staatilistes lehtedes kui ka armatuurlaudadel.<\/li>\n<li>andmete v\u00e4rskendamine pluginas staatilistes lehtedes (kehtiva v\u00e4rskendussagedusega).<\/li>\n<li>p\u00e4ringute t\u00f6\u00f6tlemine template-loendi koostamiseks grafana-dashboards (meetod .metriFindQuery())<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Grafana plugina arendamine: \u00f5ppetunnid ja kogemused\" 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: \u00f5ppetunnid ja kogemused\" 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: \u00f5ppetunnid ja kogemused\" 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-klastriga.<\/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 korras\", title: \"Edu\"};\n           }else{\n               return {status: \"error\", message: \"Andmeallikas ei ole korras\", title: \"Viga\"};\n           }\n       }, error =&gt; {\n           return {status: \"error\", message: \"Andmeallikas ei ole korras\", title: \"Viga\"};\n       })\n}<\/code><\/pre>\n<p>\nMeie arvates on eriliselt huvitav aspekt andmeallika autentimise ja autoriseerimise mehhanismi rakendamine. Tavaliselt saame me h\u00f5lpsasti kasutada Grafana sisseehitatud komponenti \u2014 datasourceHttpSettings, et konfigureerida juurdep\u00e4\u00e4su l\u00f5pp-andmeallikale. Selle komponendi abil saame seada http-andmeallika p\u00e4ringu, m\u00e4rkides url ja p\u00f5hiseaded autentimise\/autoriseerimise jaoks: kasutajanimi-parool v\u00f5i client-cert\/client-key. Selleks, et rakendada juurdep\u00e4\u00e4su seadistamise v\u00f5imalust bearer-tokeniga (de facto standard k8s jaoks), pidime natuke \u201ekemplema\u201d.<\/p>\n<p>Selle probleemi lahendamiseks saab kasutada Grafana sisseehitatud mehhanismi \u201ePlugin Routes\u201d (lisainfo <noindex><a rel=\"nofollow\" href=\"https:\/\/grafana.com\/docs\/plugins\/developing\/auth-for-datasources\/\">ametlikult dokumentatsioonilehel<\/a><\/noindex>). Meie andmeallika seadetes saame m\u00e4\u00e4ratleda reeglite kogumi, mida grafana proxy-server t\u00f6\u00f6tleb. N\u00e4iteks iga eraldi endpoint'i jaoks on v\u00f5imalik m\u00e4\u00e4rata pealkirju v\u00f5i url-e, kasutades mallide loomise v\u00f5imalust, mille andmed v\u00f5ivad tulla jsonData ja secureJsonData (salajaste andmete v\u00f5i tokenite kr\u00fcptitud kujul hoidmiseks) v\u00e4liidest. Meie n\u00e4ites on p\u00e4ringud, mis n\u00e4evad v\u00e4lja <i>\/__proxy\/api\/v1\/namespaces<\/i> proksitud url-ile, mis n\u00e4eb v\u00e4lja<br \/>\n\/api\/v1\/namespaces, kus on m\u00e4\u00e4ratud pealkiri Authorization: Bearer.<\/p>\n<p><img decoding=\"async\" alt=\"Grafana plugina arendamine: \u00f5ppetunnid ja kogemused\" 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: \u00f5ppetunnid ja kogemused\" src=\"\/wp-content\/uploads\/2019\/11\/9dab7537d7ccba90c9fb62dfa70b9fe2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMuidugi, et t\u00f6\u00f6tada k8s api-serveriga, vajame me kasutajat koos readonly juurdep\u00e4\u00e4suga, mille loomiseks m\u00f5eldud manifestid on samuti saadaval <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/devopsprodigy\/kubegraf\/tree\/master\/kubernetes\/\">plugin-koodi all<\/a><\/noindex>.<\/p>\n<h4>Osa 5: v\u00e4ljaanne<\/h4>\n<p>\n<img decoding=\"async\" alt=\"Grafana plugina arendamine: \u00f5ppetunnid ja kogemused\" src=\"\/wp-content\/uploads\/2019\/11\/3991a5d412f362770157fc567bb8009c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nP\u00e4rast oma Grafana plugina kirjutamist saate loomulikult soovida seda avatud kasutada. Grafanas on pluginate teek, mis on saadaval aadressil <noindex><a rel=\"nofollow\" href=\"https:\/\/grafana.com\/grafana\/plugins\">grafana.com\/grafana\/plugins<\/a><\/noindex> <\/p>\n<p>Kuna teie plugin oleks ametlikus poes n\u00e4htav, peate tegema PR <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/grafana\/grafana-plugin-repository\">seda repot<\/a><\/noindex>, lisades failisse repo.json j\u00e4rgmise sisu:<\/p>\n<p><img decoding=\"async\" alt=\"Grafana plugina arendamine: \u00f5ppetunnid ja kogemused\" src=\"\/wp-content\/uploads\/2019\/11\/160650bf37f8f2f3e12ef7dd291e90eb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nkus version \u2014 teie plugina versioon, url \u2014 link repole ja commit \u2014 commit'i hash, mille alusel konkreetne plugina versioon on saadaval. <\/p>\n<p>Ja l\u00f5pptulemuseks on imeline pilt:<\/p>\n<p><img decoding=\"async\" alt=\"Grafana plugina arendamine: \u00f5ppetunnid ja kogemused\" src=\"\/wp-content\/uploads\/2019\/11\/ff906396596e9c4c15c59f8d53555f52.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAndmed selle jaoks saavad automaatselt l\u00e4bi vaadatavaks teie Readme.md, Changelog.md ja plugin.json failist, mis kirjeldab plugina.<\/p>\n<h4>Osa 6: j\u00e4reldused<\/h4>\n<p>\nMe ei ole p\u00e4rast litsentsi v\u00e4ljaandmist oma pistikprogrammi arendust peatatud. Praegu t\u00f6\u00f6tame m\u00f5istliku klastrinoodide ressursside j\u00e4lgimise, uusi funktsioonide rakendamise UX parandamiseks ja suurte tagasisidehulga t\u00f6\u00f6tlemise kallal, mida oleme saanud pistikprogrammi installimise k\u00e4igus nii oma klientidelt kui ka GitHubi probleemide kaudu (kui j\u00e4tate oma probleemide v\u00f5i pull request'i, olen v\u00e4ga \u00f5nnelik \ud83d\ude42).<\/p>\n<p>Loodame, et see artikkel aitab teil m\u00f5ista suurep\u00e4rast t\u00f6\u00f6riista nagu Grafana ning v\u00f5ib-olla kirjutada omaenda 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 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442!\" \/>\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) 5.0.1.1\" \/>\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!\" \/>\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\udd47Grafana pistikprogrammi arendamine: kogemuste ajalugu | ProHoster","description":"Tere k\u00f5igile!","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!","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","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"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}]}}