{"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\/sq\/blog\/administrirovanie\/razrabotka-plagina-dlya-grafana-istoriya-nabityh-shishek","title":{"rendered":"Zhvillimi i nj\u00eb plaku p\u00ebr Grafana: historia e goditjeve t\u00eb ndjera","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>P\u00ebrsh\u00ebndetje t\u00eb gjith\u00ebve! Disa muaj m\u00eb par\u00eb, ne lan\u00e7uam n\u00eb prodhim projektin ton\u00eb t\u00eb ri open-source \u2014 nj\u00eb plugin p\u00ebr Grafana p\u00ebr monitorimin e Kubernetes, t\u00eb cilin e quajtur <b><noindex><a rel=\"nofollow\" href=\"https:\/\/grafana.com\/grafana\/plugins\/devopsprodigy-kubegraf-app\">DevOpsProdigy KubeGraf<\/a><\/noindex><\/b>. Kodi burimor i plugin-it \u00ebsht\u00eb i disponuesh\u00ebm n\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/devopsprodigy\/kubegraf\">repozitin publik n\u00eb GitHub<\/a><\/noindex>. N\u00eb k\u00ebt\u00eb artikull, d\u00ebshirojm\u00eb t\u00eb ndajm\u00eb me ju historin\u00eb e krijimit t\u00eb plugin-it, cilat mjete kemi p\u00ebrdorur dhe me cilat pengesa jemi p\u00ebrballur gjat\u00eb zhvillimit. Le t\u00eb nisim!<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h4>Pjesa 0 \u2014 hyrje: si arrit\u00ebm deri k\u00ebtu?<\/h4>\n<p>\nIdeja p\u00ebr t\u00eb shkruar nj\u00eb plugin t\u00eb vetin p\u00ebr Grafan\u00ebn na lindi krejt rast\u00ebsisht. Kompania jon\u00eb merret me monitorimin e projekteve web p\u00ebr m\u00eb shum\u00eb se 10 vjet. Gjat\u00eb k\u00ebsaj kohe, ne kemi akumuluar nj\u00eb bagazh t\u00eb madh ekspertize, raste interesante dhe p\u00ebrvoj\u00eb n\u00eb p\u00ebrdorimin e sistemeve t\u00eb ndryshme t\u00eb monitorimit. N\u00eb nj\u00eb moment, na erdhi n\u00eb mendje pyetja: \"A ekziston ndonj\u00eb mjet magjik p\u00ebr monitorimin e Kubernetes, q\u00eb mund t\u00eb thuhet se 'e vendos dhe harron'?\".. Standardi industrial p\u00ebr monitorimin e k8s, natyrisht, \u00ebsht\u00eb prej koh\u00ebsh kombinimi Prometheus + Grafana. Dhe p\u00ebr k\u00ebt\u00eb stack, ekziston nj\u00eb gam\u00eb e gjer\u00eb zgjidhjesh t\u00eb gatshme: prometheus-operator, nj\u00eb grup panelesh kubernetes-mixin, grafana-kubernetes-app. <\/p>\n<p>Opsioni m\u00eb interesant p\u00ebr ne duhej t\u00eb ishte plugin grafana-kubernetes-app, por ai nuk mb\u00ebshtetet m\u00eb p\u00ebr m\u00eb shum\u00eb se nj\u00eb vit dhe, p\u00ebr m\u00eb tep\u00ebr, nuk punon me versionet e reja t\u00eb node-exporter dhe kube-state-metrics. N\u00eb nj\u00eb moment, ne vendos\u00ebm: \"Pse t\u00eb mos krijojm\u00eb nj\u00eb zgjidhje ton\u00ebn?\"<\/p>\n<p>Cilat ide vendos\u00ebm t\u00eb realizojm\u00eb n\u00eb pluginin ton\u00eb:<\/p>\n<ul>\n<li>visualizimi i \"hart\u00ebs s\u00eb aplikacionit\": nj\u00eb paraqitje e p\u00ebrshtatshme e aplikacioneve n\u00eb klaster, t\u00eb grupuara sipas namespace-ve, deployment-eve\u2026;<\/li>\n<li>visualizimi i lidhjeve t\u00eb tipit \"deployment \u2014 service (+ports)\".<\/li>\n<li>visualizimi i shp\u00ebrndarjes s\u00eb aplikacioneve t\u00eb klasterit sipas nod-eve t\u00eb klasterit.<\/li>\n<li>mbledhja e metrikeve dhe informacionit nga burime t\u00eb ndryshme: Prometheus dhe k8s api server.<\/li>\n<li>monitorimi i pjes\u00ebs infrastrukturore (p\u00ebrdorimi i koh\u00ebs s\u00eb procesorit, memories, sistemit t\u00eb diskut, rrjetit), si dhe logjik\u00ebs s\u00eb aplikacioneve \u2014 statusi i sh\u00ebndetit t\u00eb pod-eve, numri i replikave t\u00eb disponueshme, informacion mbi kalimin e testeve t\u00eb liveness\/readyness.<\/li>\n<\/ul>\n<p><\/p>\n<h4>Pjesa 1: \u00c7far\u00eb \u00ebsht\u00eb \"plugin p\u00ebr Grafana\"?<\/h4>\n<p>\nNga nj\u00eb perspektiv\u00eb teknike, nj\u00eb plugin p\u00ebr Grafana \u00ebsht\u00eb nj\u00eb kontrollor angular, i cili ruhet n\u00eb drejtorin\u00eb e t\u00eb dh\u00ebnave t\u00eb Grafan\u00ebs (<i>\/var\/grafana\/plugins\/&lt;your_plugin_name&gt;\/dist\/module.js<\/i>) dhe mund t\u00eb ngarkohet si nj\u00eb modul SystemJS. Gjithashtu, n\u00eb k\u00ebt\u00eb direktori duhet t\u00eb ket\u00eb nj\u00eb skedar plugin.json, i cili p\u00ebrmban t\u00eb gjith\u00eb metainformacionin mbi plugin-in tuaj: emri, versioni, tipi i plugin-it, lidhjet me depo\/site\/licenc\u00eb, var\u00ebsit\u00eb dhe k\u00ebshtu me radh\u00eb.<\/p>\n<p><img decoding=\"async\" alt=\"Zhvillimi i nj\u00eb plaku p\u00ebr Grafana: historia e goditjeve t\u00eb ndjera\" 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=\"Zhvillimi i nj\u00eb plaku p\u00ebr Grafana: historia e goditjeve t\u00eb ndjera\" src=\"\/wp-content\/uploads\/2019\/11\/1e5b780837e5a9385e5e22a27d83f567.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>plugin.json<\/i><\/p>\n<p>Si\u00e7 shihet n\u00eb screenshot, ne kemi specifikuar plugin.type = app. Sepse plugins p\u00ebr Grafana mund t\u00eb jen\u00eb t\u00eb tre llojeve:<\/p>\n<p><b>panel<\/b>: lloji m\u00eb i zakonsh\u00ebm i plugjeve \u2014 paraqet nj\u00eb panel p\u00ebr vizualizimin e disa metrikave, p\u00ebrdoret p\u00ebr nd\u00ebrtimin e dashboard-eve t\u00eb ndryshme.<br \/>\n<b>burimi i t\u00eb dh\u00ebnave<\/b>: plugin-connector p\u00ebr nj\u00eb burim t\u00eb dh\u00ebnash (p.sh., Prometheus-datasource, ClickHouse-datasource, ElasticSearch-datasource).<br \/>\n<b>app<\/b>: plugin q\u00eb ju lejon t\u00eb nd\u00ebrtoni aplikacionin tuaj frontend brenda Grafana, t\u00eb krijoni faqet tuaja HTML dhe t\u00eb b\u00ebni thirrje manuale n\u00eb burimin e t\u00eb dh\u00ebnave p\u00ebr vizualizimin e t\u00eb dh\u00ebnave t\u00eb ndryshme. Gjithashtu, si var\u00ebsi mund t\u00eb p\u00ebrdoren plugj t\u00eb llojeve t\u00eb tjera (datasource, panel) dhe dashboard-e t\u00eb ndryshme.<\/p>\n<p><img decoding=\"async\" alt=\"Zhvillimi i nj\u00eb plaku p\u00ebr Grafana: historia e goditjeve t\u00eb ndjera\" src=\"\/wp-content\/uploads\/2019\/11\/3cd53c7c3a2635f3f20831d52198b5f0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Shembulli i var\u00ebsive t\u00eb plugin me llojin = app<\/i>.<\/p>\n<p>Si gjuh\u00eb programuese mund t\u00eb p\u00ebrdorni si JavaScript ashtu edhe TypeScript (ne kemi zgjedhur k\u00ebt\u00eb t\u00eb fundit). Shabllonat p\u00ebr plugin-et hello-world t\u00eb \u00e7do lloji mund t\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/CorpGlory\">gjenden n\u00eb linkun<\/a><\/noindex>: n\u00eb k\u00ebt\u00eb depo paraqiten nj\u00eb num\u00ebr i madh starter-pack\u2019esh (ka edhe nj\u00eb shembull eksperimental t\u00eb plugin-it n\u00eb React) me nd\u00ebrtues t\u00eb paracaktuar dhe t\u00eb konfiguruar. <\/p>\n<h4>Pjesa 2: p\u00ebrgatitja e ambientit lokal<\/h4>\n<p>\nNatyrisht, p\u00ebr t\u00eb punuar me plugin, do na nevojitet nj\u00eb klaster kubernetes me t\u00eb gjitha mjetet e parainstaluara: prometheus, node-exporter, kube-state-metrics, grafana. Mjedisi duhet t\u00eb konfigurohet shpejt, leht\u00eb dhe pa ndihm\u00eb, dhe p\u00ebr t\u00eb siguruar hot-reload, direktoria e t\u00eb dh\u00ebnave t\u00eb Grafana duhet t\u00eb montohet drejtp\u00ebrdrejt nga makina e zhvilluesit.<\/p>\n<p>M\u00ebnyra m\u00eb e p\u00ebrshtatshme p\u00ebr ne p\u00ebr t\u00eb punuar lokal me kubernetes \u00ebsht\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/docs\/tasks\/tools\/install-minikube\/\">minikube<\/a><\/noindex>. Hapi tjet\u00ebr \u00ebsht\u00eb t\u00eb instalojm\u00eb setin Prometheus + Grafana p\u00ebrmes prometheus-operator. N\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/faun\/trying-prometheus-operator-with-helm-minikube-b617a2dccfa3\">k\u00ebto artikull<\/a><\/noindex> \u00ebsht\u00eb p\u00ebrshkruar n\u00eb detaje procesi i instalimit t\u00eb prometheus-operator n\u00eb minikube. P\u00ebr t\u00eb p\u00ebrfshir\u00eb k\u00ebndv\u00ebshtrimin e q\u00ebndrueshm\u00ebris\u00eb, duhet t\u00eb vendosni parametrin <i>persistence: true<\/i> n\u00eb skedarin charts\/grafana\/values.yaml, t\u00eb shtoni PV dhe PVC tuaj dhe t'i regjistroni ata n\u00eb parametrin persistence.existingClaim.<\/p>\n<p>Skripti p\u00ebrfundimtar p\u00ebr nisjen e minikube duket k\u00ebshtu:<\/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>Pjesa 3: zhvillimi i drejtp\u00ebrdrejt\u00eb<\/h4>\n<p>\n<b>Modeli i objektit<\/b><\/p>\n<p>Si p\u00ebrgatitje p\u00ebr zbatimin e plugin-it, ne vendos\u00ebm t\u00eb p\u00ebrshkruajm\u00eb t\u00eb gjitha entitetet baz\u00eb t\u00eb Kubernetes me t\u00eb cilat do t\u00eb punojm\u00eb si klasat TypeScript: pod, deployment, daemonset, statefulset, job, cronjob, service, node, namespace. \u00c7do nj\u00eb nga k\u00ebto klasa trash\u00ebgon nga klasa e p\u00ebrbashk\u00ebt BaseModel, n\u00eb t\u00eb cil\u00ebn p\u00ebrshkruhen konstruktor\u00ebt, destruktor\u00ebt, metodat p\u00ebr azhurnimin dhe kalimin e dukshm\u00ebris\u00eb. N\u00eb secil\u00ebn nga k\u00ebto klasa p\u00ebrshkruhen marr\u00ebdh\u00ebniet e ngjashme me entitete t\u00eb tjera, p\u00ebr shembull, lista e pod-\u00ebve n\u00eb entitetin e tipit deployment.<\/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>\nMe ndihm\u00ebn e getter-\u00ebve dhe setter-\u00ebve, mund t\u00eb nxjerrim ose vendosim metrikat q\u00eb na nevojiten n\u00eb nj\u00eb format t\u00eb p\u00ebrshtatsh\u00ebm dhe lexuesh\u00ebm. P\u00ebr shembull, shp\u00ebrndarja e formatizuar e allocatable cpu t\u00eb nod\u00ebs:<\/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>Faqet<\/b><\/p>\n<p>Lista e t\u00eb gjitha faqeve t\u00eb plugin-it ton\u00eb p\u00ebrshkruhet fillimisht n\u00eb pluing.json ton\u00eb n\u00eb seksionin e var\u00ebsive:<\/p>\n<p><img decoding=\"async\" alt=\"Zhvillimi i nj\u00eb plaku p\u00ebr Grafana: historia e goditjeve t\u00eb ndjera\" src=\"\/wp-content\/uploads\/2019\/11\/b86c74839ad0d9c64b97ffc3f2a84bdf.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nN\u00eb bllokun p\u00ebr \u00e7do faqe, duhet t\u00eb specifikojm\u00eb TITULLIN E FAQES (i cili m\u00eb pas do t\u00eb konvertohet n\u00eb slug, me t\u00eb cilin kjo faqe do t\u00eb jet\u00eb e aksesueshme); titulli i komponentit q\u00eb \u00ebsht\u00eb p\u00ebrgjegj\u00ebs p\u00ebr funksionimin e k\u00ebsaj faqe (lista e komponent\u00ebve eksportohet n\u00eb module.ts); p\u00ebrcaktimi i rolit t\u00eb p\u00ebrdoruesit p\u00ebr t\u00eb cilin \u00ebsht\u00eb e mundur puna me k\u00ebt\u00eb faqe dhe konfigurimi i navigimit p\u00ebr panelin an\u00ebsor. <\/p>\n<p>N\u00eb komponentin q\u00eb merret me faqen, duhet t\u00eb vendosim templateUrl, duke kaluar aty rrug\u00ebn p\u00ebr skedarin html me p\u00ebrb\u00ebrjen. Brenda kontrolluesit, p\u00ebrmes injektimit t\u00eb var\u00ebsive, mund t\u00eb qasemi n\u00eb dy sh\u00ebrbime t\u00eb r\u00ebnd\u00ebsishme angular:<\/p>\n<ul>\n<li>backendSrv \u2014 sh\u00ebrbimi q\u00eb siguron nd\u00ebrveprimin me api-serverin e Grafan\u00ebs;<\/li>\n<li>datasourceSrv \u2014 sh\u00ebrbimi q\u00eb siguron nd\u00ebrveprimin lokal me t\u00eb gjitha burimet e t\u00eb dh\u00ebnave q\u00eb jan\u00eb instaluar n\u00eb Grafan\u00ebn tuaj (p\u00ebr shembull, metoda .getAll() \u2014 kthen list\u00ebn e t\u00eb gjitha burimeve t\u00eb dh\u00ebnave t\u00eb instaluara; .get() \u2014 kthen objekt-instanc\u00ebn e burimit t\u00eb dh\u00ebnave specifik.<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Zhvillimi i nj\u00eb plaku p\u00ebr Grafana: historia e goditjeve t\u00eb ndjera\" src=\"\/wp-content\/uploads\/2019\/11\/e616e74c2e31ca3a81b7ed91ca333208.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Zhvillimi i nj\u00eb plaku p\u00ebr Grafana: historia e goditjeve t\u00eb ndjera\" src=\"\/wp-content\/uploads\/2019\/11\/5e1d45f570dda50774088405abb41c9f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Zhvillimi i nj\u00eb plaku p\u00ebr Grafana: historia e goditjeve t\u00eb ndjera\" src=\"\/wp-content\/uploads\/2019\/11\/c072867623824e799518984c7b1bee93.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h4>Pjesa 4: burimi i t\u00eb dh\u00ebnave<\/h4>\n<p>\nSipas Grafana, burimi i dh\u00ebnash \u00ebsht\u00eb nj\u00eb plugin si t\u00eb tjer\u00ebt: ka pik\u00ebn e tij t\u00eb hyrjes module.js dhe nj\u00eb skedar me t\u00eb dh\u00ebna meta plugin.json. Gjat\u00eb zhvillimit t\u00eb nj\u00eb plugin me tipin = app, mund t\u00eb bashk\u00ebveprojm\u00eb si me burimet e dh\u00ebnash ekzistuese (p.sh., prometheus-datasource), ashtu edhe me ato q\u00eb krijojm\u00eb vet\u00eb, t\u00eb cilat mund t'i ruajm\u00eb direkt n\u00eb direktorin\u00eb e plugin-it (dist\/datasource\/*) ose t'i instalojm\u00eb si var\u00ebsi. N\u00eb rastin ton\u00eb, burimi i dh\u00ebnash jepet s\u00eb bashku me kodin e plugin-it. Gjithashtu, \u00ebsht\u00eb e domosdoshme t\u00eb ket\u00eb nj\u00eb model config.html dhe nj\u00eb kontrollues ConfigCtrl, t\u00eb cilat do t\u00eb p\u00ebrdoren p\u00ebr faqen e konfigurimit t\u00eb instanc\u00ebs s\u00eb burimit t\u00eb dh\u00ebnash dhe kontrolluesit t\u00eb Dhenash, ku implementohet logjika e funksionimit t\u00eb burimit tuaj t\u00eb dh\u00ebnash.<\/p>\n<p>N\u00eb plugin-in KubeGraf, nga pik\u00ebpamja e nd\u00ebrfaqes s\u00eb p\u00ebrdoruesit, burimi i dh\u00ebnash paraqet nj\u00eb instanc\u00eb t\u00eb klasterit kubernetes, i cili implementon kapacitetet e m\u00ebposhtme (kod burimor), <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/devopsprodigy\/kubegraf\/tree\/master\/src\/datasource\">n\u00eb lidhje<\/a><\/noindex>):<\/p>\n<ul>\n<li>marrjen e t\u00eb dh\u00ebnave nga api-server-i k8s (marrja e list\u00ebs s\u00eb namespace-ve, deployments\u2026)<\/li>\n<li>proksionimi i pyetjeve n\u00eb prometheus-datasource (i cila zgjidhet n\u00eb cil\u00ebsimet e pluginit p\u00ebr \u00e7do klaster t\u00eb caktuar) dhe formatimi i p\u00ebrgjigjeve p\u00ebr p\u00ebrdorim n\u00eb t\u00eb dh\u00ebna si n\u00eb faqet statike ashtu edhe n\u00eb tabelat e kontrollit.<\/li>\n<li>aktualizimi i t\u00eb dh\u00ebnave n\u00eb faqet statike t\u00eb plugin\u00ebve (me nj\u00eb refresh rate t\u00eb caktuar).<\/li>\n<li>trajtim i pyetjeve p\u00ebr formimin e list\u00ebs s\u00eb template n\u00eb grafana-dashboards (metoda .metriFindQuery())<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"Zhvillimi i nj\u00eb plaku p\u00ebr Grafana: historia e goditjeve t\u00eb ndjera\" src=\"\/wp-content\/uploads\/2019\/11\/18159bbb41144ebceb457df28b35e7b1.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Zhvillimi i nj\u00eb plaku p\u00ebr Grafana: historia e goditjeve t\u00eb ndjera\" src=\"\/wp-content\/uploads\/2019\/11\/a62665b4409566fbe24f56f88a376d5a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Zhvillimi i nj\u00eb plaku p\u00ebr Grafana: historia e goditjeve t\u00eb ndjera\" src=\"\/wp-content\/uploads\/2019\/11\/7f2d61fce623ce2a3cf62feb6d0447ac.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ul>\n<li>testimi i lidhjes me klasterin p\u00ebrfundimtar k8s.<\/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: \"Data source is OK\", title: \"Success\"};\n           }else{\n               return {status: \"error\", message: \"Data source is not OK\", title: \"Error\"};\n           }\n       }, error =&gt; {\n           return {status: \"error\", message: \"Data source is not OK\", title: \"Error\"};\n       })\n}<\/code><\/pre>\n<p>\nNj\u00eb moment interesant, sipas mendimit ton\u00eb, \u00ebsht\u00eb implementimi i mekanizmit t\u00eb autentikimit dhe autorizimit p\u00ebr datasource. Si rregull, nga kutia p\u00ebr konfigurimin e aksesit n\u00eb burimin e fundit t\u00eb t\u00eb dh\u00ebnave, ne mund t\u00eb p\u00ebrdorim komponentin e integruar t\u00eb Grafana \u2014 datasourceHttpSettings. Me k\u00ebt\u00eb komponent, mund t\u00eb konfigurojm\u00eb aksesin n\u00eb burimin http t\u00eb t\u00eb dh\u00ebnave duke treguar url-n\u00eb dhe parametrat themelor\u00eb t\u00eb autentikimit\/autorizimit: emrin e p\u00ebrdoruesit \u2014 fjal\u00ebkalimin, ose client-cert\/client-key. P\u00ebr t\u00eb implementuar mund\u00ebsin\u00eb e konfigurimit t\u00eb aksesit me an\u00eb t\u00eb bearer-token (standard de facto p\u00ebr k8s), duhej t\u00eb b\u00ebheshin disa ndryshime.<\/p>\n<p>P\u00ebr t\u00eb zgjidhur k\u00ebt\u00eb detyr\u00eb, mund t\u00eb p\u00ebrdorim mekanizmin e integruar t\u00eb Grafana \"Plugin Routes\" (lexoni m\u00eb shum\u00eb n\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/grafana.com\/docs\/plugins\/developing\/auth-for-datasources\/\">faqen zyrtare t\u00eb dokumentacionit<\/a><\/noindex>). N\u00eb konfigurimet e datasource ton\u00eb, mund t\u00eb shpallim nj\u00eb grup rregullash p\u00ebr routing, t\u00eb cilat do t\u00eb trajtohen nga serveri proxy i grafana. P\u00ebr shembull, p\u00ebr \u00e7do endpoint t\u00eb ve\u00e7ant\u00eb, ekziston mund\u00ebsia p\u00ebr t\u00eb vendosur headers ose url me mund\u00ebsin\u00eb e template-izimit, t\u00eb dh\u00ebnat p\u00ebr t\u00eb cilat mund t\u00eb merren nga fushat jsonData dhe secureJsonData (p\u00ebr ruajtjen e fjal\u00ebkalimeve ose tokeneve n\u00eb form\u00eb t\u00eb enkriptuar). N\u00eb shembullin ton\u00eb, k\u00ebrkesat e tipit <i>\/__proxy\/api\/v1\/namespaces<\/i> do t\u00eb proksohen n\u00eb url p\u00ebrkat\u00ebs<br \/>\n\/api\/v1\/namespaces me caktimin e titullit Authorization: Bearer.<\/p>\n<p><img decoding=\"async\" alt=\"Zhvillimi i nj\u00eb plaku p\u00ebr Grafana: historia e goditjeve t\u00eb ndjera\" src=\"\/wp-content\/uploads\/2019\/11\/ca73ff0fef62fba3edab7907c83639b6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<img decoding=\"async\" alt=\"Zhvillimi i nj\u00eb plaku p\u00ebr Grafana: historia e goditjeve t\u00eb ndjera\" src=\"\/wp-content\/uploads\/2019\/11\/9dab7537d7ccba90c9fb62dfa70b9fe2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNatyrisht, p\u00ebr t\u00eb punuar me api-serverin k8s, na nevojitet nj\u00eb p\u00ebrdorues me qasje readonly, manifestet p\u00ebr krijimin e t\u00eb cilit mund t'i gjeni gjithashtu n\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/devopsprodigy\/kubegraf\/tree\/master\/kubernetes\/\">kodin burimor t\u00eb plugin-it<\/a><\/noindex>.<\/p>\n<h4>Pjesa 5: l\u00ebshohet<\/h4>\n<p>\n<img decoding=\"async\" alt=\"Zhvillimi i nj\u00eb plaku p\u00ebr Grafana: historia e goditjeve t\u00eb ndjera\" src=\"\/wp-content\/uploads\/2019\/11\/3991a5d412f362770157fc567bb8009c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPasi t\u00eb shkruani plugin-in tuaj p\u00ebr Grafana, natyrisht do t\u00eb d\u00ebshironi ta publikoni at\u00eb p\u00ebr akses t\u00eb hapur. N\u00eb Grafana ka nj\u00eb bibliotek\u00eb plugin-esh, e cila \u00ebsht\u00eb e aksesueshme n\u00eb lidhjen <noindex><a rel=\"nofollow\" href=\"https:\/\/grafana.com\/grafana\/plugins\">grafana.com\/grafana\/plugins<\/a><\/noindex> <\/p>\n<p>P\u00ebr ta b\u00ebr\u00eb plugin-in tuaj t\u00eb aksesuesh\u00ebm n\u00eb dyqanin zyrtar, duhet t\u00eb b\u00ebni PR n\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/grafana\/grafana-plugin-repository\">ky repo<\/a><\/noindex>, duke shtuar n\u00eb skedarin repo.json p\u00ebrmbajtjen si:<\/p>\n<p><img decoding=\"async\" alt=\"Zhvillimi i nj\u00eb plaku p\u00ebr Grafana: historia e goditjeve t\u00eb ndjera\" src=\"\/wp-content\/uploads\/2019\/11\/160650bf37f8f2f3e12ef7dd291e90eb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nku version \u00ebsht\u00eb versioni i plugin-it tuaj, url \u00ebsht\u00eb lidhja n\u00eb depo, dhe commit \u00ebsht\u00eb hash i commit-it, sipas t\u00eb cilit do t\u00eb jet\u00eb e aksesueshme versioni specifike i plugin-it. <\/p>\n<p>Dhe do t\u00eb shihni nj\u00eb imazh t\u00eb shk\u00eblqyer si:<\/p>\n<p><img decoding=\"async\" alt=\"Zhvillimi i nj\u00eb plaku p\u00ebr Grafana: historia e goditjeve t\u00eb ndjera\" src=\"\/wp-content\/uploads\/2019\/11\/ff906396596e9c4c15c59f8d53555f52.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nT\u00eb dh\u00ebnat p\u00ebr t\u00eb do t\u00eb grumbullohen automatikisht nga Readme.md juaj, Changelog.md dhe skedari plugin.json me p\u00ebrshkrimin e plugin-it.<\/p>\n<h4>Pjesa 6: p\u00ebrfundimet<\/h4>\n<p>\nNe kemi vazhduar zhvillimin e pluginit ton\u00eb pas lan\u00e7imit. Tani po punojm\u00eb p\u00ebr monitorimin e sakt\u00eb t\u00eb p\u00ebrdorimit t\u00eb burimeve t\u00eb nodit t\u00eb klasterit, p\u00ebr implementimin e karakteristikave t\u00eb reja p\u00ebr p\u00ebrmir\u00ebsimin e p\u00ebrvoj\u00ebs s\u00eb p\u00ebrdoruesit, si dhe p\u00ebr t\u00eb trajtuar nj\u00eb num\u00ebr t\u00eb madh feedback-u q\u00eb kemi marr\u00eb pas instalimeve t\u00eb pluginit nga klient\u00ebt tan\u00eb dhe nga probleme t\u00eb ngritura n\u00eb GitHub (n\u00ebse lini nj\u00eb problem ose nj\u00eb k\u00ebrkes\u00eb p\u00ebr t\u00ebrheqje, do t\u00eb jem shum\u00eb i lumtur \ud83d\ude42 ).<\/p>\n<p>Shpresojm\u00eb q\u00eb ky artikull t'ju ndihmoj\u00eb t\u00eb kuptoni nj\u00eb mjet t\u00eb mrekulluesh\u00ebm si Grafana dhe, ndoshta, t\u00eb shkruani pluginin tuaj t\u00eb vet. <\/p>\n<p>Faleminderit!)<br \/>\n<br \/>Burimi: <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\/sq\/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=\"sq_AL\" \/>\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\/sq\/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\udd47 Zhvillimi i pluginit p\u00ebr Grafana: historia e v\u00ebshtir\u00ebsive | ProHoster","description":"P\u00ebrsh\u00ebndetje t\u00eb gjith\u00ebve! Disa muaj m\u00eb par\u00eb lan\u00e7uam projektin ton\u00eb t\u00eb ri open-source n\u00eb prodhim \u2014 pluginin Grafana p\u00ebr monitorimin e Kubernetes, t\u00eb quajtur DevOpsProdigy KubeGraf. Kodi burimor i pluginit \u00ebsht\u00eb i disponuesh\u00ebm n\u00eb depo publike n\u00eb GitHub. N\u00eb k\u00ebt\u00eb artikull d\u00ebshirojm\u00eb t\u00eb ndajm\u00eb me ju historin\u00eb mbi krijimin e pluginit, cilat mjete p\u00ebrdor\u00ebm dhe me cilat sfida u p\u00ebrball\u00ebm.","canonical_url":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/razrabotka-plagina-dlya-grafana-istoriya-nabityh-shishek","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sq_AL","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\/sq\/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\/sq\/wp-json\/wp\/v2\/posts\/52343","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/comments?post=52343"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts\/52343\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media?parent=52343"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/categories?post=52343"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/tags?post=52343"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}