Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° плъгин Π·Π° Grafana: история Π½Π° Π½Π°Ρ‚Ρ€ΡƒΠΏΠ°Π½ΠΈΡ‚Π΅ ΠΎΠΏΠΈΡ‚ΠΈ

Π—Π΄Ρ€Π°Π²Π΅ΠΉΡ‚Π΅ Π½Π° всички! ΠŸΡ€Π΅Π΄ΠΈ няколко мСсСца пуснахмС Π² продукция новия си open-source ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ β€” Grafana плъгин Π·Π° ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ Π½Π° Kubernetes, ΠΊΠΎΠΉΡ‚ΠΎ Π½Π°Ρ€Π΅ΠΊΠΎΡ…ΠΌΠ΅ DevOpsProdigy KubeGraf. Π˜Π·Ρ…ΠΎΠ΄Π½ΠΈΡΡ‚ ΠΊΠΎΠ΄ Π½Π° плъгина Π΅ Π΄ΠΎΡΡ‚ΡŠΠΏΠ΅Π½ Π² ΠΏΡƒΠ±Π»ΠΈΡ‡Π΅Π½ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈ Π½Π° GitHub. Π’ Ρ‚Π°Π·ΠΈ статия искамС Π΄Π° сподСлим с вас историята Π·Π° Ρ‚ΠΎΠ²Π° ΠΊΠ°ΠΊ ΡΡŠΠ·Π΄Π°Π²Π°Ρ…ΠΌΠ΅ плъгина, ΠΊΠ°ΠΊΠ²ΠΈ инструмСнти ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ…ΠΌΠ΅ ΠΈ с ΠΊΠ°ΠΊΠ²ΠΈ трудности сС ΡΠ±Π»ΡŠΡΠΊΠ°Ρ…ΠΌΠ΅ ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅ Π½Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°Ρ‚Π°. НСка Π΄Π° Π·Π°ΠΏΠΎΡ‡Π½Π΅ΠΌ!

Част 0 β€” Π’ΡŠΠ²Π΅Π΄Π΅Π½ΠΈΠ΅: ΠΊΠ°ΠΊ стигнахмС Π΄ΠΎΡ‚ΡƒΠΊ?

Π˜Π΄Π΅ΡΡ‚Π° Π΄Π° напишСм собствСн плъгин Π·Π° Grafana сС появи случайно. ΠΠ°ΡˆΠ°Ρ‚Π° компания сС Π·Π°Π½ΠΈΠΌΠ°Π²Π° с ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ Π½Π° ΡƒΠ΅Π± ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈ с Ρ€Π°Π·Π»ΠΈΡ‡Π½Π° слоТност Π²Π΅Ρ‡Π΅ ΠΏΠΎΠ²Π΅Ρ‡Π΅ ΠΎΡ‚ 10 Π³ΠΎΠ΄ΠΈΠ½ΠΈ. ΠŸΡ€Π΅Π· Ρ‚ΠΎΠ²Π° Π²Ρ€Π΅ΠΌΠ΅ Π½Π°Ρ‚Ρ€ΡƒΠΏΠ°Ρ…ΠΌΠ΅ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»Π΅Π½ ΠΎΠΏΠΈΡ‚, интСрСсни казуси ΠΈ ΠΎΠΏΠΈΡ‚ΠΈ с Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ΠΎΠ²ΠΈ систСми. И Π² Π΅Π΄ΠΈΠ½ ΠΌΠΎΠΌΠ΅Π½Ρ‚ си Π·Π°Π΄Π°Π΄ΠΎΡ…ΠΌΠ΅ Π²ΡŠΠΏΡ€ΠΎΡΠ°: 'Π‘ΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π° Π»ΠΈ магичСски инструмСнт Π·Π° ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ Π½Π° Kubernetes, ΠΊΠΎΠΉΡ‚ΠΎ, ΠΊΠ°ΠΊΡ‚ΠΎ ΠΊΠ°Π·Π²Π°Ρ‚, 'Π΄Π° Π³ΠΎ ΠΏΠΎΡΡ‚Π°Π²ΠΈΡˆ ΠΈ Π΄Π° Π·Π°Π±Ρ€Π°Π²ΠΈΡˆ'?... Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚ΡŠΡ‚ Π·Π° ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ Π½Π° k8s, СстСствСно, ΠΎΡ‚Π΄Π°Π²Π½Π° Π΅ комбинацията Prometheus + Grafana. И Π·Π° Ρ‚ΠΎΠ·ΠΈ стСк ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π° голям Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ инструмСнти: prometheus-operator, Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΈ Π΄Π°ΡˆΠ±ΠΎΡ€Π΄ΠΎΠ²Π΅ kubernetes-mixin, grafana-kubernetes-app.

Най-интригуващият Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Π·Π° нас сС ΠΎΠΊΠ°Π·Π° ΠΏΠ»ΡŠΠ³ΠΈΠ½ΡŠΡ‚ grafana-kubernetes-app, Π½ΠΎ Ρ‚ΠΎΠΉ Π½Π΅ Π΅ ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ°Π½ Π²Π΅Ρ‡Π΅ ΠΏΠΎΠ²Π΅Ρ‡Π΅ ΠΎΡ‚ Π³ΠΎΠ΄ΠΈΠ½Π° ΠΈ освСн Ρ‚ΠΎΠ²Π° Π½Π΅ Ρ€Π°Π±ΠΎΡ‚ΠΈ с Π½ΠΎΠ²ΠΈΡ‚Π΅ вСрсии Π½Π° node-exporter ΠΈ kube-state-metrics. Π’ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Ρ€Π΅ΡˆΠΈΡ…ΠΌΠ΅: 'А Π½Π΅ Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌ Π»ΠΈ нашС собствСно Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅?'

Какви ΠΈΠ΄Π΅ΠΈ Ρ€Π΅ΡˆΠΈΡ…ΠΌΠ΅ Π΄Π° Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°ΠΌΠ΅ Π² нашия плъгин:

  • визуализация Π½Π° 'ΠΊΠ°Ρ€Ρ‚Π° Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ': ΡƒΠ΄ΠΎΠ±Π½ΠΎ прСдставянС Π½Π° прилоТСнията Π² ΠΊΠ»ΡŠΡΡ‚Π΅Ρ€Π°, Π³Ρ€ΡƒΠΏΠΈΡ€Π°Π½ΠΈ ΠΏΠΎ namespace, deployments…;
  • визуализация Π½Π° ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ ΠΎΡ‚ Ρ‚ΠΈΠΏΠ° 'deployment β€” service (+ports)'.
  • визуализация Π½Π° Ρ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° прилоТСнията Π² ΠΊΠ»ΡŠΡΡ‚Π΅Ρ€Π° ΠΏΠΎ nod'ΠΎΠ²Π΅ Π½Π° ΠΊΠ»ΡŠΡΡ‚Π΅Ρ€Π°.
  • ΡΡŠΠ±ΠΈΡ€Π°Π½Π΅ Π½Π° ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ ΠΈ информация ΠΎΡ‚ няколко ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΠΊΠ°: Prometheus ΠΈ k8s API ΡΡŠΡ€Π²ΡŠΡ€.
  • ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ ΠΊΠ°ΠΊΡ‚ΠΎ Π½Π° инфраструктурната част (ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π° Π½Π° процСсорно Π²Ρ€Π΅ΠΌΠ΅, ΠΏΠ°ΠΌΠ΅Ρ‚, дискова подсистСма, ΠΌΡ€Π΅ΠΆΠ°), Ρ‚Π°ΠΊΠ° ΠΈ Π½Π° Π»ΠΎΠ³ΠΈΠΊΠ°Ρ‚Π° Π½Π° прилоТСнията β€” health-status Π½Π° pod'ΠΎΠ²Π΅Ρ‚Π΅, Π±Ρ€ΠΎΠΉ Π½Π°Π»ΠΈΡ‡Π½ΠΈ Ρ€Π΅ΠΏΠ»ΠΈΠΊΠΈ, информация Π·Π° ΠΏΡ€Π΅ΠΌΠΈΠ½Π°Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° liveness/readiness ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ.

Част 1: Какво Π΅ 'плъгин Π·Π° Grafana'?

ΠžΡ‚ тСхничСска Π³Π»Π΅Π΄Π½Π° Ρ‚ΠΎΡ‡ΠΊΠ°, плъгин Π·Π° Grafana Π΅ Angular ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π΅Ρ€, ΠΊΠΎΠΉΡ‚ΠΎ сС ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π° Π² data дирСкторията Π½Π° Grafana (/var/grafana/plugins/<your_plugin_name>/dist/module.js) ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС Π·Π°Ρ€Π΅Π΄Π΅Π½ ΠΊΠ°Ρ‚ΠΎ SystemJS-ΠΌΠΎΠ΄ΡƒΠ». Π‘ΡŠΡ‰ΠΎ Ρ‚Π°ΠΊΠ°, Π² Ρ‚Π°Π·ΠΈ дирСктория трябва Π΄Π° сС Π½Π°ΠΌΠΈΡ€Π° Ρ„Π°ΠΉΠ»ΡŠΡ‚ plugin.json, ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Ρ‰ цялата мСтаинформация Π·Π° вашия плъгин: ΠΈΠΌΠ΅, вСрсия, Ρ‚ΠΈΠΏ плъгин, Π²Ρ€ΡŠΠ·ΠΊΠΈ към Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅/сайт/Π»ΠΈΡ†Π΅Π½Π·, зависимости ΠΈ Ρ‚Π°ΠΊΠ° Π½Π°Ρ‚Π°Ρ‚ΡŠΠΊ.

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° плъгин Π·Π° Grafana: история Π½Π° Π½Π°Ρ‚Ρ€ΡƒΠΏΠ°Π½ΠΈΡ‚Π΅ ΠΎΠΏΠΈΡ‚ΠΈ
module.ts

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° плъгин Π·Π° Grafana: история Π½Π° Π½Π°Ρ‚Ρ€ΡƒΠΏΠ°Π½ΠΈΡ‚Π΅ ΠΎΠΏΠΈΡ‚ΠΈ
plugin.json

ΠšΠ°ΠΊΡ‚ΠΎ сС Π²ΠΈΠΆΠ΄Π° ΠΎΡ‚ Π΅ΠΊΡ€Π°Π½Π½Π°Ρ‚Π° снимка, ΡƒΠΊΠ°Π·Π°Ρ…ΠΌΠ΅ plugin.type = app. Π—Π°Ρ‰ΠΎΡ‚ΠΎ ΠΏΠ»ΡŠΠ³ΠΈΠ½ΠΈΡ‚Π΅ Π·Π° Grafana ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ ΠΎΡ‚ Ρ‚Ρ€ΠΈ Π²ΠΈΠ΄Π°:

panel: Π½Π°ΠΉ-разпространСният Ρ‚ΠΈΠΏ плъгини - прСдставлява ΠΏΠ°Π½Π΅Π» Π·Π° визуализация Π½Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° сС Π·Π° ΠΈΠ·Π³Ρ€Π°ΠΆΠ΄Π°Π½Π΅ Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Π΄Π°ΡˆΠ±ΠΎΡ€Π΄ΠΎΠ²Π΅.
datasource: плъгин-ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€ към ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ Π½Π° Π΄Π°Π½Π½ΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Prometheus-datasource, ClickHouse-datasource, ElasticSearch-datasource).
app: плъгин, ΠΊΠΎΠΉΡ‚ΠΎ Π²ΠΈ позволява Π΄Π° ΠΈΠ·Π³Ρ€Π°Π΄ΠΈΡ‚Π΅ собствСното си Ρ„Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² Grafana, Π΄Π° ΡΡŠΠ·Π΄Π°Π²Π°Ρ‚Π΅ свои собствСни html-страници ΠΈ Ρ€ΡŠΡ‡Π½ΠΎ Π΄Π° сС ΡΠ²ΡŠΡ€Π·Π²Π°Ρ‚Π΅ с datasource Π·Π° визуализация Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Π΄Π°Π½Π½ΠΈ. Π‘ΡŠΡ‰ΠΎ Ρ‚Π°ΠΊΠ°, ΠΊΠ°Ρ‚ΠΎ зависимости ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ плъгини ΠΎΡ‚ Π΄Ρ€ΡƒΠ³ Ρ‚ΠΈΠΏ (datasource, panel) ΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ Π΄Π°ΡˆΠ±ΠΎΡ€Π΄ΠΎΠ²Π΅.

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° плъгин Π·Π° Grafana: история Π½Π° Π½Π°Ρ‚Ρ€ΡƒΠΏΠ°Π½ΠΈΡ‚Π΅ ΠΎΠΏΠΈΡ‚ΠΈ
ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π·Π° зависимости Π½Π° плъгин с type = app.

ΠšΠ°Ρ‚ΠΎ Π΅Π·ΠΈΠΊ Π·Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈΡ€Π°Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ ΠΊΠ°ΠΊΡ‚ΠΎ JavaScript, Ρ‚Π°ΠΊΠ° ΠΈ TypeScript (Π½ΠΈΠ΅ ΠΈΠ·Π±Ρ€Π°Ρ…ΠΌΠ΅ Π½Π΅Π³ΠΎ). Π¨Π°Π±Π»ΠΎΠ½ΠΈΡ‚Π΅ Π·Π° hello-world плъгини ΠΎΡ‚ всякакъв Ρ‚ΠΈΠΏ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π½Π°ΠΌΠ΅Ρ€ΠΈΡ‚Π΅ Π½Π° Π²Ρ€ΡŠΠ·ΠΊΠ°Ρ‚Π°: Π² Ρ‚ΠΎΠ·ΠΈ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ Π΅ прСдставСн голям Π±Ρ€ΠΎΠΉ starter-pack’овС (ΠΈΠΌΠ° Π΄ΠΎΡ€ΠΈ СкспСримСнталСн ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π½Π° плъгин Π½Π° React) с ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»Π½ΠΎ инсталирани ΠΈ настроСни сборки.

Част 2: ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° Π½Π° Π»ΠΎΠΊΠ°Π»Π½Π° срСда

Π—Π° Ρ€Π°Π±ΠΎΡ‚Π° ΠΏΠΎ плъгина, Ρ€Π°Π·Π±ΠΈΡ€Π° сС, Ρ‰Π΅ Π½ΠΈ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ kubernetes-ΠΊΠ»ΡŠΡΡ‚Π΅Ρ€ с всички ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»Π½ΠΎ инсталирани инструмСнти: prometheus, node-exporter, kube-state-metrics, grafana. ΠžΠΊΠΎΠ»Π½Π°Ρ‚Π° срСда трябва Π΄Π° бъдС настроСна Π±ΡŠΡ€Π·ΠΎ, лСсно ΠΈ Π±Π΅Π·ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ½ΠΎ, Π° Π·Π° осигуряванС Π½Π° hot-reload дирСкторията Π½Π° Π΄Π°Π½Π½ΠΈ Π½Π° Grafana трябва Π΄Π° сС ΠΌΠΎΠ½Ρ‚ΠΈΡ€Π° Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ ΠΎΡ‚ ΠΌΠ°ΡˆΠΈΠ½Π°Ρ‚Π° Π½Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°.

Най-удобният, Π½Π° нашия ΠΏΠΎΠ³Π»Π΅Π΄, Π½Π°Ρ‡ΠΈΠ½ Π·Π° Ρ€Π°Π±ΠΎΡ‚Π° Π»ΠΎΠΊΠ°Π»Π½ΠΎ с kubernetes Π΅ minikube. Π‘Π»Π΅Π΄Π²Π°Ρ‰Π°Ρ‚Π° ΡΡ‚ΡŠΠΏΠΊΠ° Π΅ Π΄Π° инсталирамС Π²Ρ€ΡŠΠ·ΠΊΠ°Ρ‚Π° Prometheus + Grafana с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° prometheus-operator. Π’ Ρ‚Π°Π·ΠΈ статия ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ Π΅ описан ΠΏΡ€ΠΎΡ†Π΅ΡΡŠΡ‚ Π½Π° инсталиранС Π½Π° 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;
   services: Array;

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

Π‘ ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° getter'ΠΈ ΠΈ setter'ΠΈ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΈΠ·Π²Π΅ΠΆΠ΄Π°ΠΌΠ΅ ΠΈΠ»ΠΈ Π·Π°Π΄Π°Π²Π°ΠΌΠ΅ Π½ΡƒΠΆΠ½ΠΈΡ‚Π΅ Π½ΠΈ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ Π½Π° ΡΡŠΡ‰Π΅ΡΡ‚Π²Π°Ρ‚Π° Π² ΡƒΠ΄ΠΎΠ±Π΅Π½ ΠΈ Ρ‡Π΅Ρ‚ΠΈΠΌ Π²ΠΈΠ΄. НапримСр Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€Π°Π½ΠΎ ΠΈΠ·Π²Π΅ΠΆΠ΄Π°Π½Π΅ Π½Π° allocatable cpu Π½Π° Π½ΠΎΠ΄Π°:

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

Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†ΠΈ

Π‘ΠΏΠΈΡΡŠΠΊΡŠΡ‚ Π½Π° всички страници Π½Π° Π½Π°ΡˆΠ°Ρ‚Π° приставка ΠΏΡŠΡ€Π²ΠΎΠ½Π°Ρ‡Π°Π»Π½ΠΎ сС описва Π² нашия pluing.json Π² сСкцията Π·Π° зависимости:

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° плъгин Π·Π° Grafana: история Π½Π° Π½Π°Ρ‚Ρ€ΡƒΠΏΠ°Π½ΠΈΡ‚Π΅ ΠΎΠΏΠΈΡ‚ΠΈ

Π’ Π±Π»ΠΎΠΊΠ° Π·Π° всяка страница трябва Π΄Π° посочим ΠΠΠ—Π’ΠΠΠ˜Π•Π’Πž НА БВРАНИЦАВА (Ρ‚ΠΎ слСд Ρ‚ΠΎΠ²Π° Ρ‰Π΅ бъдС ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€Π°Π½ΠΎ Π² slug, ΠΏΠΎ ΠΊΠΎΠΉΡ‚ΠΎ Ρ‚Π°Π·ΠΈ страница Ρ‰Π΅ бъдС Π΄ΠΎΡΡ‚ΡŠΠΏΠ½Π°); ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°, отговарящ Π·Π° Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚Π° Π½Π° Ρ‚Π°Π·ΠΈ страница (ΡΠΏΠΈΡΡŠΠΊΡŠΡ‚ Π½Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΈΡ‚Π΅ сС Скспортира Π² module.ts); ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ Π·Π° роля Π½Π° потрСбитСля, Π·Π° ΠΊΠΎΠΉΡ‚ΠΎ Π΅ Π½Π°Π»ΠΈΡ‡Π½Π° Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚Π° с Ρ‚Π°Π·ΠΈ страница ΠΈ настройки Π½Π° навигацията Π·Π° страничната Π»Π΅Π½Ρ‚Π°.

Π’ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°, отговарящ Π·Π° Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚Π° Π½Π° страницата, трябва Π΄Π° Π·Π°Π΄Π°Π΄Π΅ΠΌ templateUrl, ΠΏΡ€Π΅Π΄Π°Π²Π°ΠΉΠΊΠΈ Ρ‚Π°ΠΌ ΠΏΡŠΡ‚Ρ Π΄ΠΎ html Ρ„Π°ΠΉΠ»Π° с Ρ€Π°Π·ΠΌΠ΅Ρ‚ΠΊΠ°Ρ‚Π°. Π’ΡŠΡ‚Ρ€Π΅ Π² ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π΅Ρ€Π°, Ρ‡Ρ€Π΅Π· dependency injection, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ Π΄ΠΎΡΡ‚ΡŠΠΏ Π΄ΠΎ 2 Π²Π°ΠΆΠ½ΠΈ angular услуги:

  • backendSrv β€” услуга, осигуряваща взаимодСйствиС с api-сСрвСра Π½Π° Grafana;
  • datasourceSrv β€” услуга, осигуряваща Π»ΠΎΠΊΠ°Π»Π½ΠΎ взаимодСйствиС с всички datasource, инсталирани във Π²Π°ΡˆΠ°Ρ‚Π° Grafana (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΌΠ΅Ρ‚ΠΎΠ΄ .getAll() β€” Π²Ρ€ΡŠΡ‰Π° списък Π½Π° всички инсталирани datasource; .get() β€” Π²Ρ€ΡŠΡ‰Π° ΠΎΠ±Π΅ΠΊΡ‚-инстанс Π½Π° конкрСтния datasource.

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° плъгин Π·Π° Grafana: история Π½Π° Π½Π°Ρ‚Ρ€ΡƒΠΏΠ°Π½ΠΈΡ‚Π΅ ΠΎΠΏΠΈΡ‚ΠΈ

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° плъгин Π·Π° Grafana: история Π½Π° Π½Π°Ρ‚Ρ€ΡƒΠΏΠ°Π½ΠΈΡ‚Π΅ ΠΎΠΏΠΈΡ‚ΠΈ

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° плъгин Π·Π° Grafana: история Π½Π° Π½Π°Ρ‚Ρ€ΡƒΠΏΠ°Π½ΠΈΡ‚Π΅ ΠΎΠΏΠΈΡ‚ΠΈ

Част 4: datasource

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

Π’ плъгина KubeGraf, ΠΎΡ‚ Π³Π»Π΅Π΄Π½Π° Ρ‚ΠΎΡ‡ΠΊΠ° Π½Π° потрСбитСлския интСрфСйс, datasource прСдставлява СкзСмпляр Π½Π° kubernetes-кластСра, Π² ΠΊΠΎΠΉΡ‚ΠΎ са Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½ΠΈ слСднитС Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΠΈ (изходният ΠΊΠΎΠ΄ Π΅ Π½Π°Π»ΠΈΡ‡Π΅Π½ Π½Π° Π»ΠΈΠ½ΠΊΠ°):

  • Π²Π·Π΅ΠΌΠ°Π½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ ΠΎΡ‚ api-server-a Π½Π° k8s (ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°Π½Π΅ Π½Π° списък с namespace-ΠΎΠ²Π΅, deployment-и…)
  • проксиранС Π½Π° заявки към prometheus-datasource (ΠΊΠΎΠΉΡ‚ΠΎ сС ΠΈΠ·Π±ΠΈΡ€Π° Π² настройкитС Π½Π° плъгина Π·Π° всСки ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π΅Π½ кластСр) ΠΈ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€Π°Π½Π΅ Π½Π° ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚Π΅ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ ΠΊΠ°ΠΊΡ‚ΠΎ Π² статични страници, Ρ‚Π°ΠΊΠ° ΠΈ Π² Ρ‚Π°Π±Π»Π° Π·Π° ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅.
  • обновяванС Π½Π° Π΄Π°Π½Π½ΠΈΡ‚Π΅ Π½Π° статичнитС страници Π½Π° плъгина (с установСно Π²Ρ€Π΅ΠΌΠ΅ Π·Π° опрСсняванС).
  • ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° заявки Π·Π° създаванС Π½Π° template-списък Π² 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"};
       })
}

ΠžΡ‚Π΄Π΅Π»Π½ΠΈΡΡ‚ интСрСсСн ΠΌΠΎΠΌΠ΅Π½Ρ‚, ΠΎΡ‚ наша Π³Π»Π΅Π΄Π½Π° Ρ‚ΠΎΡ‡ΠΊΠ°, Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ Π½Π° ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° Π·Π° автСнтикация ΠΈ авторизация Π·Π° datasource. ОбикновСно, ΠΎΡ‚ кутията, Π·Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Π½Π΅ Π½Π° Π΄ΠΎΡΡ‚ΡŠΠΏΠ° Π΄ΠΎ крайния ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ Π½Π° Π΄Π°Π½Π½ΠΈ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ вградСния ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Π½Π° Grafana β€” datasourceHttpSettings. Π§Ρ€Π΅Π· Ρ‚ΠΎΠ·ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° настроим Π΄ΠΎΡΡ‚ΡŠΠΏΠ° Π΄ΠΎ http-ΠΈΠ·Ρ‚ΠΎΡ‡Π½ΠΈΠΊΠ° Π½Π° Π΄Π°Π½Π½ΠΈ, ΠΊΠ°Ρ‚ΠΎ посочим url ΠΈ основнитС настройки Π·Π° автСнтикация/авторизация: потрСбитСлско ΠΈΠΌΠ΅-ΠΏΠ°Ρ€ΠΎΠ»Π°, ΠΈΠ»ΠΈ client-cert/client-key. Π—Π° Π΄Π° Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°ΠΌΠ΅ Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚Ρ‚Π° Π·Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Π½Π΅ Π½Π° Π΄ΠΎΡΡ‚ΡŠΠΏΠ° с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° bearer-Ρ‚ΠΎΠΊΠ΅Π½ (Π΄Π΅ Ρ„Π°ΠΊΡ‚ΠΎ стандарт Π·Π° k8s), сС Π½Π°Π»ΠΎΠΆΠΈ Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌ ΠΌΠ°Π»ΠΊΠΎ β€žΠΏΠΈΠΏΠ°Π½Π΅β€œ.

Π—Π° Ρ€Π΅ΡˆΠ°Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Ρ‚ΠΎΠ·ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΌΠΎΠΆΠ΅ Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π²Π³Ρ€Π°Π΄Π΅Π½ΠΎΡ‚ΠΎ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΡŠΠΌ Π½Π° Grafana β€žPlugin Routesβ€œ (ΠΏΠΎΠ²Π΅Ρ‡Π΅ Π½Π° ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»Π½Π°Ρ‚Π° страница Π½Π° докумСнтацията). Π’ настройкитС Π½Π° нашия datasource ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° обявим Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ ΠΏΡ€Π°Π²ΠΈΠ»Π° Π·Π° ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΡ€Π°Π½Π΅, ΠΊΠΎΠΈΡ‚ΠΎ Ρ‰Π΅ Π±ΡŠΠ΄Π°Ρ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π²Π°Π½ΠΈ ΠΎΡ‚ прокси-сСрвСра Π½Π° Grafana. НапримСр, Π·Π° всСки ΠΎΡ‚Π΄Π΅Π»Π΅Π½ endpoint ΠΈΠΌΠ° Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ Π·Π° Π·Π°Π΄Π°Π²Π°Π½Π΅ Π½Π° заглавия ΠΈΠ»ΠΈ url с Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ Π·Π° ΡˆΠ°Π±Π»ΠΎΠ½ΠΈΠ·ΠΈΡ€Π°Π½Π΅, Π΄Π°Π½Π½ΠΈΡ‚Π΅ Π·Π° ΠΊΠΎΠΈΡ‚ΠΎ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ΠΈ ΠΎΡ‚ ΠΏΠΎΠ»Π΅Ρ‚Π°Ρ‚Π° jsonData ΠΈ secureJsonData (Π·Π° ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π½Π° ΠΏΠ°Ρ€ΠΎΠ»ΠΈ ΠΈΠ»ΠΈ Ρ‚ΠΎΠΊΠ΅Π½ΠΈ Π² ΠΊΡ€ΠΈΠΏΡ‚ΠΈΡ€Π°Π½ Π²ΠΈΠ΄). Π’ нашия ΠΏΡ€ΠΈΠΌΠ΅Ρ€ заявкитС ΠΎΡ‚ Π²ΠΈΠ΄Π° /__proxy/api/v1/namespaces Ρ‰Π΅ Π±ΡŠΠ΄Π°Ρ‚ проксирани Π½Π° url ΠΎΡ‚ Π²ΠΈΠ΄Π°
/api/v1/namespaces с добавянС на заглавиС Authorization: Bearer.

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° плъгин Π·Π° Grafana: история Π½Π° Π½Π°Ρ‚Ρ€ΡƒΠΏΠ°Π½ΠΈΡ‚Π΅ ΠΎΠΏΠΈΡ‚ΠΈ

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° плъгин Π·Π° Grafana: история Π½Π° Π½Π°Ρ‚Ρ€ΡƒΠΏΠ°Π½ΠΈΡ‚Π΅ ΠΎΠΏΠΈΡ‚ΠΈ

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

Част 5: ΠΈΠ·Π΄Π°Π½ΠΈΠ΅

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° плъгин Π·Π° Grafana: история Π½Π° Π½Π°Ρ‚Ρ€ΡƒΠΏΠ°Π½ΠΈΡ‚Π΅ ΠΎΠΏΠΈΡ‚ΠΈ

Π‘Π»Π΅Π΄ ΠΊΠ°Ρ‚ΠΎ Π½Π°ΠΏΠΈΡˆΠ΅Ρ‚Π΅ свой собствСн плъгин Π·Π° Grafana, СстСствСно Ρ‰Π΅ искатС Π΄Π° Π³ΠΎ ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ²Π°Ρ‚Π΅ ΠΏΡƒΠ±Π»ΠΈΡ‡Π½ΠΎ. Π’ Grafana Ρ‚ΠΎΠ²Π° Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΎΡ‚ плъгини, Π΄ΠΎΡΡ‚ΡŠΠΏΠ½Π° Π½Π° адрСс grafana.com/grafana/plugins

Π—Π° Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ вашия плъгин Π΄ΠΎΡΡ‚ΡŠΠΏΠ΅Π½ Π² официалния ΠΌΠ°Π³Π°Π·ΠΈΠ½, трябва Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ PR Π² Ρ‚ΠΎΠ·ΠΈ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ, добавяйки Π² Ρ„Π°ΠΉΠ»Π° repo.json ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Π½ΠΈΠ΅ ΠΎΡ‚ Π²ΠΈΠ΄Π°:

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° плъгин Π·Π° Grafana: история Π½Π° Π½Π°Ρ‚Ρ€ΡƒΠΏΠ°Π½ΠΈΡ‚Π΅ ΠΎΠΏΠΈΡ‚ΠΈ

ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ version β€” вСрсия Π½Π° вашия плъгин, url β€” Π²Ρ€ΡŠΠ·ΠΊΠ° към рСпозитория, Π° commit β€” hash Π½Π° ΠΊΠΎΠΌΠΈΡ‚Π°, ΠΏΠΎ ΠΊΠΎΠΉΡ‚ΠΎ Ρ‰Π΅ бъдС Π΄ΠΎΡΡ‚ΡŠΠΏΠ½Π° ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Π°Ρ‚Π° вСрсия Π½Π° плъгина.

И накрая Ρ‰Π΅ Π²ΠΈΠ΄ΠΈΡ‚Π΅ страхотна ΠΊΠ°Ρ€Ρ‚ΠΈΠ½Π° ΠΎΡ‚ Π²ΠΈΠ΄Π°:

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° плъгин Π·Π° Grafana: история Π½Π° Π½Π°Ρ‚Ρ€ΡƒΠΏΠ°Π½ΠΈΡ‚Π΅ ΠΎΠΏΠΈΡ‚ΠΈ

Π”Π°Π½Π½ΠΈΡ‚Π΅ Π·Π° нСя Ρ‰Π΅ Π±ΡŠΠ΄Π°Ρ‚ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΡ‡Π½ΠΎ ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ΠΈ ΠΎΡ‚ вашия Readme.md, Changelog.md ΠΈ Ρ„Π°ΠΉΠ»Π° plugin.json с описаниС Π½Π° плъгина.

Част 6: вмСсто ΠΈΠ·Π²ΠΎΠ΄ΠΈ

НС смС спирали Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°Ρ‚Π° Π½Π° нашия плъгин слСд пусканСто ΠΌΡƒ. Π’ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° Ρ€Π°Π±ΠΎΡ‚ΠΈΠΌ Π²ΡŠΡ€Ρ…Ρƒ правилния ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° рСсурситС Π½Π° ΠΊΠ»ΡŠΡΡ‚Π΅Ρ€Π°, внСдряванСто Π½Π° Π½ΠΎΠ²ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π·Π° подобряванС Π½Π° UX ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π²Π°ΠΌΠ΅ голямо количСство ΠΎΠ±Ρ€Π°Ρ‚Π½Π° Π²Ρ€ΡŠΠ·ΠΊΠ°, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π° слСд инсталацията Π½Π° плъгина ΠΊΠ°ΠΊΡ‚ΠΎ ΠΎΡ‚ Π½Π°ΡˆΠΈΡ‚Π΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΈ, Ρ‚Π°ΠΊΠ° ΠΈ ΠΎΡ‚ issues Π² GitHub (Π°ΠΊΠΎ оставитС своС issue ΠΈΠ»ΠΈ pull request, Ρ‰Π΅ бъда ΠΌΠ½ΠΎΠ³ΠΎ щастлив πŸ™‚ ).

НадявамС сС, Ρ‡Π΅ Ρ‚Π°Π·ΠΈ статия Ρ‰Π΅ Π²ΠΈ ΠΏΠΎΠΌΠΎΠ³Π½Π΅ Π΄Π° Ρ€Π°Π·Π±Π΅Ρ€Π΅Ρ‚Π΅ Ρ‚ΠΎΠ·ΠΈ чудСсСн инструмСнт ΠΊΠ°Ρ‚ΠΎ Grafana ΠΈ, възмоТно, Π΄Π° Π½Π°ΠΏΠΈΡˆΠ΅Ρ‚Π΅ свой собствСн плъгин.

Благодаря!)

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС със Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS ΠΈ VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ πŸ”₯ ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС със Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS ΠΈ VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ | ProHoster