ืคื™ืชื•ื— ืชื•ืกืฃ ืขื‘ื•ืจ Grafana: ื”ื™ืกื˜ื•ืจื™ื” ืฉืœ ื™ืจื™ื•ืช ื’ื“ื•ืœื•ืช

ืฉืœื•ื ืœื›ื•ืœื! ืœืคื ื™ ืžืกืคืจ ื—ื•ื“ืฉื™ื ื”ืฉืงื ื• ืœื™ื™ืฆื•ืจ ืืช ืคืจื•ื™ืงื˜ ื”ืงื•ื“ ื”ืคืชื•ื— ื”ื—ื“ืฉ ืฉืœื ื• - ืชื•ืกืฃ Grafana ืœื ื™ื˜ื•ืจ kubernetes, ืฉืงืจืื ื• ืœื•. DevOpsProdigy KubeGraf. ืงื•ื“ ื”ืžืงื•ืจ ืฉืœ ื”ืคืœืื’ื™ืŸ ื–ืžื™ืŸ ื‘ื›ืชื•ื‘ืช ืžืื’ืจ ืฆื™ื‘ื•ืจื™ ื‘-GitHub. ื•ื‘ืžืืžืจ ื–ื” ืื ื—ื ื• ืจื•ืฆื™ื ืœืฉืชืฃ ืืชื›ื ื‘ืกื™ืคื•ืจ ืื™ืš ื™ืฆืจื ื• ืืช ื”ืชื•ืกืฃ, ื‘ืื™ืœื• ื›ืœื™ื ื”ืฉืชืžืฉื ื• ื•ื‘ืื™ืœื• ืžืœื›ื•ื“ื•ืช ื ืชืงืœื ื• ื‘ืชื”ืœื™ืš ื”ืคื™ืชื•ื—. ื‘ื•ื ื ืœืš!

ื—ืœืง 0 - ืžื‘ื•ื: ืื™ืš ื”ื’ืขื ื• ืœืžืฆื‘ ื”ื–ื”?

ื”ืจืขื™ื•ืŸ ืœื›ืชื•ื‘ ืชื•ืกืฃ ืžืฉืœื ื• ืœื’ืจืคืŸ ื”ื’ื™ืข ืืœื™ื ื• ืžืžืฉ ื‘ืžืงืจื”. ื—ื‘ืจืชื ื• ืขื•ืงื‘ืช ื›ื‘ืจ ื™ื•ืชืจ ืž-10 ืฉื ื™ื ืื—ืจ ืคืจื•ื™ืงื˜ื™ื ืื™ื ื˜ืจื ื˜ื™ื™ื ื‘ืจืžื•ืช ืžื•ืจื›ื‘ื•ืช ืฉื•ื ื•ืช. ื‘ืžื”ืœืš ืชืงื•ืคื” ื–ื•, ืฆื‘ืจื ื• ื›ืžื•ืช ื’ื“ื•ืœื” ืฉืœ ืžื•ืžื—ื™ื•ืช, ืžืงืจื™ื ืžืขื ื™ื™ื ื™ื ื•ื ื™ืกื™ื•ืŸ ื‘ืฉื™ืžื•ืฉ ื‘ืžืขืจื›ื•ืช ื ื™ื˜ื•ืจ ืฉื•ื ื•ืช. ื•ื‘ืฉืœื‘ ืžืกื•ื™ื ืฉืืœื ื• ืืช ืขืฆืžื ื•: "ื”ืื ื™ืฉ ื›ืœื™ ืงืกื ืœื ื™ื˜ื•ืจ Kubernetes, ื›ืš, ื›ืžื• ืฉืื•ืžืจื™ื, "ื”ื’ื“ืจ ืื•ืชื• ื•ืชืฉื›ื— ืžื–ื”"?".. ื”ืชืงืŸ ื”ืชืขืฉื™ื™ื” ืœื ื™ื˜ื•ืจ K8s, ื›ืžื•ื‘ืŸ, ื›ื‘ืจ ืžื–ืžืŸ ืฉื™ืœื•ื‘ ืคืจื•ืžืชืื•ืก + ื’ืจืืคื ื”. ื•ื›ืคืชืจื•ื ื•ืช ืžื•ื›ื ื™ื ืœื—ืกื™ืžื” ื”ื–ื•, ื™ืฉื ื• ืกื˜ ื’ื“ื•ืœ ืฉืœ ื›ืœื™ื ืžืกื•ื’ื™ื ืฉื•ื ื™ื: prometheus-operator, ืกื˜ ืฉืœ ืœื•ื—ื•ืช ืžื—ื•ื•ื ื™ื ืฉืœ kubernetes-mixin, grafana-kubernetes-app.

ื ืจืื” ืฉื”ืชื•ืกืฃ grafana-kubernetes-app ื”ื•ื ื”ืืคืฉืจื•ืช ื”ืžืขื ื™ื™ื ืช ื‘ื™ื•ืชืจ ืขื‘ื•ืจื ื•, ืื‘ืœ ื”ื•ื ืœื ื ืชืžืš ื›ื‘ืจ ื™ื•ืชืจ ืžืฉื ื” ื•ื™ื•ืชืจ ืžื›ืš, ืœื ื™ื›ื•ืœ ืœืขื‘ื•ื“ ืขื ื’ืจืกืื•ืช ื—ื“ืฉื•ืช ืฉืœ node-exporter ื•-kube-state-metrics. ื•ื‘ืฉืœื‘ ืžืกื•ื™ื ื”ื—ืœื˜ื ื•: "ื”ืื ืœื ื ื—ืœื™ื˜ ื‘ืขืฆืžื ื•?"

ืื™ืœื• ืจืขื™ื•ื ื•ืช ื”ื—ืœื˜ื ื• ืœื™ื™ืฉื ื‘ืชื•ืกืฃ ืฉืœื ื•:

  • ื”ื“ืžื™ื” ืฉืœ "ืžืคืช ื”ืืคืœื™ืงืฆื™ื”": ื”ืฆื’ื” ื ื•ื—ื” ืฉืœ ืืคืœื™ืงืฆื™ื•ืช ื‘ืืฉื›ื•ืœ, ืžืงื•ื‘ืฆื•ืช ืœืคื™ ืžืจื—ื‘ื™ ืฉืžื•ืช, ืคืจื™ืกื•ืช...;
  • ื”ื“ืžื™ื” ืฉืœ ื—ื™ื‘ื•ืจื™ื ื›ืžื• "ืคืจื™ืกื” - ืฉื™ืจื•ืช (+ื™ืฆื™ืื•ืช)".
  • ื”ื“ืžื™ื” ืฉืœ ื”ืชืคืœื’ื•ืช ื™ื™ืฉื•ืžื™ ืืฉื›ื•ืœ ืขืœ ืคื ื™ ืฆืžืชื™ ืืฉื›ื•ืœ.
  • ืื•ืกืฃ ืฉืœ ืžื“ื“ื™ื ื•ืžื™ื“ืข ืžืžืกืคืจ ืžืงื•ืจื•ืช: Prometheus ื•ืฉืจืช API K8s.
  • ื ื™ื˜ื•ืจ ื”ืŸ ืฉืœ ื—ืœืง ื”ืชืฉืชื™ืช (ืฉื™ืžื•ืฉ ื‘ื–ืžืŸ CPU, ื–ื™ื›ืจื•ืŸ, ืชืช-ืžืขืจื›ืช ื“ื™ืกืง, ืจืฉืช) ื•ื”ืŸ ืœื•ื’ื™ืงื” ืฉืœ ื”ืืคืœื™ืงืฆื™ื” - ืชืจืžื™ืœื™ื ืฉืœ ืžืฆื‘ ื‘ืจื™ืื•ืช, ืžืกืคืจ ื”ืขืชืงื™ื ื–ืžื™ื ื™ื, ืžื™ื“ืข ืขืœ ื”ืขื‘ืจืช ืžื‘ื—ื ื™ ื—ื™ื•ื ื™ื•ืช/ืžื•ื›ื ื•ืช.

ื—ืœืง 1: ืžื”ื• "ืชื•ืกืฃ ื’ืจืคืื ื”"?

ืžื ืงื•ื“ืช ืžื‘ื˜ ื˜ื›ื ื™ืช, ื”ืชื•ืกืฃ ืขื‘ื•ืจ Grafana ื”ื•ื ื‘ืงืจ ื–ื•ื•ื™ืชื™, ื”ืžืื•ื—ืกืŸ ื‘ืกืคืจื™ื™ืช ื”ื ืชื•ื ื™ื ืฉืœ Grafana (/var/grafana/plugins/ /dist/module.js) ื•ื ื™ืชืŸ ืœื˜ืขื•ืŸ ืื•ืชื• ื›ืžื•ื“ื•ืœ SystemJS. ื›ืžื• ื›ืŸ, ื‘ืกืคืจื™ื™ื” ื–ื• ืืžื•ืจ ืœื”ื™ื•ืช ืงื•ื‘ืฅ plugin.json ื”ืžื›ื™ืœ ืืช ื›ืœ ื”ืžื˜ื ืžื™ื“ืข ืขืœ ื”ืชื•ืกืฃ ืฉืœืš: ืฉื, ื’ืจืกื”, ืกื•ื’ ืชื•ืกืฃ, ืงื™ืฉื•ืจื™ื ืœืžืื’ืจ/ืืชืจ/ืจื™ืฉื™ื•ืŸ, ืชืœื•ืช ื•ื›ื“ื•ืžื”.

ืคื™ืชื•ื— ืชื•ืกืฃ ืขื‘ื•ืจ Grafana: ื”ื™ืกื˜ื•ืจื™ื” ืฉืœ ื™ืจื™ื•ืช ื’ื“ื•ืœื•ืช
module.ts

ืคื™ืชื•ื— ืชื•ืกืฃ ืขื‘ื•ืจ Grafana: ื”ื™ืกื˜ื•ืจื™ื” ืฉืœ ื™ืจื™ื•ืช ื’ื“ื•ืœื•ืช
plugin.json

ื›ืคื™ ืฉื ื™ืชืŸ ืœืจืื•ืช ื‘ืฆื™ืœื•ื ื”ืžืกืš, ืฆื™ื™ื ื• plugin.type = app. ืžื›ื™ื•ื•ืŸ ืฉืชื•ืกืคื™ ื’ืจืืคืื ื” ื™ื›ื•ืœื™ื ืœื”ื™ื•ืช ืžืฉืœื•ืฉื” ืกื•ื’ื™ื:

ืœื•ื—: ื”ืกื•ื’ ื”ื ืคื•ืฅ ื‘ื™ื•ืชืจ ืฉืœ ืชื•ืกืฃ - ื–ื”ื• ืคืื ืœ ืœื”ืžื—ืฉืช ื›ืœ ืžื“ื“ื™ื, ื”ืžืฉืžืฉ ืœื‘ื ื™ื™ืช ืœื•ื—ื•ืช ืžื—ื•ื•ื ื™ื ืฉื•ื ื™ื.
datasource: ืžื—ื‘ืจ ืชื•ืกืฃ ืœืžืงื•ืจ ื ืชื•ื ื™ื ื›ืœืฉื”ื• (ืœื“ื•ื’ืžื”, Prometheus-datasource, ClickHouse-datasource, ElasticSearch-datasource).
ื”ืืคืœื™ืงืฆื™ื”: ืชื•ืกืฃ ื”ืžืืคืฉืจ ืœืš ืœื‘ื ื•ืช ื™ื™ืฉื•ื ื—ื–ื™ืชื™ ืžืฉืœืš ื‘ืชื•ืš Grafana, ืœื™ืฆื•ืจ ื“ืคื™ HTML ืžืฉืœืš ื•ืœื’ืฉืช ื™ื“ื ื™ืช ืœืžืงื•ืจ ื”ื ืชื•ื ื™ื ื›ื“ื™ ืœื”ืžื—ื™ืฉ ื ืชื•ื ื™ื ืฉื•ื ื™ื. ื›ืžื• ื›ืŸ, ืชื•ืกืคื™ื ืžืกื•ื’ื™ื ืื—ืจื™ื (ืžืงื•ืจ ื ืชื•ื ื™ื, ืคืื ืœ) ื•ื“ืฉื‘ื•ืจื“ื™ื ืฉื•ื ื™ื ื™ื›ื•ืœื™ื ืœืฉืžืฉ ื›ืชืœื•ืช.

ืคื™ืชื•ื— ืชื•ืกืฃ ืขื‘ื•ืจ Grafana: ื”ื™ืกื˜ื•ืจื™ื” ืฉืœ ื™ืจื™ื•ืช ื’ื“ื•ืœื•ืช
ืชืœื•ืช ืชื•ืกืฃ ืœื“ื•ื’ืžื” ืขื type=app.

ืืชื” ื™ื›ื•ืœ ืœื”ืฉืชืžืฉ ื’ื ื‘-JavaScript ื•ื’ื ื‘-TypeScript ื›ืฉืคืช ืชื›ื ื•ืช (ืื ื—ื ื• ื‘ื—ืจื ื• ื‘ื”). ื”ื›ื ื•ืช ืœืชื•ืกืคื™ ืฉืœื•ื ืขื•ืœื ืžื›ืœ ืกื•ื’ ืฉืืชื” ื™ื›ื•ืœ ืœืžืฆื•ื ื‘ืืžืฆืขื•ืช ืงื™ืฉื•ืจ: ืžืื’ืจ ื–ื” ืžื›ื™ืœ ืžืกืคืจ ืจื‘ ืฉืœ ื—ื‘ื™ืœื•ืช ืžืชื—ื™ืœื™ื (ื™ืฉ ืืคื™ืœื• ื“ื•ื’ืžื” ื ื™ืกื™ื•ื ื™ืช ืฉืœ ืชื•ืกืฃ ื‘-React) ืขื ื‘ื•ื ื™ื ืžื•ืชืงื ื™ื ื•ืžื•ื’ื“ืจื™ื ืžืจืืฉ.

ื—ืœืง ื‘': ื”ื›ื ืช ื”ืกื‘ื™ื‘ื” ื”ืžืงื•ืžื™ืช

ื›ื“ื™ ืœืขื‘ื•ื“ ืขืœ ื”ืคืœืื’ื™ืŸ, ืื ื• ื–ืงื•ืงื™ื ื‘ืื•ืคืŸ ื˜ื‘ืขื™ ืœืืฉื›ื•ืœ kubernetes ืขื ื›ืœ ื”ื›ืœื™ื ื”ืžื•ืชืงื ื™ื ืžืจืืฉ: prometheus, node-exporter, kube-state-metrics, grafana. ื™ืฉ ืœื”ื’ื“ื™ืจ ืืช ื”ืกื‘ื™ื‘ื” ื‘ืžื”ื™ืจื•ืช, ื‘ืงืœื•ืช ื•ื‘ื˜ื‘ืขื™ื•ืช, ื•ื›ื“ื™ ืœื”ื‘ื˜ื™ื— ื˜ืขื™ื ื” ื—ืžื”, ื™ืฉ ืœื”ืจื›ื™ื‘ ืืช ืกืคืจื™ื™ืช ื”ื ืชื•ื ื™ื ืฉืœ Grafana ื™ืฉื™ืจื•ืช ืžื”ืžื—ืฉื‘ ืฉืœ ื”ืžืคืชื—.

ื”ื“ืจืš ื”ื ื•ื—ื” ื‘ื™ื•ืชืจ, ืœื“ืขืชื ื•, ืœืขื‘ื•ื“ ืžืงื•ืžื™ืช ืขื kubernetes ื”ื™ื ืžื™ื ื™ืงื•ื‘. ื”ืฉืœื‘ ื”ื‘ื ื”ื•ื ื”ืชืงื ืช ื”ืฉื™ืœื•ื‘ ืฉืœ Prometheus + Grafana ื‘ืืžืฆืขื•ืช prometheus-operator. IN ื”ืžืืžืจ ื”ื–ื” ืชื”ืœื™ืš ื”ืชืงื ืช prometheus-operator ืขืœ minikube ืžืชื•ืืจ ื‘ืคื™ืจื•ื˜. ื›ื“ื™ ืœืืคืฉืจ ื”ืชืžื“ื”, ืขืœื™ืš ืœื”ื’ื“ื™ืจ ืืช ื”ืคืจืžื˜ืจ ื”ืชืžื“ื”: ื ื›ื•ืŸ ื‘ืงื•ื‘ืฅ charts/grafana/values.yaml, ื”ื•ืกืฃ PV ื•-PVC ืžืฉืœืš ื•ืฆื™ื™ืŸ ืื•ืชื ื‘ืคืจืžื˜ืจ persistence.existingClaim

ืกืงืจื™ืคื˜ ื”ื”ืฉืงื” ื”ืกื•ืคื™ ืฉืœ minikube ื ืจืื” ื›ืš:

minikube start --kubernetes-version=v1.13.4 --memory=4096 --bootstrapper=kubeadm --extra-config=scheduler.address=0.0.0.0 --extra-config=controller-manager.address=0.0.0.0
minikube mount 
/home/sergeisporyshev/Projects/Grafana:/var/grafana --gid=472 --uid=472 --9p-version=9p2000.L

ื—ืœืง 3: ืคื™ืชื•ื— ื‘ืคื•ืขืœ

ืžื•ื“ืœ ืื•ื‘ื™ื™ืงื˜

ื›ื”ื›ื ื” ืœื”ื˜ืžืขืช ื”ืชื•ืกืฃ, ื”ื—ืœื˜ื ื• ืœืชืืจ ืืช ื›ืœ ื”ื™ืฉื•ื™ื•ืช ื”ื‘ืกื™ืกื™ื•ืช ืฉืœ Kubernetes ืื™ืชืŸ ื ืขื‘ื•ื“ ื‘ืฆื•ืจื” ืฉืœ ืžื—ืœืงื•ืช TypeScript: pod, deployment, daemonset, statefulset, job, cronjob, service, node, namespace. ื›ืœ ืื—ืช ืžื”ืžื—ืœืงื•ืช ื”ืœืœื• ื™ื•ืจืฉืช ืžื”ืžื—ืœืงื” ื”ื ืคื•ืฆื” BaseModel, ื”ืžืชืืจืช โ€‹โ€‹ืืช ื”ื‘ื ืื™, ื”ื”ืจืก, ืฉื™ื˜ื•ืช ืœืขื“ื›ื•ืŸ ื•ื”ื—ืœืคืช ื ืจืื•ืช. ื›ืœ ืื—ืช ืžื”ืžื—ืœืงื•ืช ืžืชืืจืช โ€‹โ€‹ืงืฉืจื™ ื’ื•ืžืœื™ืŸ ืžืงื•ื ื ื™ื ืขื ื™ืฉื•ื™ื•ืช ืื—ืจื•ืช, ืœื“ื•ื’ืžื”, ืจืฉื™ืžื” ืฉืœ ืชืจืžื™ืœื™ื ืขื‘ื•ืจ ืคืจื™ืกืช ื™ืฉื•ืช ืžืกื•ื’.

import {Pod} from "./pod";
import {Service} from "./service";
import {BaseModel} from './traits/baseModel';

export class Deployment extends BaseModel{
   pods: Array<Pod>;
   services: Array<Service>;

   constructor(data: any){
       super(data);
       this.pods = [];
       this.services = [];
   }
}

ื‘ืขื–ืจืช getters ื•-seters, ื ื•ื›ืœ ืœื”ืฆื™ื’ ืื• ืœื”ื’ื“ื™ืจ ืืช ืžื“ื“ื™ ื”ื™ืฉื•ืช ื”ื“ืจื•ืฉื™ื ืœื ื• ื‘ืฆื•ืจื” ื ื•ื—ื” ื•ืงืจื™ืื”. ืœื“ื•ื’ืžื”, ืคืœื˜ ืžืขื•ืฆื‘ ืฉืœ ืฆืžืชื™ ืžืขื‘ื“ ื”ื ื™ืชื ื™ื ืœื”ืงืฆืื”:

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

ืขืžื•ื“ื™ื

ืจืฉื™ืžื” ืฉืœ ื›ืœ ื“ืคื™ ื”ืคืœืื’ื™ืŸ ืฉืœื ื• ืžืชื•ืืจืช ื‘ืชื—ื™ืœื” ื‘-pluing.json ืฉืœื ื• ื‘ืกืขื™ืฃ ื”ืชืœื•ืช:

ืคื™ืชื•ื— ืชื•ืกืฃ ืขื‘ื•ืจ Grafana: ื”ื™ืกื˜ื•ืจื™ื” ืฉืœ ื™ืจื™ื•ืช ื’ื“ื•ืœื•ืช

ื‘ื‘ืœื•ืง ืฉืœ ื›ืœ ืขืžื•ื“ ืขืœื™ื ื• ืœืฆื™ื™ืŸ ืืช ื”-PAGE NAME (ืœืื—ืจ ืžื›ืŸ ื”ื•ื ื™ื•ืžืจ ืœ-slug ืฉื‘ืืžืฆืขื•ืชื• ื“ืฃ ื–ื” ื™ื”ื™ื” ื ื’ื™ืฉ); ืฉื ื”ืจื›ื™ื‘ ื”ืื—ืจืื™ ืขืœ ืคืขื•ืœืช ื“ืฃ ื–ื” (ืจืฉื™ืžืช ื”ืจื›ื™ื‘ื™ื ืžื™ื•ืฆืืช ืœ-modul.ts); ืฆื™ื•ืŸ ืชืคืงื™ื“ ื”ืžืฉืชืžืฉ ืฉืขื‘ื•ืจื• ื–ืžื™ื ื” ืขื‘ื•ื“ื” ืขื ื“ืฃ ื–ื” ื•ื”ื’ื“ืจื•ืช ื ื™ื•ื•ื˜ ืขื‘ื•ืจ ืกืจื’ืœ ื”ืฆื“.

ื‘ืจื›ื™ื‘ ื”ืื—ืจืื™ ืขืœ ืคืขื•ืœืช ื”ืขืžื•ื“, ืขืœื™ื ื• ืœื”ื’ื“ื™ืจ templateUrl, ืœื”ืขื‘ื™ืจ ืฉื ืืช ื”ื ืชื™ื‘ ืœืงื•ื‘ืฅ ื”-html ืขื ืกื™ืžื•ืŸ. ื‘ืชื•ืš ื”ื‘ืงืจ, ื‘ืืžืฆืขื•ืช ื”ื–ืจืงืช ืชืœื•ืช, ืื ื• ื™ื›ื•ืœื™ื ืœื’ืฉืช ืœืขื“ 2 ืฉื™ืจื•ืชื™ื ื–ื•ื•ื™ืชื™ื™ื ื—ืฉื•ื‘ื™ื:

  • backendSrv - ืฉื™ืจื•ืช ื”ืžืกืคืง ืื™ื ื˜ืจืืงืฆื™ื” ืขื ืฉืจืช ื”-API ืฉืœ Grafana;
  • datasourceSrv - ืฉื™ืจื•ืช ื”ืžืกืคืง ืื™ื ื˜ืจืืงืฆื™ื” ืžืงื•ืžื™ืช ืขื ื›ืœ ืžืงื•ืจื•ืช ื”ื ืชื•ื ื™ื ื”ืžื•ืชืงื ื™ื ื‘-Grafana ืฉืœืš (ืœื“ื•ื’ืžื”, ืฉื™ื˜ืช .getAll() - ืžื—ื–ื™ืจ ืจืฉื™ืžื” ืฉืœ ื›ืœ ืžืงื•ืจื•ืช ื”ื ืชื•ื ื™ื ื”ืžื•ืชืงื ื™ื; .get( ) - ืžื—ื–ื™ืจื” ืื•ื‘ื™ื™ืงื˜ ืžื•ืคืข ืฉืœ ืžืงื•ืจ ื ืชื•ื ื™ื ืกืคืฆื™ืคื™.

ืคื™ืชื•ื— ืชื•ืกืฃ ืขื‘ื•ืจ Grafana: ื”ื™ืกื˜ื•ืจื™ื” ืฉืœ ื™ืจื™ื•ืช ื’ื“ื•ืœื•ืช

ืคื™ืชื•ื— ืชื•ืกืฃ ืขื‘ื•ืจ Grafana: ื”ื™ืกื˜ื•ืจื™ื” ืฉืœ ื™ืจื™ื•ืช ื’ื“ื•ืœื•ืช

ืคื™ืชื•ื— ืชื•ืกืฃ ืขื‘ื•ืจ Grafana: ื”ื™ืกื˜ื•ืจื™ื” ืฉืœ ื™ืจื™ื•ืช ื’ื“ื•ืœื•ืช

ื—ืœืง 4: ืžืงื•ืจ ื ืชื•ื ื™ื

ืžื ืงื•ื“ืช ื”ืžื‘ื˜ ืฉืœ Grafana, Datasource ื”ื•ื ื‘ื“ื™ื•ืง ืื•ืชื• ืชื•ืกืฃ ื›ืžื• ื›ืœ ื”ืื—ืจื™ื: ื™ืฉ ืœื• ื ืงื•ื“ืช ื›ื ื™ืกื” ืžืฉืœื• module.js, ื™ืฉ ืงื•ื‘ืฅ ืขื ืžื˜ื ืžื™ื“ืข plugin.json. ื›ืืฉืจ ืžืคืชื—ื™ื ืชื•ืกืฃ ืขื type = app, ืื ื• ื™ื›ื•ืœื™ื ืœืงื™ื™ื ืื™ื ื˜ืจืืงืฆื™ื” ื”ืŸ ืขื ืžืงื•ืจื•ืช ื”ื ืชื•ื ื™ื ื”ืงื™ื™ืžื™ื (ืœื“ื•ื’ืžื”, prometheus-datasource) ื•ื”ืŸ ืขื ืžืงื•ืจื•ืช ื”ื ืชื•ื ื™ื ืฉืœื ื•, ืื•ืชื ื ื•ื›ืœ ืœืื—ืกืŸ ื™ืฉื™ืจื•ืช ื‘ืกืคืจื™ื™ืช ื”ืคืœืื’ื™ืŸ (dist/datasource/*) ืื• ืœื”ืชืงื™ืŸ ื›ืชืœื•ืช. ื‘ืžืงืจื” ืฉืœื ื•, ืžืงื•ืจ ื”ื ืชื•ื ื™ื ืžื’ื™ืข ืขื ืงื•ื“ ื”ืคืœืื’ื™ืŸ. ื›ืžื• ื›ืŸ, ื™ืฉ ืฆื•ืจืš ื‘ืชื‘ื ื™ืช config.html ื•ื‘ืงืจ ConfigCtrl, ืฉื™ืฉืžืฉื• ืขื‘ื•ืจ ื“ืฃ ื”ืชืฆื•ืจื” ืฉืœ ืžื•ืคืข ืžืงื•ืจื•ืช ื”ื ืชื•ื ื™ื ื•ื‘ืงืจ ื”ื ืชื•ื ื™ื ืฉืœ ืžืงื•ืจ ื”ื ืชื•ื ื™ื, ืืฉืจ ืžื™ื™ืฉื ืืช ื”ื”ื™ื’ื™ื•ืŸ ืฉืœ ืžืงื•ืจ ื”ื ืชื•ื ื™ื ืฉืœืš.

ื‘ืชื•ืกืฃ KubeGraf, ืžื ืงื•ื“ืช ืžื‘ื˜ ืฉืœ ืžืžืฉืง ื”ืžืฉืชืžืฉ, ืžืงื•ืจ ื”ื ืชื•ื ื™ื ื”ื•ื ืžื•ืคืข ืฉืœ ืืฉื›ื•ืœ kubernetes ืฉืžื™ื™ืฉื ืืช ื”ื™ื›ื•ืœื•ืช ื”ื‘ืื•ืช (ืงื•ื“ ืžืงื•ืจ ื–ืžื™ืŸ ะฟะพ ััั‹ะปะบะต):

  • ืื™ืกื•ืฃ ื ืชื•ื ื™ื ืžืฉืจืช ื”- api k8s (ืงื‘ืœืช ืจืฉื™ืžื” ืฉืœ ืžืจื—ื‘ื™ ืฉืžื•ืช, ืคืจื™ืกื•ืช...)
  • ื”ืขื‘ืจืช ื‘ืงืฉื•ืช ืœ-prometheus-datasource (ืฉื ื‘ื—ืจ ื‘ื”ื’ื“ืจื•ืช ื”ืคืœืื’ื™ืŸ ืขื‘ื•ืจ ื›ืœ ืืฉื›ื•ืœ ืกืคืฆื™ืคื™) ื•ืขื™ืฆื•ื‘ ืชื’ื•ื‘ื•ืช ืœืฉื™ืžื•ืฉ ื‘ื ืชื•ื ื™ื ื”ืŸ ื‘ื“ืคื™ื ืกื˜ื˜ื™ื™ื ื•ื”ืŸ ื‘ืœื•ื—ื•ืช ืžื—ื•ื•ื ื™ื.
  • ืขื“ื›ื•ืŸ ื ืชื•ื ื™ื ื‘ื“ืคื™ ืคืœืื’ื™ืŸ ืกื˜ื˜ื™ื™ื (ืขื ืงืฆื‘ ืจืขื ื•ืŸ ืžื•ื’ื“ืจ).
  • ืขื™ื‘ื•ื“ ืฉืื™ืœืชื•ืช ืœื™ืฆื™ืจืช ื’ื™ืœื™ื•ืŸ ืชื‘ื ื™ืช ื‘-grafana-dashboards (ืฉื™ื˜ืช metriFindQuery())

ืคื™ืชื•ื— ืชื•ืกืฃ ืขื‘ื•ืจ Grafana: ื”ื™ืกื˜ื•ืจื™ื” ืฉืœ ื™ืจื™ื•ืช ื’ื“ื•ืœื•ืช

ืคื™ืชื•ื— ืชื•ืกืฃ ืขื‘ื•ืจ Grafana: ื”ื™ืกื˜ื•ืจื™ื” ืฉืœ ื™ืจื™ื•ืช ื’ื“ื•ืœื•ืช

ืคื™ืชื•ื— ืชื•ืกืฃ ืขื‘ื•ืจ Grafana: ื”ื™ืกื˜ื•ืจื™ื” ืฉืœ ื™ืจื™ื•ืช ื’ื“ื•ืœื•ืช

  • ื‘ื“ื™ืงืช ื—ื™ื‘ื•ืจ ืขื ืืฉื›ื•ืœ k8s ื”ืกื•ืคื™.
testDatasource(){
   let url = '/api/v1/namespaces';
   let _url = this.url;
   if(this.accessViaToken)
       _url += '/__proxy';
   _url += url;
   return this.backendSrv.datasourceRequest({
       url: _url,
       method: "GET",
       headers: {"Content-Type": 'application/json'}
   })
       .then(response => {
           if (response.status === 200) {
               return {status: "success", message: "Data source is OK", title: "Success"};
           }else{
               return {status: "error", message: "Data source is not OK", title: "Error"};
           }
       }, error => {
           return {status: "error", message: "Data source is not OK", title: "Error"};
       })
}

ื ืงื•ื“ื” ืžืขื ื™ื™ื ืช ื ืคืจื“ืช, ืœื“ืขืชื ื•, ื”ื™ื ื™ื™ืฉื•ื ืžื ื’ื ื•ืŸ ืื™ืžื•ืช ื•ื”ืจืฉืื” ืขื‘ื•ืจ ืžืงื•ืจ ื”ื ืชื•ื ื™ื. ื‘ื“ืจืš ื›ืœืœ, ืžื—ื•ืฅ ืœืงื•ืคืกื”, ืื ื• ื™ื›ื•ืœื™ื ืœื”ืฉืชืžืฉ ื‘ืจื›ื™ื‘ Grafana ื”ืžื•ื‘ื ื” datasourceHttpSettings ื›ื“ื™ ืœื”ื’ื“ื™ืจ ื’ื™ืฉื” ืœืžืงื•ืจ ื”ื ืชื•ื ื™ื ื”ืกื•ืคื™. ื‘ืืžืฆืขื•ืช ืจื›ื™ื‘ ื–ื”, ื ื•ื›ืœ ืœื”ื’ื“ื™ืจ ื’ื™ืฉื” ืœืžืงื•ืจ ื”ื ืชื•ื ื™ื http ืขืœ ื™ื“ื™ ืฆื™ื•ืŸ ื›ืชื•ื‘ืช ื”ืืชืจ ื•ื”ื’ื“ืจื•ืช ื”ืื™ืžื•ืช/ื”ืจืฉืื” ื”ื‘ืกื™ืกื™ื•ืช: ื›ื ื™ืกื”-ืกื™ืกืžื”, ืื• ืœืงื•ื—-ืื™ืฉื•ืจ/ืžืคืชื— ืœืงื•ื—. ืขืœ ืžื ืช ืœื™ื™ืฉื ืืช ื”ื™ื›ื•ืœืช ืœื”ื’ื“ื™ืจ ื’ื™ืฉื” ื‘ืืžืฆืขื•ืช ืืกื™ืžื•ืŸ ื ื•ืฉื (ื”ืชืงืŸ ื“ื” ืคืงื˜ื• ืœ-k8s), ื”ื™ื™ื ื• ืฆืจื™ื›ื™ื ืœืขืฉื•ืช ืงืฆืช ืชื™ืงื•ืŸ.

ื›ื“ื™ ืœืคืชื•ืจ ื‘ืขื™ื” ื–ื•, ืืชื” ื™ื›ื•ืœ ืœื”ืฉืชืžืฉ ื‘ืžื ื’ื ื•ืŸ "ืžืกืœื•ืœื™ ืชื•ืกืฃ" ื”ืžื•ื‘ื ื” ืฉืœ Grafana (ืคืจื˜ื™ื ื ื•ืกืคื™ื ื‘- ื“ืฃ ื”ืชื™ืขื•ื“ ื”ืจืฉืžื™). ื‘ื”ื’ื“ืจื•ืช ืฉืœ ืžืงื•ืจ ื”ื ืชื•ื ื™ื ืฉืœื ื•, ืื ื• ื™ื›ื•ืœื™ื ืœื”ื›ืจื™ื– ืขืœ ืงื‘ื•ืฆื” ืฉืœ ื›ืœืœื™ ื ื™ืชื•ื‘ ืฉื™ืขื•ื‘ื“ื• ืขืœ ื™ื“ื™ ืฉืจืช ื”-proxy grafana. ืœื“ื•ื’ืžื”, ืขื‘ื•ืจ ื›ืœ ื ืงื•ื“ืช ืงืฆื” ื‘ื•ื“ื“ืช ื ื™ืชืŸ ืœื”ื’ื“ื™ืจ ื›ื•ืชืจื•ืช ืื• ื›ืชื•ื‘ื•ืช URL ืขื ืืคืฉืจื•ืช ืฉืœ ืชื‘ื ื™ืช, ืฉืขื‘ื•ืจืŸ ื ื™ืชืŸ ืœืงื—ืช ื ืชื•ื ื™ื ืžื”ืฉื“ื•ืช jsonData ื•-secureJsonData (ืœืื—ืกื•ืŸ ืกื™ืกืžืื•ืช ืื• ืืกื™ืžื•ื ื™ื ื‘ืฆื•ืจื” ืžื•ืฆืคื ืช). ื‘ื“ื•ื’ืžื” ืฉืœื ื•, ืฉืื™ืœืชื•ืช ื›ืžื• /__proxy/api/v1/namespaces ื™ืฉืœื— ืคืจื•ืงืกื™ ืœื›ืชื•ื‘ืช ื”-URL ืฉืœ ื”ื˜ื•ืคืก
/api/v8/namespaces ืขื ื”ื›ื•ืชืจืช Authorization: Bearer.

ืคื™ืชื•ื— ืชื•ืกืฃ ืขื‘ื•ืจ Grafana: ื”ื™ืกื˜ื•ืจื™ื” ืฉืœ ื™ืจื™ื•ืช ื’ื“ื•ืœื•ืช

ืคื™ืชื•ื— ืชื•ืกืฃ ืขื‘ื•ืจ Grafana: ื”ื™ืกื˜ื•ืจื™ื” ืฉืœ ื™ืจื™ื•ืช ื’ื“ื•ืœื•ืช

ื‘ืื•ืคืŸ ื˜ื‘ืขื™, ื›ื“ื™ ืœืขื‘ื•ื“ ืขื ืฉืจืช ื”-API k8s ืื ื—ื ื• ืฆืจื™ื›ื™ื ืžืฉืชืžืฉ ืขื ื’ื™ืฉื” ืœืงืจื™ืื” ื‘ืœื‘ื“, ืžื ื™ืคืกื˜ื™ื ืœื™ืฆื™ืจื” ืื•ืชื ืชื•ื›ืœื• ืœืžืฆื•ื ื’ื ื‘ ืงื•ื“ ืžืงื•ืจ ืฉืœ ืชื•ืกืฃ.

ื—ืœืง 5: ืฉื—ืจื•ืจ

ืคื™ืชื•ื— ืชื•ืกืฃ ืขื‘ื•ืจ Grafana: ื”ื™ืกื˜ื•ืจื™ื” ืฉืœ ื™ืจื™ื•ืช ื’ื“ื•ืœื•ืช

ืœืื—ืจ ืฉื›ืชื‘ืช ืชื•ืกืฃ Grafana ืžืฉืœืš, ื‘ืื•ืคืŸ ื˜ื‘ืขื™ ืชืจืฆื” ืœื”ืคื•ืš ืื•ืชื• ืœื–ืžื™ืŸ ืœืฆื™ื‘ื•ืจ. ื‘ื’ืจืืคืื ื” ื–ื•ื”ื™ ืกืคืจื™ื™ืช ืชื•ืกืคื™ื ื”ื–ืžื™ื ื” ื›ืืŸ grafana.com/grafana/plugins

ื›ื“ื™ ืฉื”ืชื•ืกืฃ ืฉืœืš ื™ื”ื™ื” ื–ืžื™ืŸ ื‘ื—ื ื•ืช ื”ืจืฉืžื™ืช, ืขืœื™ืš ืœื‘ืฆืข ื™ื—"ืฆ ื”ืžืื’ืจ ื”ื–ื”ืขืœ ื™ื“ื™ ื”ื•ืกืคืช ืชื•ื›ืŸ ื›ื–ื” ืœืงื•ื‘ืฅ repo.json:

ืคื™ืชื•ื— ืชื•ืกืฃ ืขื‘ื•ืจ Grafana: ื”ื™ืกื˜ื•ืจื™ื” ืฉืœ ื™ืจื™ื•ืช ื’ื“ื•ืœื•ืช

ื›ืืฉืจ ื’ืจืกื” ื”ื™ื ื”ื’ืจืกื” ืฉืœ ื”ืคืœืื’ื™ืŸ ืฉืœืš, url ื”ื•ื ืงื™ืฉื•ืจ ืœืžืื’ืจ, ื•-commit ื”ื•ื ื”-hash ืฉืœ ื”-commit ืฉืขื‘ื•ืจื• ื’ืจืกื” ืกืคืฆื™ืคื™ืช ืฉืœ ื”ืคืœืื’ื™ืŸ ืชื”ื™ื” ื–ืžื™ื ื”.

ื•ื‘ืคืœื˜ ืชืจืื” ืชืžื•ื ื” ื ืคืœืื” ื›ืžื•:

ืคื™ืชื•ื— ืชื•ืกืฃ ืขื‘ื•ืจ Grafana: ื”ื™ืกื˜ื•ืจื™ื” ืฉืœ ื™ืจื™ื•ืช ื’ื“ื•ืœื•ืช

ื”ื ืชื•ื ื™ื ืขื‘ื•ืจื• ื™ื™ืชืคืกื• ืื•ื˜ื•ืžื˜ื™ืช ืžื”-Readme.md, Changelog.md ื•ืžื”ืงื•ื‘ืฅ plugin.json ืขื ืชื™ืื•ืจ ื”ืคืœืื’ื™ืŸ.

ื—ืœืง 6: ื‘ืžืงื•ื ืžืกืงื ื•ืช

ืœื ื”ืคืกืงื ื• ืœืคืชื— ืืช ื”ืชื•ืกืฃ ืฉืœื ื• ืœืื—ืจ ื”ืฉื—ืจื•ืจ. ื•ืขื›ืฉื™ื• ืื ื—ื ื• ืขื•ื‘ื“ื™ื ืขืœ ื ื™ื˜ื•ืจ ื ื›ื•ืŸ ืฉืœ ื”ืฉื™ืžื•ืฉ ื‘ืžืฉืื‘ื™ื ืฉืœ ืฆืžืชื™ ืืฉื›ื•ืœื•ืช, ืžืฆื™ื’ื™ื ืชื›ื•ื ื•ืช ื—ื“ืฉื•ืช ืœืฉื™ืคื•ืจ ื”-UX, ื•ื’ื ืœื’ืจื•ืฃ ื›ืžื•ืช ื’ื“ื•ืœื” ืฉืœ ืžืฉื•ื‘ ืฉื”ืชืงื‘ืœ ืœืื—ืจ ื”ืชืงื ืช ื”ืชื•ืกืฃ ื”ืŸ ืขืœ ื™ื“ื™ ื”ืœืงื•ื—ื•ืช ืฉืœื ื• ื•ื”ืŸ ืžืื ืฉื™ื ื‘-GitHub (ืื ืชืขื–ื‘ื• ื‘ืงืฉืช ื”ื‘ืขื™ื” ืื• ื”ืžืฉื™ื›ื” ืฉืœืš, ืื ื™ ืืฉืžื— ืžืื•ื“ :)

ืื ื• ืžืงื•ื•ื™ื ืฉืžืืžืจ ื–ื” ื™ืขื–ื•ืจ ืœืš ืœื”ื‘ื™ืŸ ื›ืœื™ ื ืคืœื ื›ืžื• Grafana ื•ืื•ืœื™, ืœื›ืชื•ื‘ ืชื•ืกืฃ ืžืฉืœืš.

ืชื•ื“ื”!)

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”