ΠΠ΄ΡΠ°Π²Π΅ΠΉΡΠ΅ Π½Π° Π²ΡΠΈΡΠΊΠΈ! ΠΡΠ΅Π΄ΠΈ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΌΠ΅ΡΠ΅ΡΠ° ΠΏΡΡΠ½Π°Ρ
ΠΌΠ΅ Π² ΠΏΡΠΎΠ΄ΡΠΊΡΠΈΡ Π½ΠΎΠ²ΠΈΡ ΡΠΈ open-source ΠΏΡΠΎΠ΅ΠΊΡ β Grafana ΠΏΠ»ΡΠ³ΠΈΠ½ Π·Π° ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³ Π½Π° Kubernetes, ΠΊΠΎΠΉΡΠΎ Π½Π°ΡΠ΅ΠΊΠΎΡ
ΠΌΠ΅ . ΠΠ·Ρ
ΠΎΠ΄Π½ΠΈΡΡ ΠΊΠΎΠ΄ Π½Π° ΠΏΠ»ΡΠ³ΠΈΠ½Π° Π΅ Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π² . Π ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ ΠΈΡΠΊΠ°ΠΌΠ΅ Π΄Π° ΡΠΏΠΎΠ΄Π΅Π»ΠΈΠΌ Ρ Π²Π°Ρ ΠΈΡΡΠΎΡΠΈΡΡΠ° Π·Π° ΡΠΎΠ²Π° ΠΊΠ°ΠΊ ΡΡΠ·Π΄Π°Π²Π°Ρ
ΠΌΠ΅ ΠΏΠ»ΡΠ³ΠΈΠ½Π°, ΠΊΠ°ΠΊΠ²ΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ
ΠΌΠ΅ ΠΈ Ρ ΠΊΠ°ΠΊΠ²ΠΈ ΡΡΡΠ΄Π½ΠΎΡΡΠΈ ΡΠ΅ ΡΠ±Π»ΡΡΠΊΠ°Ρ
ΠΌΠ΅ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ°ΡΠ°. ΠΠ΅ΠΊΠ° Π΄Π° Π·Π°ΠΏΠΎΡΠ½Π΅ΠΌ!
Π§Π°ΡΡ 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, ΡΡΠ΄ΡΡΠΆΠ°Ρ ΡΡΠ»Π°ΡΠ° ΠΌΠ΅ΡΠ°ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π·Π° Π²Π°ΡΠΈΡ ΠΏΠ»ΡΠ³ΠΈΠ½: ΠΈΠΌΠ΅, Π²Π΅ΡΡΠΈΡ, ΡΠΈΠΏ ΠΏΠ»ΡΠ³ΠΈΠ½, Π²ΡΡΠ·ΠΊΠΈ ΠΊΡΠΌ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅/ΡΠ°ΠΉΡ/Π»ΠΈΡΠ΅Π½Π·, Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΈ ΡΠ°ΠΊΠ° Π½Π°ΡΠ°ΡΡΠΊ.

module.ts

plugin.json
ΠΠ°ΠΊΡΠΎ ΡΠ΅ Π²ΠΈΠΆΠ΄Π° ΠΎΡ Π΅ΠΊΡΠ°Π½Π½Π°ΡΠ° ΡΠ½ΠΈΠΌΠΊΠ°, ΡΠΊΠ°Π·Π°Ρ ΠΌΠ΅ plugin.type = app. ΠΠ°ΡΠΎΡΠΎ ΠΏΠ»ΡΠ³ΠΈΠ½ΠΈΡΠ΅ Π·Π° Grafana ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΠΎΡ ΡΡΠΈ Π²ΠΈΠ΄Π°:
panel: Π½Π°ΠΉ-ΡΠ°Π·ΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½ΠΈΡΡ ΡΠΈΠΏ ΠΏΠ»ΡΠ³ΠΈΠ½ΠΈ - ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ²Π° ΠΏΠ°Π½Π΅Π» Π·Π° Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈ ΠΌΠ΅ΡΡΠΈΠΊΠΈ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΡΠ΅ Π·Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π΄Π°ΡΠ±ΠΎΡΠ΄ΠΎΠ²Π΅.
datasource: ΠΏΠ»ΡΠ³ΠΈΠ½-ΠΊΠΎΠ½Π΅ΠΊΡΠΎΡ ΠΊΡΠΌ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ ΠΈΠ·ΡΠΎΡΠ½ΠΈΠΊ Π½Π° Π΄Π°Π½Π½ΠΈ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Prometheus-datasource, ClickHouse-datasource, ElasticSearch-datasource).
app: ΠΏΠ»ΡΠ³ΠΈΠ½, ΠΊΠΎΠΉΡΠΎ Π²ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΠΈΠ·Π³ΡΠ°Π΄ΠΈΡΠ΅ ΡΠΎΠ±ΡΡΠ²Π΅Π½ΠΎΡΠΎ ΡΠΈ ΡΡΠΎΠ½ΡΠ΅Π½Π΄ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² Grafana, Π΄Π° ΡΡΠ·Π΄Π°Π²Π°ΡΠ΅ ΡΠ²ΠΎΠΈ ΡΠΎΠ±ΡΡΠ²Π΅Π½ΠΈ html-ΡΡΡΠ°Π½ΠΈΡΠΈ ΠΈ ΡΡΡΠ½ΠΎ Π΄Π° ΡΠ΅ ΡΠ²ΡΡΠ·Π²Π°ΡΠ΅ Ρ datasource Π·Π° Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π΄Π°Π½Π½ΠΈ. Π‘ΡΡΠΎ ΡΠ°ΠΊΠ°, ΠΊΠ°ΡΠΎ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΠΏΠ»ΡΠ³ΠΈΠ½ΠΈ ΠΎΡ Π΄ΡΡΠ³ ΡΠΈΠΏ (datasource, panel) ΠΈ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π΄Π°ΡΠ±ΠΎΡΠ΄ΠΎΠ²Π΅.

ΠΡΠΈΠΌΠ΅Ρ Π·Π° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ Π½Π° ΠΏΠ»ΡΠ³ΠΈΠ½ Ρ type = app.
ΠΠ°ΡΠΎ Π΅Π·ΠΈΠΊ Π·Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ°Π½Π΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΠΊΠ°ΠΊΡΠΎ JavaScript, ΡΠ°ΠΊΠ° ΠΈ TypeScript (Π½ΠΈΠ΅ ΠΈΠ·Π±ΡΠ°Ρ ΠΌΠ΅ Π½Π΅Π³ΠΎ). Π¨Π°Π±Π»ΠΎΠ½ΠΈΡΠ΅ Π·Π° hello-world ΠΏΠ»ΡΠ³ΠΈΠ½ΠΈ ΠΎΡ Π²ΡΡΠΊΠ°ΠΊΡΠ² ΡΠΈΠΏ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° : Π² ΡΠΎΠ·ΠΈ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ Π΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π΅Π½ Π³ΠΎΠ»ΡΠΌ Π±ΡΠΎΠΉ starter-packβΠΎΠ²Π΅ (ΠΈΠΌΠ° Π΄ΠΎΡΠΈ Π΅ΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠ°Π»Π΅Π½ ΠΏΡΠΈΠΌΠ΅Ρ Π½Π° ΠΏΠ»ΡΠ³ΠΈΠ½ Π½Π° React) Ρ ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»Π½ΠΎ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½ΠΈ ΠΈ Π½Π°ΡΡΡΠΎΠ΅Π½ΠΈ ΡΠ±ΠΎΡΠΊΠΈ.
Π§Π°ΡΡ 2: ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ° Π½Π° Π»ΠΎΠΊΠ°Π»Π½Π° ΡΡΠ΅Π΄Π°
ΠΠ° ΡΠ°Π±ΠΎΡΠ° ΠΏΠΎ ΠΏΠ»ΡΠ³ΠΈΠ½Π°, ΡΠ°Π·Π±ΠΈΡΠ° ΡΠ΅, ΡΠ΅ Π½ΠΈ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌ kubernetes-ΠΊΠ»ΡΡΡΠ΅Ρ Ρ Π²ΡΠΈΡΠΊΠΈ ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»Π½ΠΎ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½ΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ: prometheus, node-exporter, kube-state-metrics, grafana. ΠΠΊΠΎΠ»Π½Π°ΡΠ° ΡΡΠ΅Π΄Π° ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π΅ Π½Π°ΡΡΡΠΎΠ΅Π½Π° Π±ΡΡΠ·ΠΎ, Π»Π΅ΡΠ½ΠΎ ΠΈ Π±Π΅Π·ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ½ΠΎ, Π° Π·Π° ΠΎΡΠΈΠ³ΡΡΡΠ²Π°Π½Π΅ Π½Π° hot-reload Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΡΠ° Π½Π° Π΄Π°Π½Π½ΠΈ Π½Π° Grafana ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΠΌΠΎΠ½ΡΠΈΡΠ° Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ ΠΎΡ ΠΌΠ°ΡΠΈΠ½Π°ΡΠ° Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°.
ΠΠ°ΠΉ-ΡΠ΄ΠΎΠ±Π½ΠΈΡΡ, Π½Π° Π½Π°ΡΠΈΡ ΠΏΠΎΠ³Π»Π΅Π΄, Π½Π°ΡΠΈΠ½ Π·Π° ΡΠ°Π±ΠΎΡΠ° Π»ΠΎΠΊΠ°Π»Π½ΠΎ Ρ kubernetes Π΅ . Π‘Π»Π΅Π΄Π²Π°ΡΠ°ΡΠ° ΡΡΡΠΏΠΊΠ° Π΅ Π΄Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠ΅ Π²ΡΡΠ·ΠΊΠ°ΡΠ° 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 Π² ΡΠ΅ΠΊΡΠΈΡΡΠ° Π·Π° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ:

Π Π±Π»ΠΎΠΊΠ° Π·Π° Π²ΡΡΠΊΠ° ΡΡΡΠ°Π½ΠΈΡΠ° ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΠΎΡΠΎΡΠΈΠΌ ΠΠΠΠΠΠΠΠΠ’Π ΠΠ Π‘Π’Π ΠΠΠΠ¦ΠΠ’Π (ΡΠΎ ΡΠ»Π΅Π΄ ΡΠΎΠ²Π° ΡΠ΅ Π±ΡΠ΄Π΅ ΠΊΠΎΠ½Π²Π΅ΡΡΠΈΡΠ°Π½ΠΎ Π² slug, ΠΏΠΎ ΠΊΠΎΠΉΡΠΎ ΡΠ°Π·ΠΈ ΡΡΡΠ°Π½ΠΈΡΠ° ΡΠ΅ Π±ΡΠ΄Π΅ Π΄ΠΎΡΡΡΠΏΠ½Π°); ΠΈΠΌΠ΅ΡΠΎ Π½Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°, ΠΎΡΠ³ΠΎΠ²Π°ΡΡΡ Π·Π° ΡΠ°Π±ΠΎΡΠ°ΡΠ° Π½Π° ΡΠ°Π·ΠΈ ΡΡΡΠ°Π½ΠΈΡΠ° (ΡΠΏΠΈΡΡΠΊΡΡ Π½Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈΡΠ΅ ΡΠ΅ Π΅ΠΊΡΠΏΠΎΡΡΠΈΡΠ° Π² module.ts); ΡΠΊΠ°Π·Π°Π½ΠΈΠ΅ Π·Π° ΡΠΎΠ»Ρ Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ, Π·Π° ΠΊΠΎΠΉΡΠΎ Π΅ Π½Π°Π»ΠΈΡΠ½Π° ΡΠ°Π±ΠΎΡΠ°ΡΠ° Ρ ΡΠ°Π·ΠΈ ΡΡΡΠ°Π½ΠΈΡΠ° ΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ Π½Π° Π½Π°Π²ΠΈΠ³Π°ΡΠΈΡΡΠ° Π·Π° ΡΡΡΠ°Π½ΠΈΡΠ½Π°ΡΠ° Π»Π΅Π½ΡΠ°.
Π ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°, ΠΎΡΠ³ΠΎΠ²Π°ΡΡΡ Π·Π° ΡΠ°Π±ΠΎΡΠ°ΡΠ° Π½Π° ΡΡΡΠ°Π½ΠΈΡΠ°ΡΠ°, ΡΡΡΠ±Π²Π° Π΄Π° Π·Π°Π΄Π°Π΄Π΅ΠΌ templateUrl, ΠΏΡΠ΅Π΄Π°Π²Π°ΠΉΠΊΠΈ ΡΠ°ΠΌ ΠΏΡΡΡ Π΄ΠΎ html ΡΠ°ΠΉΠ»Π° Ρ ΡΠ°Π·ΠΌΠ΅ΡΠΊΠ°ΡΠ°. ΠΡΡΡΠ΅ Π² ΠΊΠΎΠ½ΡΡΠΎΠ»Π΅ΡΠ°, ΡΡΠ΅Π· dependency injection, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΠΎΠ»ΡΡΠΈΠΌ Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ 2 Π²Π°ΠΆΠ½ΠΈ angular ΡΡΠ»ΡΠ³ΠΈ:
- backendSrv β ΡΡΠ»ΡΠ³Π°, ΠΎΡΠΈΠ³ΡΡΡΠ²Π°ΡΠ° Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Ρ api-ΡΠ΅ΡΠ²Π΅ΡΠ° Π½Π° Grafana;
- datasourceSrv β ΡΡΠ»ΡΠ³Π°, ΠΎΡΠΈΠ³ΡΡΡΠ²Π°ΡΠ° Π»ΠΎΠΊΠ°Π»Π½ΠΎ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Ρ Π²ΡΠΈΡΠΊΠΈ datasource, ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½ΠΈ Π²ΡΠ² Π²Π°ΡΠ°ΡΠ° Grafana (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΠΌΠ΅ΡΠΎΠ΄ .getAll() β Π²ΡΡΡΠ° ΡΠΏΠΈΡΡΠΊ Π½Π° Π²ΡΠΈΡΠΊΠΈ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½ΠΈ datasource; .get() β Π²ΡΡΡΠ° ΠΎΠ±Π΅ΠΊΡ-ΠΈΠ½ΡΡΠ°Π½Ρ Π½Π° ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΈΡ datasource.



Π§Π°ΡΡ 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())



- ΡΠ΅ΡΡ Π½Π° Π²ΡΡΠ·ΠΊΠ°ΡΠ° Ρ ΠΊΡΠ°ΠΉΠ½ΠΈΡ 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.


ΠΡΡΠ΅ΡΡΠ²Π΅Π½ΠΎ, Π·Π° ΡΠ°Π±ΠΎΡΠ° Ρ api-ΡΠ΅ΡΠ²Π΅ΡΠ° Π½Π° k8s Π½ΠΈ Π΅ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π» Ρ readonly Π΄ΠΎΡΡΡΠΏΠΈ, ΠΌΠ°Π½ΠΈΡΠ΅ΡΡΠΈΡΠ΅ Π·Π° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ΡΠΎ Π½Π° ΠΊΠΎΠΉΡΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΡΡΠΎ Π΄Π° Π½Π°ΠΌΠ΅ΡΠΈΡΠ΅ Π² .
Π§Π°ΡΡ 5: ΠΈΠ·Π΄Π°Π½ΠΈΠ΅

Π‘Π»Π΅Π΄ ΠΊΠ°ΡΠΎ Π½Π°ΠΏΠΈΡΠ΅ΡΠ΅ ΡΠ²ΠΎΠΉ ΡΠΎΠ±ΡΡΠ²Π΅Π½ ΠΏΠ»ΡΠ³ΠΈΠ½ Π·Π° Grafana, Π΅ΡΡΠ΅ΡΡΠ²Π΅Π½ΠΎ ΡΠ΅ ΠΈΡΠΊΠ°ΡΠ΅ Π΄Π° Π³ΠΎ ΠΏΡΠ±Π»ΠΈΠΊΡΠ²Π°ΡΠ΅ ΠΏΡΠ±Π»ΠΈΡΠ½ΠΎ. Π Grafana ΡΠΎΠ²Π° Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° ΠΎΡ ΠΏΠ»ΡΠ³ΠΈΠ½ΠΈ, Π΄ΠΎΡΡΡΠΏΠ½Π° Π½Π° Π°Π΄ΡΠ΅Ρ
ΠΠ° Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ Π²Π°ΡΠΈΡ ΠΏΠ»ΡΠ³ΠΈΠ½ Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π² ΠΎΡΠΈΡΠΈΠ°Π»Π½ΠΈΡ ΠΌΠ°Π³Π°Π·ΠΈΠ½, ΡΡΡΠ±Π²Π° Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ PR Π² , Π΄ΠΎΠ±Π°Π²ΡΠΉΠΊΠΈ Π² ΡΠ°ΠΉΠ»Π° repo.json ΡΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅ ΠΎΡ Π²ΠΈΠ΄Π°:

ΠΊΡΠ΄Π΅ΡΠΎ version β Π²Π΅ΡΡΠΈΡ Π½Π° Π²Π°ΡΠΈΡ ΠΏΠ»ΡΠ³ΠΈΠ½, url β Π²ΡΡΠ·ΠΊΠ° ΠΊΡΠΌ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ, Π° commit β hash Π½Π° ΠΊΠΎΠΌΠΈΡΠ°, ΠΏΠΎ ΠΊΠΎΠΉΡΠΎ ΡΠ΅ Π±ΡΠ΄Π΅ Π΄ΠΎΡΡΡΠΏΠ½Π° ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½Π°ΡΠ° Π²Π΅ΡΡΠΈΡ Π½Π° ΠΏΠ»ΡΠ³ΠΈΠ½Π°.
Π Π½Π°ΠΊΡΠ°Ρ ΡΠ΅ Π²ΠΈΠ΄ΠΈΡΠ΅ ΡΡΡΠ°Ρ ΠΎΡΠ½Π° ΠΊΠ°ΡΡΠΈΠ½Π° ΠΎΡ Π²ΠΈΠ΄Π°:

ΠΠ°Π½Π½ΠΈΡΠ΅ Π·Π° Π½Π΅Ρ ΡΠ΅ Π±ΡΠ΄Π°Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ ΠΈΠ·Π²Π»Π΅ΡΠ΅Π½ΠΈ ΠΎΡ Π²Π°ΡΠΈΡ Readme.md, Changelog.md ΠΈ ΡΠ°ΠΉΠ»Π° plugin.json Ρ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π½Π° ΠΏΠ»ΡΠ³ΠΈΠ½Π°.
Π§Π°ΡΡ 6: Π²ΠΌΠ΅ΡΡΠΎ ΠΈΠ·Π²ΠΎΠ΄ΠΈ
ΠΠ΅ ΡΠΌΠ΅ ΡΠΏΠΈΡΠ°Π»ΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ°ΡΠ° Π½Π° Π½Π°ΡΠΈΡ ΠΏΠ»ΡΠ³ΠΈΠ½ ΡΠ»Π΅Π΄ ΠΏΡΡΠΊΠ°Π½Π΅ΡΠΎ ΠΌΡ. Π ΠΌΠΎΠΌΠ΅Π½ΡΠ° ΡΠ°Π±ΠΎΡΠΈΠΌ Π²ΡΡΡ Ρ ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΈΡ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³ Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠ΅ΡΡΡΡΠΈΡΠ΅ Π½Π° ΠΊΠ»ΡΡΡΠ΅ΡΠ°, Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° Π½ΠΎΠ²ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Π·Π° ΠΏΠΎΠ΄ΠΎΠ±ΡΡΠ²Π°Π½Π΅ Π½Π° UX ΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ²Π°ΠΌΠ΅ Π³ΠΎΠ»ΡΠΌΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΎΠ±ΡΠ°ΡΠ½Π° Π²ΡΡΠ·ΠΊΠ°, ΠΏΠΎΠ»ΡΡΠ΅Π½Π° ΡΠ»Π΅Π΄ ΠΈΠ½ΡΡΠ°Π»Π°ΡΠΈΡΡΠ° Π½Π° ΠΏΠ»ΡΠ³ΠΈΠ½Π° ΠΊΠ°ΠΊΡΠΎ ΠΎΡ Π½Π°ΡΠΈΡΠ΅ ΠΊΠ»ΠΈΠ΅Π½ΡΠΈ, ΡΠ°ΠΊΠ° ΠΈ ΠΎΡ issues Π² GitHub (Π°ΠΊΠΎ ΠΎΡΡΠ°Π²ΠΈΡΠ΅ ΡΠ²ΠΎΠ΅ issue ΠΈΠ»ΠΈ pull request, ΡΠ΅ Π±ΡΠ΄Π° ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ°ΡΡΠ»ΠΈΠ² π ).
ΠΠ°Π΄ΡΠ²Π°ΠΌΠ΅ ΡΠ΅, ΡΠ΅ ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ ΡΠ΅ Π²ΠΈ ΠΏΠΎΠΌΠΎΠ³Π½Π΅ Π΄Π° ΡΠ°Π·Π±Π΅ΡΠ΅ΡΠ΅ ΡΠΎΠ·ΠΈ ΡΡΠ΄Π΅ΡΠ΅Π½ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ ΠΊΠ°ΡΠΎ Grafana ΠΈ, Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π΄Π° Π½Π°ΠΏΠΈΡΠ΅ΡΠ΅ ΡΠ²ΠΎΠΉ ΡΠΎΠ±ΡΡΠ²Π΅Π½ ΠΏΠ»ΡΠ³ΠΈΠ½.
ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΡ!)
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
