αα½ααααΈβα’αααβααΆααα’ααααααΆ! ααΆαααΈααα»ααααΆααααα»α ααΎαααΆαα
αΆααααααΎααααααααααααααΎαα
αα ααααΈααααααΎαα
αΌααα
αααα»αααα·ααααα - αααααα·ααΈαααα½α Grafana αααααΆααααΆααααα½ααα·αα·ααα kubernetes αααααΎαα α
ααΆ
αααααααΈ 0 - ααΆαααααΆαα ααΎααΎαααΆααααα ααα»α ααααααααααααΆ?
αααα·ααααα»αααΆαααααααααααα·ααΈαααα½αααααΆαααααα½αααααααΎααααααΆαα Grafan ααΆαααααααΎααααα αααααα αααα»αα αα»αααααααΎαααΆαααΉααααα»αααΆαααΆααααααααααααΆαααααααα·αααααααααααΆααααα»αααααΆαα’ααααααααααΆα 10 ααααΆαααα αΎαα αααα»αα’αα‘α»ααααααα ααΎαααΆααααααΌααααα»αααΌαααααΆαααΆα αααΎα ααααΈαα½αα±ααα αΆααα’αΆαααααα αα·ααααα·ααααααααα»αααΆαααααΎααααΆαααααααααααααα½ααα·αα·αααααααααα α αΎααα α ααα»α αααα ααΎαααΆααα½ααααα½αααΎαααΆ "ααΎααΆαα§αααααααααααααααααΆαααααα½ααα·αα·ααα Kubernetes ααΌα ααααααΌα ααααα½ααααα·ααΆαααΆ "αααααααΆα αΎαααααααα ααΆ"? ααΆααα½ααααα αΌαααααΆαα Prometheus + Grafana α α αΎαααΆαααααααααΆααααααααααα½α ααΆααααα αααααΆαααααααα ααΆαα§αααααααΆα αααΎαααααααααΌα ααΆα prometheus-operator, αααα»αααααααΆααααααααααα kubernetes-mixin, grafana-kubernetes-app α
αααααα·ααΈαααα½ααααααα·ααΈ grafana-kubernetes α αΆααααΌα ααΆαααααΎααα½αα±ααα αΆααα’αΆαααααααααα»ααααααΆααααΎα ααα»ααααααΆαα·αααααΌαααΆαααΆααααα’ααααααααααΆααα½αααααΆα α αΎαααΎαααΈααααα ααα αα·αα’αΆα ααααΎαααΆαααΆαα½αααααααααΈαα node-exporter αα·α kube-state-metrics ααΆαααα α αΎααα α ααα»α ααααααΎαααΆααααααα α α·αααααΆ: "ααΎααΎααα½αααααΎααΆααααααα α α·αααααααααα½αα―ααα?"
ααΎαααα·αα’αααΈαααααααααΎααααααα α α·αααα’αα»αααααα αααα»ααααααα·ααΈαααα½αααααααΎαα
- ααΆαααΎαααΎααα "αααααΈαααααα·ααΈ"α ααΆααααα αΆαααααΆααααα½ααααααααα·ααΈαα αααα»αα ααααα ααΆαααΆααααΆαααα»αααα namespaces ααΆαααΆαααααααΆα ... ;
- ααΆαααΎαααΎαααααΆααααααΆααααΌα ααΆ "ααΆαααΆαααααααΆα - ααααΆαααα (+ α ααα)" α
- ααΆαααΎαααΎαααααΆαα ααα αΆααααααα·ααΈα ααααααα ααΌααΆααααααΆααα αααααα
- ααΆααααααΌααααααα αα·αααααααΆαααΈαααααααΆα αααΎαα Prometheus αα·α k8s api serverα
- ααΆααααα½ααα·αα·αααααΆαααααααα αααααΆαα ααΆαααααααα (ααΆαααααΎααααΆαααααααααΆαααΈααΈααΌ α’αααα αα αΆα ααααααααααααΆα αααααΆα) αα·ααααααα·ααααΆαααααα·ααΈ - ααααααααΆαααΆααα»αααΆα α ααα½αααααΆαα αααααααα’αΆα ααααΆα ααααααΆαα’αααΈααΆαααααααΆααααΆαααααΎαααααααΆαααααααΎα/ααΆαααααααααα½αα
αααααααΈ 1: ααΎα’αααΈαα ααΆ "αααααα·ααΈαααα½α Grafana"?
ααΆααααααααα αα ααααα αααααα·ααΈαααα½ααααααΆαα Grafana ααΊααΆα§ααααααααααΆαα»α αααααααΌαααΆααααααΆαα»ααα αααα»ααααα·αααααα Grafana (/var/grafana/plugins/ /dist/module.js) α αΎαα’αΆα αααα»αααΆαααΌαα»α SystemJS α ααΌα ααααΆαααααααααα αααα»αααααααα½αααααΆαα―αααΆα plugin.json αααααΆαααααααΆαααααΆααΆααα’ααα’αααΈαααααα·ααΈαααα½αααααα’αααα ααααα αααα αααααααααααα·ααΈαααα½α αααααααΆαααα ααΆααααααΆαα/ααα ααααα/α’αΆααααΆααααα ααΆαα’αΆααααα αα·αα’αααΈαααααααααα
module.ts
plugin.json
ααΌα αααα’αααα’αΆα ααΎααα αααα»αααΌαααα’αααααα ααΎαααΆααααααΆαα plugin.type = app α αααααΆααααααααα·ααΈαααα½ααααααΆαα Grafana α’αΆα ααΆαααΈααααααα
αααααα αααααααααααα·ααΈαααα½αααΌαα
αααα»α - ααΆααΆααααααααααΆααααΎαααΎαααααααααΆαα½α αααααααΎαααααΆαααααααΎαααααΆαααααααααααααααααα
ααααααα·ααααααα αααααα·ααΈααααΆαααααααα·ααΈαααα½ααα
ααΆααααααααα·αααααααα½αα
ααα½α (α§ααΆα ααα Prometheus-datasource, ClickHouse-datasource, ElasticSearch-datasource)α
αααααα·ααΈα αααααα·ααΈαααα½ααααα’αα»ααααΆαα±ααα’ααααααααΎααααααα·ααΈαααααααΆααα»αααααΆαααααα½αααααα’ααααα
ααΆααααα»α Grafana αααααΎαααααα html ααααΆαααααα½αααααα’ααα αα·αα
αΌαααααΎααααααα·αααααααααααααΎααααΈααΎααα·ααααααααααααα ααΌα
ααααΆαααααααα αααααα·ααΈαααα½ααααααααααααααααα (ααααααα·αααααα ααααα) αα·αααααΆαααααααααααααααααα’αΆα
ααααΌαααΆαααααΎααΆααΆαα’αΆαααααα
α§ααΆα αααααΆαα’αΆααααααααααααα·ααΈαααα½αααΆαα½α type=app.
α’αααα’αΆα
ααααΎααΆαα JavaScript αα·α TypeScript ααΆααΆααΆααααααααααα·ααΈ (ααΎαααΆαααααΎαααΎαααΆ)α ααΆααααα
ααααααΆαααααααα·ααΈαααα½α hello-world ααααααααααααααα’αααα’αΆα
ααααΎααΆα
αααααααΈ 2: ααΆααααα αααα·ααααΆααααα»αααααα
ααΎααααΈααααΎααΆαααΎαααααα·ααΈαααα½α ααΎαααααΌαααΆαα ααααα kubernetes αααααααααΆαα·ααΆαα½αααΉαα§ααααααααααΆαααα‘αΎαααΆαα»αααΆααα’ααα prometheus, node-exporter, kube-state-metrics, grafanaα ααα·ααααΆααα½αααααααΌαααΆααααα ααααΆααα αα ααΆααααα½α αα·αααΆαααααααααααααΆαα· α αΎαααΎααααΈααΆααΆααΆαααΌαααΆααααα»αα‘αΎααα·α αααα·αααααα Grafana αα½αααααααΌαααΆαααα‘αΎααααααααΆααααΈαααΆαααΈαααααα’αααα’αα·ααααααα
αααααααΆαααΆααααα½ααααα»α ααΆααααα·αααααααΎα ααΎααααΈααααΎααΆααααα»ααααα»αααΆαα½α kubernetes ααΊ
ααααααΈαααΎαααααΎαααΆα 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 ααΌαα ααααααααΆα’αααΈ constructor, destructor, method αααααΆααα’αΆααααα αα·αααααΌαααΆαααΎαααΎαα ααααΆααααΈαα½αααα·αααααΆα’αααΈααααΆαααααααααααΆαααΆααααΆαα½αα’αααααΆααααααααα α§ααΆα ααα αααααΈααααααααααααΆααα’αααααΆαααααΆαααΆαααααααΆαααααααα
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 = [];
}
}
αααααΆααααα½αααΈα’αααααα½α αα·αα’αααααααα ααΎαα’αΆα αααα αΆα α¬ααααααααααΆααα’αααααΆααααααΎαααααΌαααΆααααα»αααααααααΆααααα½α αα·αα’αΆα α’αΆαααΆαα α§ααΆα ααα αααααααααααΆαααααΎαααααααααΆαααααααΆαα CPU αααα’αΆα αααα ααααΆαα
get cpuAllocatableFormatted(){
let cpu = this.data.status.allocatable.cpu;
if(cpu.indexOf('m') > -1){
cpu = parseInt(cpu)/1000;
}
return cpu;
}
ααααα
αααααΈααααααααααααα·ααΈαααα½αααααααΎαααΆααα’ααααααΌαααΆααα·αααααΆααααΌααα αααα»α pluing.json ααααααΎααα αααα»ααααααααΆαα’αΆαααααα
αα
αααα»ααααα»ααααααΆαααααααααΈαα½αα ααΎαααααΌαα
ααα’α»ααααα αΆα PAGE NAME (αααααΆααααααΆααΉαααααΌαααΆαααααααααα
ααΆ slug αααααααααααα’αΆα
α
αΌαααααΎααΆα); ααααααααααΆαααΆααααααα½ααα»αααααΌααααααΆααααααα·ααααα·ααΆααααααααααα (αααααΈαααααΆαααΆαααααΌαααΆαααΆαα
αααα
module.ts); ααΆααααα αΆαααΈαα½ααΆααΈααααα’αααααααΎαααααααΎααΆαααΆαα½αααααααααα’αΆα
ααααΆα αα·αααΆαααααααα»ααααααααΆαααααΆαα
αα ααα
αα αααα»ααααΆαααΆααααααα½ααα»αααααΌαα ααααααααα·ααααα·ααΆαααααααα ααΎαααααΌαααααα templateUrl αααααααααΆααααΈαααααααΌααα ααΆααα―αααΆα html ααΆαα½αααΆααααααΆααα αα ααΆααααα»αα§ααααααααααΆ ααΆααααααΆαα αΆαααααααΆαα’αΆααααα ααΎαα’αΆα α αΌαααααΎααααΆαααααα»αααααΆαααα ααα½α 2α
- backendSrv - ααααΆααααααααααααα’ααααααααααΆαα½ααααΆαααΈααα Grafana API;
- datasourceSrv - ααααΆααααααααααααα’αααααααααααα»ααααααααΆαα½αααααααα·ααααααααΆααα’αααααααΆαααα‘αΎααα αααα»α Grafana ααααα’ααα (α§ααΆα ααα αα·ααΈααΆααααα .getAll() - αααα‘αααααααΈααααααααα·αααααααααααΆαααα‘αΎαααΆααα’αα; .get( ) - αααα‘ααααααα»ααααα»ααααααααα·ααααααααΆααααΆαααα½αα
αααααααΈ 4α ααααααα·αααααα
ααΆααααααααααα Grafana ααααααα·ααααααααΊααΌα ααααΆααααα·αααΉααααααα·ααΈαααα½αααααααααα ααΆααΆαα ααα»α α αΌαααααααΆααααΆαα module.js ααΆαα―αααΆααααααΆαααααααΆαααααΆ ββplugin.json α αα ααααααααΎααααααα·ααΈαααα½αααΆαα½α type=app ααΎαα’αΆα ααααΎα’ααααααααααΆαα½αααααααα·αααααααααααΆαααααΆαα (α§ααΆα ααα prometheus-datasource) αα·αααααααΎαααααΆαα αααααΎαα’αΆα αααααΆαα»ααααααααΆαααα αααα»ααααααΈαααααα·ααΈαααα½α (dist/datasource/*) α¬ααα‘αΎαααΆααΆαααΉαααα’ααα αααα»αααααΈααααααΎα ααααααα·ααααααααααΆααααααΆαα½αααΌααααααα·ααΈαααα½αα ααΆααα αΆαααΆα ααααααααΎααααΈα±ααααΆαααααΌ config.html αα·αα§ααααααααααΆ ConfigCtrl αααααΉαααααΌαααΆαααααΎαααααΆαααααααααααααα ααΆααααααααα§ααΆα αααααααααα·αααααα αα·αα§ααααααααααΆααααααα·αααααα αααα’αα»αααααααααα·ααααΆααααααααα·ααααααααααα’αααα
αα
αααα»ααααααα·ααΈαααα½α KubeGraf ααΈα
ααα»α
αααααΆααα’αααααααΎαααα·αααααΆα ααααααα·ααααααααΊααΆα§ααΆα ααααααααα»α kubernetes αααα’αα»αααααααααααΆαααΌα
ααΆαααααα (ααΌααααααααΆα
- ααΆααααααΌααα·ααααααααΈ k8s api-server (ααα½αααΆααααααΈααααα ααΆαααΆαααααααΆα...)
- ααααΎααααΌααααΈαα prometheus-datasource (αααααααΌαααΆαααααΎαααΎααα αααα»αααΆαααααααααααα·ααΈαααα½ααααααΆααα αααααααΆααααΆααααΈαα½αα) αα·αααΆαααααΎαααααααααΆαααΆαααααΎαααααΎααααΈααααΎαα·ααααααααΆαααα αααα»αααααααα·αα·αααα αα·ααα αααα»αααααΆαααααααααααα
- ααΆαααααΎαα αα α»ααααααααΆααα·αααααααα ααΎααααααααααα·ααΈαααα½ααα·αα·αααα (ααΆαα½αααΉαααΆααααααα’ααααΆααααΎα±ααααααα)α
- ααααΎαααΆααααα½αααΎααααΈαααααΎααααααΉαααααΌαα αααα»α grafana-dashboards (metriFindQuery() method)
- ααΆαααααΎαααααααΆααααααΆααααΆαα½αα ααααα 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"};
})
}
α ααα»α αα½αα±ααα αΆααα’αΆααααααααΆα ααααα‘αααα½α ααΆααααα·αααααααΎαααΊααΆαα’αα»ααααααααααΆααααααααααΆαα αα·αααΆαα’αα»ααααΆααααααΆααααααααα·ααααααα ααΆααααααΆ α ααααΈαααα’αα ααΎαα’αΆα ααααΎ datasourceHttpSettings αααααΆαααααΆααααααΆαα½α Grafana ααΎααααΈααααααα ααΆααααααααααΆαα αΌαααααΎααααααα·ααααααα α»ααααααα αααααααΎαααΆαααΆαααα ααΎαα’αΆα ααααααα ααΆααααααααααΆαα αΌαααααΎααααααα·αααααα http ααααααααΆαα url αα·αααΆααααααααΆααααααααααΆαα/ααΆαα’αα»ααααΆαααΆααΌαααααΆαα login-password α¬ client-cert/client-keyα ααΎααααΈα’αα»αααααααααααΆααααα»αααΆαααααααα ααΆααααααααααΆαα αΌαααααΎαααααααΎαααααΆαααααΆααα’αααααΆαα (αααααααΆαααΆααααααααααααΆαα k8s) ααΎαααααΌαααααΎααΆαααααααααααα·α α
ααΎααααΈαααααααΆααααα αΆααα α’αααα’αΆα
ααααΎααααααΆα Grafana βPlugin Routesβ αααααΆαααααΆαα (ααααααΆααααα’α·ααααααααα
/api/v8/namespaces ααΆαα½αααΉαααΆαα’αα»ααααΆαα ααααααΆ Bearer α
ααΆααααααΆαα· ααΎααααΈααααΎααΆαααΆαα½ααααΆαααΈααα k8s api ααΎαααααΌαααΆαα’αααααααΎααααΆαααααααΆααα·αααα·α
αΌαααααΎααΆαααα’αΆα αααα αΆααααααΆααααΆααααααΎααααα’αααααα’αΆα
αααααααααΆααα
αααα»α
αααααααΈ 5: ααΆαα ααααααΆα
αα
ααααααα’αααααΆαααααααααααα·ααΈαααα½α Grafana ααααΆαααααα½αααααα’ααα α’αααααΉαα
ααααααΎα±ααααΆα’αΆα
ααααΎααΆαααΆααΆααΆαααα αα
αααα»α Grafana αααααΊααΆαααααΆααααααααααα·ααΈαααα½ααααααΆααα
ααΈααα
ααΎααααΈα±αααααααα·ααΈαααα½αααααα’αααααΆααα
ααΎα αΆαααααΌαααΆα α’αααααααΌααααααΎα PR α
αΌα
αααααααααΊααΆαααααααααααα·ααΈαααα½αααααα’ααα url ααΊααΆαααααααΆαααα
ααΆααααααΆαα α αΎα commit ααΊααΆ hash αα commit αααααααααΆααααΆαααααααααα·ααΈαααα½αααΉαααΆαα
α αΎααα ααααααα’αααααΉαααΎαααΌαααΆαααα’ααα αΆαααααΌα ααΆα
αα·αααααααααααΆααααΆααΉαααααΌαααΆαα
αΆαααααααααααααααααααα·ααΈ Readme.md, Changelog.md αα·αα―αααΆα plugin.json ααααα’αααααΆαα½αααΉαααΆααα·αααααΆαααααα·ααΈαααα½αα
αααααααΈ 6: αααα½αα±ααααΆαααααα·ααααΆα
ααΎαβαα·αβααΆαβααααααβααΆαβα’αα·ααααβαααααα·ααΈβαααα½αβααααβααΎαβαααααΆααβααΈβααΆαβα ααβααααΆαα α αΎαα₯α‘αΌαααα ααΎααααα»αααααΎααΆαααΎααΆααααα½ααα·αα·ααααααΆαααααΉαααααΌαααΌαααΆαααααΎααααΆααααααΆαααααααααΆααα ααααα αααααααΆααα»αααΆαααααΈαααΎααααΈαααααα’ UX α αΎααααααΆααααα½αααΆαααα·αααααα’ααΆα αααΎααααααα½αααΆααααααΆααααΈααα‘αΎααααααα·ααΈαααα½αααΆαααααα’αα·αα·ααααααααΎα αα·αααΈααα»ααααα ααΎ GitHub (ααααα·αααΎα’αααα αΆαα αα αααα αΆα¬ααααΎαααααα’ααα αααα»αααΉααααααΆαα α·αααααααΆααααΆαα :)
ααΎααααααΉαααΆα’ααααααααααΉααα½αα’αααα±αααααααΈα§αααααααα’ααα αΆαααααΌα ααΆ Grafana α αΎααααα ααααΆααααααααααα·ααΈαααα½αααααΆαααααα½αααααα’αααα
ααΌαα’ααα»α!)
ααααα: www.habr.com