Untwikkeling fan in plugin foar Grafana: in skiednis fan grutte shots

ВсСм ΠΏΡ€ΠΈΠ²Π΅Ρ‚! НСсколько мСсяцСв Π½Π°Π·Π°Π΄ ΠΌΡ‹ запустили Π² ΠΏΡ€ΠΎΠ΄Π°ΠΊΡˆΠ½ наш Π½ΠΎΠ²Ρ‹ΠΉ open-source ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ β€” Grafana-ΠΏΠ»Π°Π³ΠΈΠ½ для ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° kubernetes, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π°Π·Π²Π°Π»ΠΈ DevOpsProdigy KubeGraf. Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΏΠ»Π°Π³ΠΈΠ½Π° доступСн Π² ΠΏΡƒΠ±Π»ΠΈΡ‡Π½ΠΎΠΌ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ Π½Π° GitHub. А Π² этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΏΠΎΠ΄Π΅Π»ΠΈΡ‚ΡŒΡΡ с Π²Π°ΠΌΠΈ историСй ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΌΡ‹ создавали ΠΏΠ»Π°Π³ΠΈΠ½, ΠΊΠ°ΠΊΠΈΠ΅ инструмСнты использовали ΠΈ с ΠΊΠ°ΠΊΠΈΠΌΠΈ ΠΏΠΎΠ΄Π²ΠΎΠ΄Π½Ρ‹ΠΌΠΈ камнями ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΠ»ΠΈΡΡŒ Π² процСссС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ. Погнали!

Π§Π°ΡΡ‚ΡŒ 0 β€” вводная: ΠΊΠ°ΠΊ ΠΌΡ‹ Π΄ΠΎ этого Π΄ΠΎΠΊΠ°Ρ‚ΠΈΠ»ΠΈΡΡŒ?

ИдСя Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ свой собствСнный ΠΏΠ»Π°Π³ΠΈΠ½ для Grafan’ы Ρƒ нас Ρ€ΠΎΠ΄ΠΈΠ»Π°ΡΡŒ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ случайно. Наша компания ΡƒΠΆΠ΅ Π±ΠΎΠ»Π΅Π΅ 10 Π»Π΅Ρ‚ занимаСтся ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ΠΎΠΌ web-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ уровня слоТности. Π—Π° это врСмя ΠΌΡ‹ Π½Π°Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΈ большой Π±Π°Π³Π°ΠΆ экспСртизы, интСрСсных кСйсов, ΠΎΠΏΡ‹Ρ‚Π° использования Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… систСм ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π°. И Π² ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΌΡ‹ задались вопросом: «А сущСствуСт Π»ΠΈ Π²ΠΎΠ»ΡˆΠ΅Π±Π½Ρ‹ΠΉ инструмСнт для ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° Kubernetes, Ρ‡Ρ‚ΠΎΠ±Ρ‹, ΠΊΠ°ΠΊ говорится, β€œΠΏΠΎΡΡ‚Π°Π²ΠΈΠ» ΠΈ забыл”»?.. ΠŸΡ€ΠΎΠΌΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚ΠΎΠΌ для ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³Π° k8s, СстСствСнно, Π΄Π°Π²Π½ΠΎ являСтся связка Prometheus + Grafana. И Π² качСствС Π³ΠΎΡ‚ΠΎΠ²Ρ‹Ρ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ для Π΄Π°Π½Π½ΠΎΠ³ΠΎ стэка сущСствуСт большой Π½Π°Π±ΠΎΡ€ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ Ρ€ΠΎΠ΄Π° инструмСнтов: prometheus-operator, Π½Π°Π±ΠΎΡ€ Π΄Π°ΡˆΠ±ΠΎΡ€Π΄ΠΎΠ² kubernetes-mixin, grafana-kubernetes-app.

НаиболСС интСрСсным Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠΌ для нас показался ΠΏΠ»Π°Π³ΠΈΠ½ grafana-kubernetes-app, Π½ΠΎ ΠΎΠ½ Π½Π΅ поддСрТиваСтся ΡƒΠΆΠ΅ большС Π³ΠΎΠ΄Π° ΠΈ, ΠΊ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅, Π½Π΅ ΡƒΠΌΠ΅Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с Π½ΠΎΠ²Ρ‹ΠΌΠΈ вСрсиями node-exporter’а ΠΈ kube-state-metrics’а. И Π² ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΌΡ‹ Ρ€Π΅ΡˆΠΈΠ»ΠΈ: «А Π½Π΅ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π»ΠΈ Π½Π°ΠΌ своС собствСнноС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅?Β»

КакиС ΠΈΠ΄Π΅ΠΈ ΠΌΡ‹ Ρ€Π΅ΡˆΠΈΠ»ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² своСм ΠΏΠ»Π°Π³ΠΈΠ½Π΅:

  • визуализация Β«ΠΊΠ°Ρ€Ρ‚Ρ‹ прилоТСния»: ΡƒΠ΄ΠΎΠ±Π½ΠΎΠ΅ прСдставлСниС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π² кластСрС, сгруппированных ΠΏΠΎ namespace’ам, deployment’ам…;
  • визуализация связСй Π²ΠΈΠ΄Π° Β«deployment β€” service (+ports)Β».
  • визуализация распрСдСлСния ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ кластСра ΠΏΠΎ nod’ам кластСра.
  • сбор ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊ ΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… источников: Prometheus ΠΈ k8s api server.
  • ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ ΠΊΠ°ΠΊ инфраструктурной части (использованиС процСссорного Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, памяти, дисковой подсистСмы, сСти), Ρ‚Π°ΠΊ ΠΈ Π»ΠΎΠ³ΠΈΠΊΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ β€” health-status pod’ов, количСство доступных Ρ€Π΅ΠΏΠ»ΠΈΠΊ, информация ΠΎ ΠΏΡ€ΠΎΡ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠΈ liveness/readyness-ΠΏΡ€ΠΎΠ±.

Π§Π°ΡΡ‚ΡŒ 1: Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Β«ΠΏΠ»Π°Π³ΠΈΠ½ для GrafanaΒ»?

Π‘ тСхничСской Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния, ΠΏΠ»Π°Π³ΠΈΠ½ для Grafana β€” это angular-ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ хранится Π² data-Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ Grafan’ы (/var/grafana/plugins/<your_plugin_name>/dist/module.js) ΠΈ ΠΌΠΎΠΆeΡ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½ ΠΊΠ°ΠΊ SystemJS-ΠΌΠΎΠ΄ΡƒΠ»ΡŒ. Π’Π°ΠΊΠΆΠ΅ Π² этой Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Ρ„Π°ΠΉΠ» plugin.json, содСрТащий Π² сСбС всю ΠΌΠ΅Ρ‚Π°ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ вашСм ΠΏΠ»Π°Π³ΠΈΠ½Π΅: Π½Π°Π·Π²Π°Π½ΠΈΠ΅, вСрсия, Ρ‚ΠΈΠΏ ΠΏΠ»Π°Π³ΠΈΠ½Π°, ссылки Π½Π° Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ/сайт/Π»ΠΈΡ†Π΅Π½Π·ΠΈΡŽ, зависимости ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅.

Untwikkeling fan in plugin foar Grafana: in skiednis fan grutte shots
module.ts

Untwikkeling fan in plugin foar Grafana: in skiednis fan grutte shots
plugin.json

Как Π²ΠΈΠ΄Π½ΠΎ Π½Π° ΡΠΊΡ€ΠΈΠ½ΡˆΠΎΡ‚Π΅, ΠΌΡ‹ ΡƒΠΊΠ°Π·Π°Π»ΠΈ plugin.type = app. Ибо ΠΏΠ»Π°Π³ΠΈΠ½Ρ‹ для Grafana ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Ρ‚Ρ€Π΅Ρ… Π²ΠΈΠ΄ΠΎΠ²:

paniel: самый распространСнный Ρ‚ΠΈΠΏ ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ² β€” прСдставляСт собой панСль для Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для построСния Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π΄Π°ΡˆΠ±ΠΎΡ€Π΄ΠΎΠ².
datasource: ΠΏΠ»Π°Π³ΠΈΠ½-ΠΊΠΎΠ½Π½Π΅ΠΊΡ‚ΠΎΡ€ Π΄ΠΎ ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ источника Π΄Π°Π½Π½Ρ‹Ρ… (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Prometheus-datasource, ClickHouse-datasource, ElasticSearch-datasource).
app: ΠΏΠ»Π°Π³ΠΈΠ½, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ Π²Π°ΠΌ ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ своС собствСнноС Ρ„Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π²Π½ΡƒΡ‚Ρ€ΠΈ Grafana, ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ свои собствСнныС html-страницы ΠΈ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ datasource для Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…. Π’Π°ΠΊΠΆΠ΅ Π² качСствС зависимостСй ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΠ»Π°Π³ΠΈΠ½Ρ‹ Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ‚ΠΈΠΏΠΎΠ² (datasource, panel) ΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Π΄Π°ΡˆΠ±ΠΎΡ€Π΄Ρ‹.

Untwikkeling fan in plugin foar Grafana: in skiednis fan grutte shots
ΠŸΡ€ΠΈΠΌΠ΅Ρ€ зависимостСй ΠΏΠ»Π°Π³ΠΈΠ½Π° с type = app.

Π’ качСствС языка программирования ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ JavaScript, Ρ‚Π°ΠΊ ΠΈ TypeScript (ΠΌΡ‹ свой Π²Ρ‹Π±ΠΎΡ€ остановили Π½Π° Π½Π΅ΠΌ). Π—Π°Π³ΠΎΡ‚ΠΎΠ²ΠΊΠΈ для hello-world ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ² любого Ρ‚ΠΈΠΏΠ° Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΉΡ‚ΠΈ ΠΏΠΎ ссылкС: Π² Π΄Π°Π½Π½ΠΎΠΌ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ прСдставлСно большоС количСство starter-pack’ов (Π΅ΡΡ‚ΡŒ Π΄Π°ΠΆΠ΅ ΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠ»Π°Π³ΠΈΠ½Π° Π½Π° React) с прСдустановлСнными ΠΈ настроСнными сборщиками.

Π§Π°ΡΡ‚ΡŒ 2: ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° локального окруТСния

Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π½Π°Π΄ ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠΌ Π½Π°ΠΌ, СстСствСнно, понадобится kubernetes-кластСр со всСми прСдустановлСнными инструмСнтами: prometheus, node-exporter, kube-state-metrics, grafana. ΠžΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡΠ΅Ρ‚Π°ΠΏΠΈΡ‚ΡŒΡΡ быстро, Π»Π΅Π³ΠΊΠΎ ΠΈ Π½Π΅ΠΏΡ€ΠΈΠ½ΡƒΠΆΠ΄Π΅Π½Π½ΠΎ, Π° для обСспСчСния hot-reload data-дирСктория Grafana Π΄ΠΎΠ»ΠΆΠ½Π° ΠΌΠΎΠ½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ нСпосрСдствСнно с ΠΌΠ°ΡˆΠΈΠ½Ρ‹ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°.

Π‘Π°ΠΌΡ‹ΠΌ ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΌ, Π½Π° наш взгляд, способом локальной Ρ€Π°Π±ΠΎΡ‚Ρ‹ с kubernetes являСтся minikube. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ шагом устанавливаСм связку Prometheus + Grafana c ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ prometheus-operator. Π’ dit artikel ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ описан процСсс установки prometheus-operator Π½Π° minikube. Для Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ пСрсистСнтности Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ persistence: true Π² Ρ„Π°ΠΉΠ»Π΅ 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, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ описаны конструктор, дСструктор, ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ для обновлСния ΠΈ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ видимости. Π’ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ· классов описаны Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ сущностями, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, список pod’ов Ρƒ сущности Ρ‚ΠΈΠΏΠ° deployment.

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 = [];
   }
}

C ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ getter’ов ΠΈ setter’ов ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ Π½ΡƒΠΆΠ½Ρ‹Π΅ Π½Π°ΠΌ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ сущностСй Π² ΡƒΠ΄ΠΎΠ±Π½ΠΎΠΌ ΠΈ Ρ‡ΠΈΡ‚Π°Π±Π΅Π»ΡŒΠ½ΠΎΠΌ Π²ΠΈΠ΄Π΅. НапримСр ΠΎΡ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π²Ρ‹Π²ΠΎΠ΄ allocatable cpu nod’ы:

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

siden

Бписок всСх страниц нашСго ΠΏΠ»Π°Π³ΠΈΠ½Π° ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ описываСтся Π² нашСм pluing.json Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ зависимостСй:

Untwikkeling fan in plugin foar Grafana: in skiednis fan grutte shots

Π’ Π±Π»ΠΎΠΊΠ΅ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ страницы ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΠΠ—Π’ΠΠΠ˜Π• БВРАНИЦЫ (ΠΎΠ½ΠΎ Π·Π°Ρ‚Π΅ΠΌ Π±ΡƒΠ΄Π΅Ρ‚ сконвСртировано Π² slug, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ эта страница Π±ΡƒΠ΄Π΅Ρ‚ доступна); Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°, ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰Π΅Π³ΠΎ Π·Π° Ρ€Π°Π±ΠΎΡ‚Ρƒ этой страницС (список ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² экспортится Π² module.ts); ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ Ρ€ΠΎΠ»ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ доступна Ρ€Π°Π±ΠΎΡ‚Π° с этой страницСй ΠΈ настройки Π½Π°Π²ΠΈΠ³Π°Ρ†ΠΈΠΈ для Π±ΠΎΠΊΠΎΠ²ΠΎΠΉ ΠΏΠ°Π½Π΅Π»ΠΈ.

Π’ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π΅, ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰Π΅ΠΌ Π·Π° Ρ€Π°Π±ΠΎΡ‚Ρƒ страницы, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ templateUrl, ΠΏΠ΅Ρ€Π΅Π΄Π°Π² Ρ‚ΡƒΠ΄Π° ΠΏΡƒΡ‚ΡŒ Π΄ΠΎ html-Ρ„Π°ΠΉΠ»Π° с Ρ€Π°Π·ΠΌΠ΅Ρ‚ΠΊΠΎΠΉ. Π’Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π°, Ρ‡Π΅Ρ€Π΅Π· dependency injection, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ Π΄ΠΎ 2-Ρ… Π²Π°ΠΆΠ½Ρ‹Ρ… angular-сСрвисов:

  • backendSrv β€” сСрвис, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ взаимодСйствиС с api-сСрвСром Π³Ρ€Π°Ρ„Π°Π½Ρ‹;
  • datasourceSrv β€” сСрвис, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ локальноС взаимодСйствиС со всСми datasource, установлСнными Π² вашСй Grafana (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΌΠ΅Ρ‚ΠΎΠ΄ .getAll() β€” Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ список всСх установлСнных datasource’ов; .get(<nΠ°me>) β€” Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚-инстанс ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ datasource.

Untwikkeling fan in plugin foar Grafana: in skiednis fan grutte shots

Untwikkeling fan in plugin foar Grafana: in skiednis fan grutte shots

Untwikkeling fan in plugin foar Grafana: in skiednis fan grutte shots

Π§Π°ΡΡ‚ΡŒ 4: datasource

Π‘ Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния Grafana, datasource прСдставляСт собой Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅ ΠΏΠ»Π°Π³ΠΈΠ½, ΠΊΠ°ΠΊ ΠΈ всС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅: Ρƒ Π½Π΅Π³ΠΎ Π΅ΡΡ‚ΡŒ своя Ρ‚ΠΎΡ‡ΠΊΠ° Π²Ρ…ΠΎΠ΄Π° module.js, Π΅ΡΡ‚ΡŒ Ρ„Π°ΠΉΠ» с ΠΌΠ΅Ρ‚Π°ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ plugin.json. ΠŸΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ ΠΏΠ»Π°Π³ΠΈΠ½Π° с type = app ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ с ΡƒΠΆΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ datasource’ами (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, prometheus-datasource), Ρ‚Π°ΠΊ ΠΈ своими собствСнными, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ нСпосрСдствСнно Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ ΠΏΠ»Π°Π³ΠΈΠ½Π° (dist/datasource/*) ΠΈΠ»ΠΈ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ. Π’ нашСм случаС datasource поставляСтся вмСстС с ΠΊΠΎΠ΄ΠΎΠΌ ΠΏΠ»Π°Π³ΠΈΠ½Π°. Π’Π°ΠΊΠΆΠ΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ шаблона config.html ΠΈ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π° ConfigCtrl, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ для страницы конфигурирования экзСмпляра datasource’а ΠΈ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π° Datasource, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ рСализуСтся Π»ΠΎΠ³ΠΈΠΊΠ° Ρ€Π°Π±ΠΎΡ‚Ρ‹ вашСго datasource’а.

Π’ ΠΏΠ»Π°Π³ΠΈΠ½Π΅ KubeGraf, с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ интСрфСйса, datasource прСдставляСт собой экзСмпляр kubernetes-кластСра, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ возмоТности (исходный ΠΊΠΎΠ΄ доступСн link):

  • Π·Π°Π±ΠΎΡ€ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· api-server’а k8s (ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ списка namespace’ов, deployment’ов…)
  • проксированиС запросов Π² prometheus-datasource (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ выбираСтся Π² настройках ΠΏΠ»Π°Π³ΠΈΠ½Π° для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ кластСра) ΠΈ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΡ‚Π²Π΅Ρ‚ΠΎΠ² для использования Π΄Π°Π½Π½Ρ‹Ρ… ΠΊΠ°ΠΊ Π² статичных страницах, Ρ‚Π°ΠΊ ΠΈ Π² Π΄Π°ΡˆΠ±ΠΎΡ€Π΄Π°Ρ….
  • ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° статичных страницах ΠΏΠ»Π°Π³ΠΈΠ½Π° (с установлСнным Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ refresh rate).
  • ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° запросов для формирования template-листа Π² grafana-dashboards (ΠΌΠ΅Ρ‚ΠΎΠ΄ .metriFindQuery())

Untwikkeling fan in plugin foar Grafana: in skiednis fan grutte shots

Untwikkeling fan in plugin foar Grafana: in skiednis fan grutte shots

Untwikkeling fan in plugin foar Grafana: in skiednis fan grutte shots

  • тСст соСдинСния с ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΌ 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"};
       })
}

ΠžΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌ интСрСсным ΠΌΠΎΠΌΠ΅Π½Ρ‚ΠΎΠΌ, Π½Π° наш взгляд, являСтся рСализация ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΈ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ для datasource. Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, ΠΈΠ· ΠΊΠΎΡ€ΠΎΠ±ΠΊΠΈ для ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ доступа Π΄ΠΎ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠ³ΠΎ источника Π΄Π°Π½Π½Ρ‹Ρ… ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ встроСнный ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Grafana β€” datasourceHttpSettings. Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ этого ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ доступ Π΄ΠΎ http-источника Π΄Π°Π½Π½Ρ‹Ρ…, ΡƒΠΊΠ°Π·Π°Π² url ΠΈ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ настройки Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ/Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·Π°Ρ†ΠΈΠΈ: Π»ΠΎΠ³ΠΈΠ½-ΠΏΠ°Ρ€ΠΎΠ»ΡŒ, ΠΈΠ»ΠΈ client-cert/client-key. Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ настройки доступа с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ bearer-Ρ‚ΠΎΠΊΠ΅Π½Π° (Π΄Π΅Ρ„Π°ΠΊΡ‚ΠΎ стандарт для k8s), ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Β«ΠΏΠΎΡ…ΠΈΠΌΠΈΡ‡ΠΈΡ‚ΡŒΒ».

Для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ этой Π·Π°Π΄Π°Ρ‡ΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ встроСнный ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Grafana Β«Plugin RoutesΒ» (ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ Π½Π° ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ страницС Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ). Π’ настройках нашСго datasource’а ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠ±ΡŠΡΠ²ΠΈΡ‚ΡŒ Π½Π°Π±ΠΎΡ€ ΠΏΡ€Π°Π²ΠΈΠ» Ρ€ΠΎΡƒΡ‚ΠΈΠ½Π³Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒΡΡ proxy-сСрвСром grafana. НапримСр, для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ endpoint’а сущСствуСт Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ проставлСния Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ² ΠΈΠ»ΠΈ url с Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ ΡˆΠ°Π±Π»ΠΎΠ½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ, Π΄Π°Π½Π½Ρ‹Π΅ для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ€Π°Ρ‚ΡŒΡΡ ΠΈΠ· ΠΏΠΎΠ»Π΅ΠΉ jsonData ΠΈ secureJsonData (для хранСния ΠΏΠ°Ρ€ΠΎΠ»Π΅ΠΉ ΠΈΠ»ΠΈ Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ² Π² ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅). Π’ нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ запросы Π²ΠΈΠ΄Π° /__proxy/api/v1/namespaces Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΎΠΊΡΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π½Π° url Π²ΠΈΠ΄Π°
<your_k8s_api_url>/api/v1/namespaces с проставлСниСм Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° Authorization: Bearer .

Untwikkeling fan in plugin foar Grafana: in skiednis fan grutte shots

Untwikkeling fan in plugin foar Grafana: in skiednis fan grutte shots

ЕстСствСнно, для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с api-сСрвСром k8s Π½Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ с readonly доступами, манифСсты для создания ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Ρ‚Π°ΠΊΠΆΠ΅ Π½Π°ΠΉΡ‚ΠΈ Π² исходном ΠΊΠΎΠ΄Π΅ ΠΏΠ»Π°Π³ΠΈΠ½Π°.

Π§Π°ΡΡ‚ΡŒ 5: Ρ€Π΅Π»ΠΈΠ·

Untwikkeling fan in plugin foar Grafana: in skiednis fan grutte shots

ПослС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π²Ρ‹ Π½Π°ΠΏΠΈΡˆΠ΅Ρ‚Π΅ свой собствСнный ΠΏΠ»Π°Π³ΠΈΠ½ для Grafana, Π²Π°ΠΌ, СстСствСнно, захочСтся Π²Ρ‹Π»ΠΎΠΆΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π² ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΉ доступ. Π’ Grafana это Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ², доступная ΠΏΠΎ ссылкС grafana.com/grafana/plugins

Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ваш ΠΏΠ»Π°Π³ΠΈΠ½ Π±Ρ‹Π» доступСн Π² ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΌ сторС, Π²Π°ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ PR Π² dizze repository, Π΄ΠΎΠ±Π°Π²ΠΈΠ² Π² Ρ„Π°ΠΉΠ» repo.json содСрТимоС Π²ΠΈΠ΄Π°:

Untwikkeling fan in plugin foar Grafana: in skiednis fan grutte shots

Π³Π΄Π΅ version β€” вСрсия вашСго ΠΏΠ»Π°Π³ΠΈΠ½Π°, url β€” ссылка Π½Π° Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ, Π° commit β€” hash ΠΊΠΎΠΌΠΌΠΈΡ‚Π°, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π±ΡƒΠ΄Π΅Ρ‚ доступна конкрСтная вСрсия ΠΏΠ»Π°Π³ΠΈΠ½Π°.

И Π½Π° Π²Ρ‹Ρ…ΠΎΠ΄Π΅ Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ Π·Π°ΠΌΠ΅Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π²ΠΈΠ΄Π°:

Untwikkeling fan in plugin foar Grafana: in skiednis fan grutte shots

Π”Π°Π½Π½Ρ‹Π΅ для Π½Π΅Π΅ Π±ΡƒΠ΄ΡƒΡ‚ автоматичСски сграблСны с вашСго Readme.md, Changelog.md ΠΈ Ρ„Π°ΠΉΠ»Π° plugin.json с описаниСм ΠΏΠ»Π°Π³ΠΈΠ½Π°.

Π§Π°ΡΡ‚ΡŒ 6: вмСсто Π²Ρ‹Π²ΠΎΠ΄ΠΎΠ²

ΠœΡ‹ Π½Π΅ ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‚ΠΈΠ»ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ нашСго ΠΏΠ»Π°Π³ΠΈΠ½Π° послС Ρ€Π΅Π»ΠΈΠ·Π°. И сСйчас Ρ€Π°Π±ΠΎΡ‚Π°Π΅ΠΌ Π½Π°Π΄ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΌ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ΠΎΠΌ использования рСсурсов Π½ΠΎΠ΄ кластСра, Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ΠΌ Π½ΠΎΠ²Ρ‹Ρ… Ρ„ΠΈΡ‡ для ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ UX, Π° Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π°Π·Π³Ρ€Π΅Π±Π°Π΅ΠΌ большоС количСства Ρ„ΠΈΠ΄Π±Π΅ΠΊΠ°, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ послС установок ΠΏΠ»Π°Π³ΠΈΠ½Π° ΠΊΠ°ΠΊ нашими ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°ΠΌΠΈ, Ρ‚Π°ΠΊ ΠΈ ΠΈΠ· ΠΈΡˆΡˆΡƒΠ΅Π² Π½Π° Π³ΠΈΡ‚Ρ…Π°Π±Π΅ (Ссли Π²Ρ‹ оставитС своС issue ΠΈΠ»ΠΈ pull request, я Π±ΡƒΠ΄Ρƒ ΠΎΡ‡Π΅Π½ΡŒ счастлив πŸ™‚ ).

НадССмся Ρ‡Ρ‚ΠΎ данная ΡΡ‚Π°Ρ‚ΡŒΡ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ‚ Π²Π°ΠΌ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ Π² Ρ‚Π°ΠΊΠΎΠΌ прСкрасном инструмСнтС ΠΊΠ°ΠΊ Grafana ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ свой собствСнный ΠΏΠ»Π°Π³ΠΈΠ½.

Бпасибо!)

Boarne: www.habr.com

Add a comment