ΠΠ΄ΡΠ°Π²ΠΎ Π½Π° ΡΠΈΡΠ΅! ΠΡΠ΅Π΄ Π½Π΅ΠΊΠΎΠ»ΠΊΡ ΠΌΠ΅ΡΠ΅ΡΠΈ Π³ΠΎ Π»Π°Π½ΡΠΈΡΠ°Π²ΠΌΠ΅ Π½Π°ΡΠΈΠΎΡ Π½ΠΎΠ² ΠΏΡΠΎΠ΅ΠΊΡ ΡΠΎ ΠΎΡΠ²ΠΎΡΠ΅Π½ ΠΊΠΎΠ΄ Π²ΠΎ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²ΠΎ - ΠΏΡΠΈΠΊΠ»ΡΡΠΎΠΊΠΎΡ Grafana Π·Π° ΡΠ»Π΅Π΄Π΅ΡΠ΅ ΠΊΡΠ±Π΅ΡΠ½Π΅ΡΠΈ, ΠΊΠΎΡ Π³ΠΎ Π½Π°ΡΠ΅ΠΊΠΎΠ²ΠΌΠ΅ . ΠΠ·Π²ΠΎΡΠ½ΠΈΠΎΡ ΠΊΠΎΠ΄ Π½Π° ΠΏΡΠΈΠΊΠ»ΡΡΠΎΠΊΠΎΡ Π΅ Π΄ΠΎΡΡΠ°ΠΏΠ΅Π½ Π½Π° . Π Π²ΠΎ ΠΎΠ²Π°Π° ΡΡΠ°ΡΠΈΡΠ° ΡΠ°ΠΊΠ°ΠΌΠ΅ Π΄Π° ΡΠ° ΡΠΏΠΎΠ΄Π΅Π»ΠΈΠΌΠ΅ ΡΠΎ Π²Π°Ρ ΠΏΡΠΈΠΊΠ°Π·Π½Π°ΡΠ° Π·Π° ΡΠΎΠ° ΠΊΠ°ΠΊΠΎ Π³ΠΎ ΡΠΎΠ·Π΄Π°Π΄ΠΎΠ²ΠΌΠ΅ ΠΏΡΠΈΠΊΠ»ΡΡΠΎΠΊΠΎΡ, ΠΊΠΎΠΈ Π°Π»Π°ΡΠΊΠΈ Π³ΠΈ ΠΊΠΎΡΠΈΡΡΠ΅Π²ΠΌΠ΅ ΠΈ ΠΊΠ°ΠΊΠ²ΠΈ ΡΡΠ°ΠΏΠΈΡΠΈ Π½Π°ΠΈΠ΄ΠΎΠ²ΠΌΠ΅ Π²ΠΎ ΡΠ΅ΠΊΠΎΡ Π½Π° ΠΏΡΠΎΡΠ΅ΡΠΎΡ Π½Π° ΡΠ°Π·Π²ΠΎΡ. ΠΠ° ΠΎΠ΄ΠΈΠΌΠ΅!
ΠΠ΅Π» 0 - Π²ΠΎΠ²Π΅Π΄Π΅Π½: ΠΊΠ°ΠΊΠΎ ΡΡΠΈΠ³Π½Π°Π²ΠΌΠ΅ Π΄ΠΎ ΠΎΠ²Π°Π° ΡΠΎΡΠΊΠ°?
ΠΠ΄Π΅ΡΠ°ΡΠ° Π΄Π° Π½Π°ΠΏΠΈΡΠ΅ΠΌΠ΅ ΡΠΎΠΏΡΡΠ²Π΅Π½ Π΄ΠΎΠ΄Π°ΡΠΎΠΊ Π·Π° Grafan Π½ΠΈ Π΄ΠΎΡΠ΄Π΅ ΡΠΎΡΠ΅ΠΌΠ° ΡΠ»ΡΡΠ°ΡΠ½ΠΎ. ΠΠ°ΡΠ°ΡΠ° ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡΠ° Π½Π°Π΄Π³Π»Π΅Π΄ΡΠ²Π° Π²Π΅Π±-ΠΏΡΠΎΠ΅ΠΊΡΠΈ ΡΠΎ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π½ΠΈΠ²ΠΎΠ° Π½Π° ΡΠ»ΠΎΠΆΠ΅Π½ΠΎΡΡ ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΎΠ΄ 10 Π³ΠΎΠ΄ΠΈΠ½ΠΈ. ΠΠ° ΠΎΠ²Π° Π²ΡΠ΅ΠΌΠ΅ ΠΈΠΌΠ°ΠΌΠ΅ Π°ΠΊΡΠΌΡΠ»ΠΈΡΠ°Π½ΠΎ Π³ΠΎΠ»Π΅ΠΌΠ° ΠΊΠΎΠ»ΠΈΡΠΈΠ½Π° Π½Π° Π΅ΠΊΡΠΏΠ΅ΡΡΠΈΠ·Π°, ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΈ ΡΠ»ΡΡΠ°ΠΈ ΠΈ ΠΈΡΠΊΡΡΡΠ²ΠΎ Π²ΠΎ ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΠΈΡΡΠ΅ΠΌΠΈ Π·Π° ΡΠ»Π΅Π΄Π΅ΡΠ΅. Π Π²ΠΎ ΠΎΠ΄ΡΠ΅Π΄Π΅Π½ ΠΌΠΎΠΌΠ΅Π½Ρ ΡΠ΅ Π·Π°ΠΏΡΠ°ΡΠ°Π²ΠΌΠ΅: βΠΠ°Π»ΠΈ ΠΏΠΎΡΡΠΎΠΈ ΠΌΠ°Π³ΠΈΡΠ½Π° Π°Π»Π°ΡΠΊΠ° Π·Π° ΡΠ»Π΅Π΄Π΅ΡΠ΅ Π½Π° Kubernetes, Π·Π°, ΠΊΠ°ΠΊΠΎ ΡΡΠΎ Π²Π΅Π»Π°Ρ, βΠΏΠΎΡΡΠ°Π²Π΅ΡΠ΅ Π³ΠΎ ΠΈ Π·Π°Π±ΠΎΡΠ°Π²Π΅ΡΠ΅ Π³ΠΎβ?β. ΠΠ½Π΄ΡΡΡΡΠΈΡΠΊΠΈΠΎΡ ΡΡΠ°Π½Π΄Π°ΡΠ΄ Π·Π° ΡΠ»Π΅Π΄Π΅ΡΠ΅ Π½Π° k8s, ΡΠ΅ ΡΠ°Π·Π±ΠΈΡΠ°, ΠΎΠ΄Π°ΠΌΠ½Π° Π΅ ΠΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΡΠ° ΠΡΠΎΠΌΠ΅ΡΠ΅Ρ + ΠΡΠ°ΡΠ°Π½Π°. Π ΠΊΠ°ΠΊΠΎ Π³ΠΎΡΠΎΠ²ΠΈ ΡΠ΅ΡΠ΅Π½ΠΈΡΠ° Π·Π° ΠΎΠ²ΠΎΡ ΠΎΡΠ°ΠΊ, ΠΈΠΌΠ° Π³ΠΎΠ»Π΅ΠΌ ΡΠ΅Ρ Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π²ΠΈΠ΄ΠΎΠ²ΠΈ Π°Π»Π°ΡΠΊΠΈ: ΠΏΡΠΎΠΌΠ΅ΡΠ΅Ρ-ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ, ΡΠ΅Ρ Π½Π° ΠΊΠΎΠ½ΡΡΠΎΠ»Π½ΠΈ ΡΠ°Π±Π»ΠΈ kubernetes-mixin, grafana-kubernetes-app.
ΠΡΠΈΠΊΠ»ΡΡΠΎΠΊΠΎΡ grafana-kubernetes-app ΠΈΠ·Π³Π»Π΅Π΄Π°ΡΠ΅ ΠΊΠ°ΠΊΠΎ Π½Π°ΡΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½Π° ΠΎΠΏΡΠΈΡΠ° Π·Π° Π½Π°Ρ, Π½ΠΎ Π½Π΅ Π΅ ΠΏΠΎΠ΄Π΄ΡΠΆΠ°Π½ ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΎΠ΄ Π΅Π΄Π½Π° Π³ΠΎΠ΄ΠΈΠ½Π° ΠΈ, Π·Π³ΠΎΡΠ° Π½Π° ΡΠΎΠ°, Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ°Π±ΠΎΡΠΈ ΡΠΎ Π½ΠΎΠ²ΠΈΡΠ΅ Π²Π΅ΡΠ·ΠΈΠΈ Π½Π° node-exporter ΠΈ kube-state-metrics. Π Π²ΠΎ ΠΎΠ΄ΡΠ΅Π΄Π΅Π½ ΠΌΠΎΠΌΠ΅Π½Ρ ΡΠ΅ΡΠΈΠ²ΠΌΠ΅: βΠΠ°ΡΠ΅ΠΌ Π½Π΅ ΡΡΠ΅Π±Π° Π΄Π° Π΄ΠΎΠ½Π΅ΡΠ΅ΠΌΠ΅ ΡΠ²ΠΎΡΠ° ΠΎΠ΄Π»ΡΠΊΠ°?
ΠΠΎΠΈ ΠΈΠ΄Π΅ΠΈ ΡΠ΅ΡΠΈΠ²ΠΌΠ΅ Π΄Π° Π³ΠΈ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ°ΠΌΠ΅ Π²ΠΎ Π½Π°ΡΠΈΠΎΡ ΠΏΡΠΈΠΊΠ»ΡΡΠΎΠΊ:
- Π²ΠΈΠ·ΡΠ΅Π»ΠΈΠ·Π°ΡΠΈΡΠ° Π½Π° βΠ°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠΊΠ°ΡΠ° ΠΊΠ°ΡΡΠ°β: ΠΏΡΠ°ΠΊΡΠΈΡΠ½ΠΎ ΠΏΡΠΈΠΊΠ°ΠΆΡΠ²Π°ΡΠ΅ Π½Π° Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΈΡΠ΅ Π²ΠΎ ΠΊΠ»Π°ΡΡΠ΅ΡΠΎΡ, Π³ΡΡΠΏΠΈΡΠ°Π½ΠΈ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΡΠΊΠΈ ΠΏΡΠΎΡΡΠΎΡΠΈ, ΡΠ°ΡΠΏΠΎΡΠ΅Π΄ΡΠ²Π°ΡΠ°...;
- Π²ΠΈΠ·ΡΠ΅Π»ΠΈΠ·Π°ΡΠΈΡΠ° Π½Π° Π²ΡΡΠΊΠΈ ΠΊΠ°ΠΊΠΎ βΡΠ°ΡΠΏΠΎΡΠ΅Π΄ΡΠ²Π°ΡΠ΅ - ΡΡΠ»ΡΠ³Π° (+ΠΏΠΎΡΡΠΈ)β.
- Π²ΠΈΠ·ΡΠ΅Π»ΠΈΠ·Π°ΡΠΈΡΠ° Π½Π° Π΄ΠΈΡΡΡΠΈΠ±ΡΡΠΈΡΠ°ΡΠ° Π½Π° ΠΊΠ»Π°ΡΡΠ΅ΡΡΠΊΠΈΡΠ΅ Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΈ Π½ΠΈΠ· ΠΊΠ»Π°ΡΡΠ΅ΡΡΠΊΠΈΡΠ΅ ΡΠ°Π·Π»ΠΈ.
- Π·Π±ΠΈΡΠΊΠ° Π½Π° ΠΌΠ΅ΡΡΠΈΠΊΠ° ΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎΠ΄ ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΈΠ·Π²ΠΎΡΠΈ: Prometheus ΠΈ k8s api ΡΠ΅ΡΠ²Π΅Ρ.
- ΡΠ»Π΅Π΄Π΅ΡΠ΅ ΠΈ Π½Π° ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ½ΠΈΠΎΡ Π΄Π΅Π» (ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ Π½Π° Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΠΏΡΠΎΡΠ΅ΡΠΎΡΠΎΡ, ΠΌΠ΅ΠΌΠΎΡΠΈΡΠ°, ΠΏΠΎΡΡΠΈΡΡΠ΅ΠΌ Π½Π° Π΄ΠΈΡΠΊ, ΠΌΡΠ΅ΠΆΠ°) ΠΈ Π»ΠΎΠ³ΠΈΠΊΠ° Π½Π° Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ°ΡΠ° - ΠΏΠΎΠ΄Π»ΠΎΠ³ΠΈ Π·Π° Π·Π΄ΡΠ°Π²ΡΡΠ²Π΅Π½ ΡΡΠ°ΡΡΡ, Π±ΡΠΎΡ Π½Π° Π΄ΠΎΡΡΠ°ΠΏΠ½ΠΈ ΡΠ΅ΠΏΠ»ΠΈΠΊΠΈ, ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ Π·Π° ΠΏΠΎΠ»Π°Π³Π°ΡΠ΅ ΡΠ΅ΡΡΠΎΠ²ΠΈ Π·Π° ΠΆΠΈΠ²ΠΎΡΡ/ΠΏΠΎΠ΄Π³ΠΎΡΠ²Π΅Π½ΠΎΡΡ.
ΠΠ΅Π» 1: Π¨ΡΠΎ Π΅ βΠΏΡΠΈΠΊΠ»ΡΡΠΎΠΊ Grafanaβ?
ΠΠ΄ ΡΠ΅Ρ Π½ΠΈΡΠΊΠ° Π³Π»Π΅Π΄Π½Π° ΡΠΎΡΠΊΠ°, ΠΏΡΠΈΠΊΠ»ΡΡΠΎΠΊΠΎΡ Π·Π° Grafana Π΅ Π°Π³ΠΎΠ»Π΅Π½ ΠΊΠΎΠ½ΡΡΠΎΠ»Π΅Ρ, ΠΊΠΎΡ ΡΠ΅ ΡΡΠ²Π° Π²ΠΎ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΠΌΠΎΡ ΡΠΎ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ Grafana (/var/grafana/plugins/ /dist/module.js) ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π²ΡΠΈΡΠ° ΠΊΠ°ΠΊΠΎ SystemJS ΠΌΠΎΠ΄ΡΠ». ΠΡΡΠΎ ΡΠ°ΠΊΠ°, Π²ΠΎ ΠΎΠ²ΠΎΡ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΠΌ ΡΡΠ΅Π±Π° Π΄Π° ΠΈΠΌΠ° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ° plugin.json ΡΡΠΎ Π³ΠΈ ΡΠΎΠ΄ΡΠΆΠΈ ΡΠΈΡΠ΅ ΠΌΠ΅ΡΠ° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ Π·Π° Π²Π°ΡΠΈΠΎΡ ΠΏΡΠΈΠΊΠ»ΡΡΠΎΠΊ: ΠΈΠΌΠ΅, Π²Π΅ΡΠ·ΠΈΡΠ°, ΡΠΈΠΏ Π½Π° ΠΏΡΠΈΠΊΠ»ΡΡΠΎΠΊ, Π²ΡΡΠΊΠΈ Π΄ΠΎ ΡΠΊΠ»Π°Π΄ΠΈΡΡΠ΅ΡΠΎ/ΡΡΡΠ°Π½ΠΈΡΠ°ΡΠ°/Π»ΠΈΡΠ΅Π½ΡΠ°ΡΠ°, Π·Π°Π²ΠΈΡΠ½ΠΎΡΡΠΈ ΠΈΡΠ½.

ΠΌΠΎΠ΄ΡΠ».ts

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

ΠΡΠΈΠΌΠ΅ΡΠΈ Π·Π° Π·Π°Π²ΠΈΡΠ½ΠΎΡΡΠΈ ΠΎΠ΄ ΠΏΡΠΈΠΊΠ»ΡΡΠΎΡΠΈ ΡΠΎ ΡΠΈΠΏ=Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ°.
ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π³ΠΈ ΠΊΠΎΡΠΈΡΡΠΈΡΠ΅ ΠΈ JavaScript ΠΈ TypeScript ΠΊΠ°ΠΊΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΡΠΊΠΈ ΡΠ°Π·ΠΈΠΊ (Π½ΠΈΠ΅ Π³ΠΎ ΠΈΠ·Π±ΡΠ°Π²ΠΌΠ΅). ΠΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠΈ Π·Π° hello-world ΠΏΡΠΈΠΊΠ»ΡΡΠΎΡΠΈ ΠΎΠ΄ ΠΊΠΎΡ Π±ΠΈΠ»ΠΎ ΡΠΈΠΏ ΡΡΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ : ΠΎΠ²Π° ΡΠΊΠ»Π°Π΄ΠΈΡΡΠ΅ ΡΠΎΠ΄ΡΠΆΠΈ Π³ΠΎΠ»Π΅ΠΌ Π±ΡΠΎΡ ΡΡΠ°ΡΡΠ΅Ρ-ΠΏΠ°ΠΊΠ΅ΡΠΈ (ΠΈΠΌΠ° Π΄ΡΡΠΈ ΠΈ Π΅ΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠ°Π»Π΅Π½ ΠΏΡΠΈΠΌΠ΅Ρ Π½Π° ΠΏΡΠΈΠΊΠ»ΡΡΠΎΠΊ Π²ΠΎ React) ΡΠΎ ΠΏΡΠ΅ΡΡ ΠΎΠ΄Π½ΠΎ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½ΠΈ ΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π½ΠΈ Π³ΡΠ°Π΄ΠΈΡΠ΅Π»ΠΈ.
ΠΠ΅Π» 2: ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ° Π½Π° Π»ΠΎΠΊΠ°Π»Π½Π°ΡΠ° ΡΡΠ΅Π΄ΠΈΠ½Π°
ΠΠ° Π΄Π° ΡΠ°Π±ΠΎΡΠΈΠΌΠ΅ Π½Π° ΠΏΡΠΈΠΊΠ»ΡΡΠΎΠΊΠΎΡ, ΠΏΡΠΈΡΠΎΠ΄Π½ΠΎ Π½ΠΈ ΡΡΠ΅Π±Π° ΠΊΡΠ±Π΅ΡΠ½Π΅Ρ ΠΊΠ»Π°ΡΡΠ΅Ρ ΡΠΎ ΡΠΈΡΠ΅ ΠΏΡΠ΅ΡΡ ΠΎΠ΄Π½ΠΎ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½ΠΈ Π°Π»Π°ΡΠΊΠΈ: ΠΏΡΠΎΠΌΠ΅ΡΠ΅Ρ, ΠΈΠ·Π²ΠΎΠ·Π½ΠΈΠΊ Π½Π° ΡΠ°Π·Π»ΠΈ, ΠΊΡΠ±Π΅-ΡΠΎΡΡΠΎΡΠ±Π°-ΠΌΠ΅ΡΡΠΈΠΊΠ°, Π³ΡΠ°ΡΠ°Π½Π°. ΠΠΊΠΎΠ»ΠΈΠ½Π°ΡΠ° ΡΡΠ΅Π±Π° Π΄Π° ΡΠ΅ ΠΏΠΎΡΡΠ°Π²ΠΈ Π±ΡΠ·ΠΎ, Π»Π΅ΡΠ½ΠΎ ΠΈ ΠΏΡΠΈΡΠΎΠ΄Π½ΠΎ, Π° Π·Π° Π΄Π° ΡΠ΅ ΠΎΠ±Π΅Π·Π±Π΅Π΄ΠΈ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ Π²ΡΠΈΡΡΠ²Π°ΡΠ΅, Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΠΌΠΎΡ ΡΠΎ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ Grafana ΡΡΠ΅Π±Π° Π΄Π° ΡΠ΅ ΠΌΠΎΠ½ΡΠΈΡΠ° Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ ΠΎΠ΄ ΠΌΠ°ΡΠΈΠ½Π°ΡΠ° Π½Π° ΡΠ°Π·Π²ΠΈΠ²Π°ΡΠΎΡ.
ΠΠ°ΡΠ·Π³ΠΎΠ΄Π½ΠΈΠΎΡ Π½Π°ΡΠΈΠ½, ΡΠΏΠΎΡΠ΅Π΄ Π½Π°ΡΠ΅ ΠΌΠΈΡΠ»Π΅ΡΠ΅, Π΄Π° ΡΠ΅ ΡΠ°Π±ΠΎΡΠΈ Π»ΠΎΠΊΠ°Π»Π½ΠΎ ΡΠΎ ΠΊΡΠ±Π΅ΡΠ½Π΅ΡΠΈΡΠ΅ Π΅ . Π‘Π»Π΅Π΄Π½ΠΈΠΎΡ ΡΠ΅ΠΊΠΎΡ Π΅ Π΄Π° ΡΠ° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΠ΅ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΡΠ°ΡΠ° Prometheus + Grafana ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ ΠΏΡΠΎΠΌΠ΅ΡΠ΅Ρ-ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ. ΠΠ ΠΠ΅ΡΠ°Π»Π½ΠΎ Π΅ ΠΎΠΏΠΈΡΠ°Π½ ΠΏΡΠΎΡΠ΅ΡΠΎΡ Π½Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΠ΅ Π½Π° ΠΏΡΠΎΠΌΠ΅ΡΠ΅Ρ-ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ Π½Π° 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, ΡΡΠ»ΡΠ³Π°, ΡΠ°Π·ΠΎΠ», ΠΈΠΌΠ΅Π½ΡΠΊΠΈ ΠΏΡΠΎΡΡΠΎΡ. Π‘Π΅ΠΊΠΎΡΠ° ΠΎΠ΄ ΠΎΠ²ΠΈΠ΅ ΠΊΠ»Π°ΡΠΈ Π½Π°ΡΠ»Π΅Π΄ΡΠ²Π° ΠΎΠ΄ Π·Π°Π΅Π΄Π½ΠΈΡΠΊΠ°ΡΠ° ΠΊΠ»Π°ΡΠ° 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 = [];
}
}Π‘ΠΎ ΠΏΠΎΠΌΠΎΡ Π½Π° Π΄ΠΎΠ±ΠΈΠ²Π°ΡΠΈ ΠΈ ΠΏΠΎΡΡΠ°Π²ΡΠ²Π°ΡΠΈ, ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° Π³ΠΈ ΠΏΡΠΈΠΊΠ°ΠΆΠ΅ΠΌΠ΅ ΠΈΠ»ΠΈ ΠΏΠΎΡΡΠ°Π²ΠΈΠΌΠ΅ ΠΌΠ΅ΡΡΠΈΠΊΠΈΡΠ΅ Π½Π° Π΅Π½ΡΠΈΡΠ΅ΡΠΈΡΠ΅ ΡΡΠΎ Π½ΠΈ ΡΠ΅ ΠΏΠΎΡΡΠ΅Π±Π½ΠΈ Π²ΠΎ ΠΏΡΠΈΠ³ΠΎΠ΄Π½Π° ΠΈ ΡΠΈΡΠ»ΠΈΠ²Π° ΡΠΎΡΠΌΠ°. ΠΠ° ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠΎΡΠΌΠ°ΡΠΈΡΠ°Π½ ΠΈΠ·Π»Π΅Π· Π½Π° Π΄ΠΎΠ΄Π΅Π»Π΅Π½ΠΈ ΠΏΡΠΎΡΠ΅ΡΠΎΡΡΠΊΠΈ ΡΠ°Π·Π»ΠΈ:
get cpuAllocatableFormatted(){
let cpu = this.data.status.allocatable.cpu;
if(cpu.indexOf('m') > -1){
cpu = parseInt(cpu)/1000;
}
return cpu;
}Π‘ΡΡΠ°Π½ΠΈΡΠΈ ΡΠΎ Π²ΡΡΠΊΠΈ
Π‘ΠΏΠΈΡΠΎΠΊΠΎΡ Π½Π° ΡΠΈΡΠ΅ Π½Π°ΡΠΈ ΡΡΡΠ°Π½ΠΈΡΠΈ ΡΠΎ ΠΏΡΠΈΠΊΠ»ΡΡΠΎΡΠΈ ΠΏΡΠ²ΠΈΡΠ½ΠΎ Π΅ ΠΎΠΏΠΈΡΠ°Π½ Π²ΠΎ Π½Π°ΡΠΈΠΎΡ pluing.json Π²ΠΎ Π΄Π΅Π»ΠΎΡ Π·Π° Π·Π°Π²ΠΈΡΠ½ΠΎΡΡΠΈ:

ΠΠΎ Π±Π»ΠΎΠΊΠΎΡ Π·Π° ΡΠ΅ΠΊΠΎΡΠ° ΡΡΡΠ°Π½ΠΈΡΠ° ΠΌΠΎΡΠ°ΠΌΠ΅ Π΄Π° Π³ΠΎ Π½Π°Π²Π΅Π΄Π΅ΠΌΠ΅ ΠΠΠΠ’Π ΠΠ Π‘Π’Π ΠΠΠΠ’Π (ΡΠΎΠ° ΡΠ΅ ΡΠ΅ ΠΏΡΠ΅ΡΠ²ΠΎΡΠΈ Π²ΠΎ Π³ΠΎΠ»ΡΠΊΠ° ΡΠΎ ΠΊΠΎΡΠ° ΠΎΠ²Π°Π° ΡΡΡΠ°Π½ΠΈΡΠ° ΡΠ΅ Π±ΠΈΠ΄Π΅ Π΄ΠΎΡΡΠ°ΠΏΠ½Π°); ΠΈΠΌΠ΅ΡΠΎ Π½Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°ΡΠ° ΠΎΠ΄Π³ΠΎΠ²ΠΎΡΠ½Π° Π·Π° ΡΠ°Π±ΠΎΡΠ°ΡΠ° Π½Π° ΠΎΠ²Π°Π° ΡΡΡΠ°Π½ΠΈΡΠ° (Π»ΠΈΡΡΠ°ΡΠ° Π½Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ ΡΠ΅ ΠΈΠ·Π²Π΅Π·ΡΠ²Π° Π²ΠΎ module.ts); ΡΡΠΎ ΡΠ° ΠΎΠ·Π½Π°ΡΡΠ²Π° ΡΠ»ΠΎΠ³Π°ΡΠ° Π½Π° ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊΠΎΡ Π·Π° ΠΊΠΎΡΠ° Π΅ Π΄ΠΎΡΡΠ°ΠΏΠ½Π° ΡΠ°Π±ΠΎΡΠ°ΡΠ° ΡΠΎ ΠΎΠ²Π°Π° ΡΡΡΠ°Π½ΠΈΡΠ° ΠΈ ΠΏΠΎΡΡΠ°Π²ΠΊΠΈΡΠ΅ Π·Π° Π½Π°Π²ΠΈΠ³Π°ΡΠΈΡΠ° Π·Π° ΡΡΡΠ°Π½ΠΈΡΠ½Π°ΡΠ° Π»Π΅Π½ΡΠ°.
ΠΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°ΡΠ° ΠΎΠ΄Π³ΠΎΠ²ΠΎΡΠ½Π° Π·Π° ΡΠ°Π±ΠΎΡΠ°ΡΠ° Π½Π° ΡΡΡΠ°Π½ΠΈΡΠ°ΡΠ°, ΠΌΠΎΡΠ° Π΄Π° ΠΏΠΎΡΡΠ°Π²ΠΈΠΌΠ΅ templateUrl, ΠΏΡΠ΅Π½Π΅ΡΡΠ²Π°ΡΡΠΈ ΡΠ° ΠΏΠ°ΡΠ΅ΠΊΠ°ΡΠ° Π΄ΠΎ html-Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°ΡΠ° ΡΠΎ ΠΎΠ±Π΅Π»Π΅ΠΆΡΠ²Π°ΡΠ΅. ΠΠ½Π°ΡΡΠ΅ Π²ΠΎ ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΎΡΠΎΡ, ΠΏΡΠ΅ΠΊΡ Π²Π±ΡΠΈΠ·Π³ΡΠ²Π°ΡΠ΅ Π½Π° Π·Π°Π²ΠΈΡΠ½ΠΎΡΡ, ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° ΠΏΡΠΈΡΡΠ°ΠΏΠΈΠΌΠ΅ Π΄ΠΎ 2 Π²Π°ΠΆΠ½ΠΈ Π°Π³ΠΎΠ»Π½ΠΈ ΡΡΠ»ΡΠ³ΠΈ:
- backendSrv - ΡΡΠ»ΡΠ³Π° ΠΊΠΎΡΠ° ΠΎΠ±Π΅Π·Π±Π΅Π΄ΡΠ²Π° ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΡΠ° ΡΠΎ ΡΠ΅ΡΠ²Π΅ΡΠΎΡ Grafana API;
- datasourceSrv - ΡΡΠ»ΡΠ³Π° ΠΊΠΎΡΠ° ΠΎΠ±Π΅Π·Π±Π΅Π΄ΡΠ²Π° Π»ΠΎΠΊΠ°Π»Π½Π° ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΡΠ° ΡΠΎ ΡΠΈΡΠ΅ ΠΈΠ·Π²ΠΎΡΠΈ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½ΠΈ Π²ΠΎ Π²Π°ΡΠ°ΡΠ° Grafana (Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ, ΠΌΠ΅ΡΠΎΠ΄ΠΎΡ .getAll() - Π²ΡΠ°ΡΠ° ΡΠΏΠΈΡΠΎΠΊ Π½Π° ΡΠΈΡΠ΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½ΠΈ ΠΈΠ·Π²ΠΎΡΠΈ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ; .get( ) - Π²ΡΠ°ΡΠ° ΠΏΡΠΈΠΌΠ΅ΡΠ΅Π½ ΠΎΠ±ΡΠ΅ΠΊΡ Π½Π° ΠΎΠ΄ΡΠ΅Π΄Π΅Π½ ΠΈΠ·Π²ΠΎΡ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ.



ΠΠ΅Π» 4: ΠΈΠ·Π²ΠΎΡ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ
ΠΠ΄ Π³Π»Π΅Π΄Π½Π° ΡΠΎΡΠΊΠ° Π½Π° ΠΡΠ°ΡΠ°Π½Π°, ΠΈΠ·Π²ΠΎΡΠΎΡ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ Π΅ ΠΏΠΎΡΠΏΠΎΠ»Π½ΠΎ ΠΈΡΡΠΈΠΎΡ ΠΏΡΠΈΠΊΠ»ΡΡΠΎΠΊ ΠΊΠ°ΠΊΠΎ ΠΈ ΡΠΈΡΠ΅ Π΄ΡΡΠ³ΠΈ: ΠΈΠΌΠ° ΡΠ²ΠΎΡΠ° Π²Π»Π΅Π·Π½Π° ΡΠΎΡΠΊΠ° module.js, ΠΈΠΌΠ° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ° ΡΠΎ ΠΌΠ΅ΡΠ° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ plugin.json. ΠΠΎΠ³Π° ΡΠ°Π·Π²ΠΈΠ²Π°ΠΌΠ΅ Π΄ΠΎΠ΄Π°ΡΠΎΠΊ ΡΠΎ ΡΠΈΠΏ = Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ°, ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° ΠΊΠΎΠΌΡΠ½ΠΈΡΠΈΡΠ°ΠΌΠ΅ ΠΈ ΡΠΎ ΠΏΠΎΡΡΠΎΠ΅ΡΠΊΠΈΡΠ΅ ΠΈΠ·Π²ΠΎΡΠΈ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ (Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΡΠΎΠΌΠ΅ΡΠ΅Ρ-ΠΈΠ·Π²ΠΎΡ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ) ΠΈ ΡΠΎ Π½Π°ΡΠΈΡΠ΅, ΠΊΠΎΠΈ ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° Π³ΠΈ ΡΠΊΠ»Π°Π΄ΠΈΡΠ°ΠΌΠ΅ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ Π²ΠΎ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΠΌΠΎΡ Π½Π° ΠΏΡΠΈΠΊΠ»ΡΡΠΎΠΊΠΎΡ (dist/datasource/*) ΠΈΠ»ΠΈ Π΄Π° Π³ΠΎ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠ΅ ΠΊΠ°ΠΊΠΎ Π·Π°Π²ΠΈΡΠ½ΠΎΡΡ. ΠΠΎ Π½Π°ΡΠΈΠΎΡ ΡΠ»ΡΡΠ°Ρ, ΠΈΠ·Π²ΠΎΡΠΎΡ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ Π΄ΠΎΠ°ΡΠ° ΡΠΎ ΠΊΠΎΠ΄ΠΎΡ Π½Π° ΠΏΡΠΈΠΊΠ»ΡΡΠΎΠΊΠΎΡ. ΠΡΡΠΎ ΡΠ°ΠΊΠ°, ΠΏΠΎΡΡΠ΅Π±Π½ΠΎ Π΅ Π΄Π° ΠΈΠΌΠ°ΡΠ΅ ΡΠ°Π±Π»ΠΎΠ½ config.html ΠΈ ΠΊΠΎΠ½ΡΡΠΎΠ»Π΅Ρ ConfigCtrl, ΠΊΠΎΠΈ ΡΠ΅ ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠ°Ρ Π·Π° ΡΡΡΠ°Π½ΠΈΡΠ°ΡΠ° Π·Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΠ° Π½Π° ΠΏΡΠΈΠΌΠ΅ΡΠΎΡ Π½Π° ΠΈΠ·Π²ΠΎΡΠΎΡ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ ΠΈ ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΎΡΠΎΡ Datasource, ΠΊΠΎΡ ΡΠ° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ²Π½Π°ΡΠ° Π»ΠΎΠ³ΠΈΠΊΠ° Π½Π° Π²Π°ΡΠΈΠΎΡ ΠΈΠ·Π²ΠΎΡ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ.
ΠΠΎ ΠΏΡΠΈΠΊΠ»ΡΡΠΎΠΊΠΎΡ KubeGraf, ΠΎΠ΄ Π³Π»Π΅Π΄Π½Π° ΡΠΎΡΠΊΠ° Π½Π° ΠΊΠΎΡΠΈΡΠ½ΠΈΡΠΊΠΈΠΎΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΡΡ, ΠΈΠ·Π²ΠΎΡΠΎΡ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ Π΅ ΠΏΡΠΈΠΌΠ΅Ρ ΠΎΠ΄ ΠΊΠ»Π°ΡΡΠ΅ΡΠΎΡ kubernetes ΡΡΠΎ Π³ΠΈ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ° ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΠΈ (ΠΈΠ·Π²ΠΎΡΠ½ΠΈΠΎΡ ΠΊΠΎΠ΄ Π΅ Π΄ΠΎΡΡΠ°ΠΏΠ΅Π½ ):
- ΡΠΎΠ±ΠΈΡΠ°ΡΠ΅ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ ΠΎΠ΄ k8s api-ΡΠ΅ΡΠ²Π΅ΡΠΎΡ (Π΄ΠΎΠ±ΠΈΠ²Π°ΡΠ΅ Π»ΠΈΡΡΠ° Π½Π° ΠΈΠΌΠ΅Π½ΡΠΊΠΈ ΠΏΡΠΎΡΡΠΎΡΠΈ, ΡΠ°ΡΠΏΠΎΡΠ΅Π΄ΡΠ²Π°ΡΠ°...)
- ΠΏΡΠΎΠΊΡΠΈ Π±Π°ΡΠ°ΡΠ° Π΄ΠΎ ΠΈΠ·Π²ΠΎΡΠΎΡ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ Π½Π° prometheus (ΠΊΠΎΡ Π΅ ΠΈΠ·Π±ΡΠ°Π½ Π²ΠΎ ΠΏΠΎΡΡΠ°Π²ΠΊΠΈΡΠ΅ Π½Π° ΠΏΡΠΈΠΊΠ»ΡΡΠΎΠΊΠΎΡ Π·Π° ΡΠ΅ΠΊΠΎΡ ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ΅Π½ ΠΊΠ»Π°ΡΡΠ΅Ρ) ΠΈ ΡΠΎΡΠΌΠ°ΡΠΈΡΠ°ΡΠ΅ Π½Π° ΠΎΠ΄Π³ΠΎΠ²ΠΎΡΠΈΡΠ΅ Π·Π° ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ ΠΈ Π²ΠΎ ΡΡΠ°ΡΠΈΡΠ½ΠΈ ΡΡΡΠ°Π½ΠΈΡΠΈ ΠΈ Π²ΠΎ ΠΊΠΎΠ½ΡΡΠΎΠ»Π½ΠΈ ΡΠ°Π±Π»ΠΈ.
- Π°ΠΆΡΡΠΈΡΠ°ΡΠ΅ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ Π½Π° ΡΡΠ°ΡΠΈΡΠ½ΠΈ ΡΡΡΠ°Π½ΠΈΡΠΈ ΡΠΎ ΠΏΡΠΈΠΊΠ»ΡΡΠΎΡΠΈ (ΡΠΎ ΠΏΠΎΡΡΠ°Π²Π΅Π½Π° ΡΡΠ°ΠΏΠΊΠ° Π½Π° ΠΎΡΠ²Π΅ΠΆΡΠ²Π°ΡΠ΅).
- ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π° Π±Π°ΡΠ°ΡΠ° Π·Π° Π³Π΅Π½Π΅ΡΠΈΡΠ°ΡΠ΅ Π½Π° Π»ΠΈΡΡ ΡΠΎ ΡΠ°Π±Π»ΠΎΠ½ΠΈ Π²ΠΎ 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"};
})
}ΠΠΎΡΠ΅Π±Π½Π° ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½Π° ΡΠΎΡΠΊΠ°, ΡΠΏΠΎΡΠ΅Π΄ Π½Π°ΡΠ΅ ΠΌΠΈΡΠ»Π΅ΡΠ΅, Π΅ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ°ΡΠ° Π½Π° ΠΌΠ΅Ρ Π°Π½ΠΈΠ·Π°ΠΌ Π·Π° Π°Π²ΡΠ΅Π½ΡΠΈΠΊΠ°ΡΠΈΡΠ° ΠΈ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΡΠ° Π·Π° ΠΈΠ·Π²ΠΎΡΠΎΡ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ. ΠΠΎΠΎΠ±ΠΈΡΠ°Π΅Π½ΠΎ, Π½Π°Π΄Π²ΠΎΡ ΠΎΠ΄ ΠΊΡΡΠΈΡΠ°ΡΠ°, ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° ΡΠ° ΠΊΠΎΡΠΈΡΡΠΈΠΌΠ΅ Π²Π³ΡΠ°Π΄Π΅Π½Π°ΡΠ° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° Grafana datasourceHttpSettings Π·Π° Π΄Π° Π³ΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°ΠΌΠ΅ ΠΏΡΠΈΡΡΠ°ΠΏΠΎΡ Π΄ΠΎ ΠΊΠΎΠ½Π΅ΡΠ½ΠΈΠΎΡ ΠΈΠ·Π²ΠΎΡ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ. ΠΠΎΡΠΈΡΡΠ΅ΡΡΠΈ ΡΠ° ΠΎΠ²Π°Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°, ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° Π³ΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°ΠΌΠ΅ ΠΏΡΠΈΡΡΠ°ΠΏΠΎΡ Π΄ΠΎ ΠΈΠ·Π²ΠΎΡΠΎΡ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ http ΡΠΎ ΠΎΠ΄ΡΠ΅Π΄ΡΠ²Π°ΡΠ΅ Π½Π° URL-ΡΠΎ ΠΈ ΠΎΡΠ½ΠΎΠ²Π½ΠΈΡΠ΅ ΠΏΠΎΡΡΠ°Π²ΠΊΠΈ Π·Π° Π°Π²ΡΠ΅Π½ΡΠΈΠΊΠ°ΡΠΈΡΠ°/ΠΎΠ²Π»Π°ΡΡΡΠ²Π°ΡΠ΅: Π½Π°ΡΠ°Π²Π°-Π»ΠΎΠ·ΠΈΠ½ΠΊΠ° ΠΈΠ»ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ-ΡΠ΅ΡΡ/ΠΊΠ»ΠΈΠ΅Π½Ρ-ΠΊΠ»ΡΡ. ΠΠ° Π΄Π° ΡΠ° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠ°ΠΌΠ΅ ΠΌΠΎΠΆΠ½ΠΎΡΡΠ° Π·Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°ΡΠ΅ Π½Π° ΠΏΡΠΈΡΡΠ°ΠΏΠΎΡ ΡΠΎ ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ Π½Π° Π½ΠΎΡΠΈΡΠ΅Π» ΡΠΎΠΊΠ΅Π½ (Π΄Π΅ ΡΠ°ΠΊΡΠΎ ΡΡΠ°Π½Π΄Π°ΡΠ΄ Π·Π° k8s), ΠΌΠΎΡΠ°Π²ΠΌΠ΅ Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΠΌΠ΅ ΠΌΠ°Π»ΠΊΡ Π΄ΠΎΡΠ΅ΡΡΠ²Π°ΡΠ΅.
ΠΠ° Π΄Π° Π³ΠΎ ΡΠ΅ΡΠΈΡΠ΅ ΠΎΠ²ΠΎΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π³ΠΎ ΠΊΠΎΡΠΈΡΡΠΈΡΠ΅ Π²Π³ΡΠ°Π΄Π΅Π½ΠΈΠΎΡ ΠΌΠ΅Ρ
Π°Π½ΠΈΠ·Π°ΠΌ Grafana βPlugin Routesβ (ΠΏΠΎΠ²Π΅ΡΠ΅ Π΄Π΅ΡΠ°Π»ΠΈ Π½Π° ). ΠΠΎ ΠΏΠΎΡΡΠ°Π²ΠΊΠΈΡΠ΅ Π½Π° Π½Π°ΡΠΈΠΎΡ ΠΈΠ·Π²ΠΎΡ Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ, ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° Π΄Π΅ΠΊΠ»Π°ΡΠΈΡΠ°ΠΌΠ΅ Π·Π±ΠΈΡ Π½Π° ΠΏΡΠ°Π²ΠΈΠ»Π° Π·Π° ΡΡΡΠΈΡΠ°ΡΠ΅ ΠΊΠΎΠΈ ΡΠ΅ Π±ΠΈΠ΄Π°Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ΅Π½ΠΈ ΠΎΠ΄ ΠΏΡΠΎΠΊΡΠΈ-ΡΠ΅ΡΠ²Π΅ΡΠΎΡ grafana. ΠΠ° ΠΏΡΠΈΠΌΠ΅Ρ, Π·Π° ΡΠ΅ΠΊΠΎΡΠ° ΠΏΠΎΠ΅Π΄ΠΈΠ½Π΅ΡΠ½Π° ΠΊΡΠ°ΡΠ½Π° ΡΠΎΡΠΊΠ° Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π΄Π° ΡΠ΅ ΠΏΠΎΡΡΠ°Π²Π°Ρ Π·Π°Π³Π»Π°Π²ΠΈΡΠ° ΠΈΠ»ΠΈ url ΡΠΎ ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° ΡΠ°Π±Π»ΠΎΠ½, ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ Π·Π° ΠΊΠΎΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΏΡΠ΅Π·Π΅ΠΌΠ°Ρ ΠΎΠ΄ ΠΏΠΎΠ»ΠΈΡΠ°ΡΠ° jsonData ΠΈ safeJsonData (Π·Π° ΡΠΊΠ»Π°Π΄ΠΈΡΠ°ΡΠ΅ Π»ΠΎΠ·ΠΈΠ½ΠΊΠΈ ΠΈΠ»ΠΈ ΡΠΎΠΊΠ΅Π½ΠΈ Π²ΠΎ ΡΠΈΡΡΠΈΡΠ°Π½Π° ΡΠΎΡΠΌΠ°). ΠΠΎ Π½Π°ΡΠΈΠΎΡ ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΡΠ°ΡΠ°ΡΠ° ΠΊΠ°ΠΊΠΎ /__ΠΏΡΠΎΠΊΡΠΈ/api/v1/ΠΈΠΌΠ΅Π½ΡΠΊΠΈ ΠΏΡΠΎΡΡΠΎΡΠΈ ΡΠ΅ Π±ΠΈΠ΄Π΅ ΠΏΡΠΎΠΊΡΠΈΡΠ°Π½ΠΎ Π½Π° URL-ΡΠΎ Π½Π° ΡΠΎΡΠΌΡΠ»Π°ΡΠΎΡ
/api/v8/ΠΈΠΌΠ΅Π½ΡΠΊΠΈ ΠΏΡΠΎΡΡΠΎΡΠΈ ΡΠΎ Π·Π°Π³Π»Π°Π²ΠΈΠ΅ Π½Π° Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΡΠ°: Π½ΠΎΡΠΈΡΠ΅Π».


Π‘Π΅ΠΊΠ°ΠΊΠΎ, Π·Π° ΡΠ°Π±ΠΎΡΠ° ΡΠΎ k8s api ΡΠ΅ΡΠ²Π΅ΡΠΎΡ Π½ΠΈ ΡΡΠ΅Π±Π° ΠΊΠΎΡΠΈΡΠ½ΠΈΠΊ ΡΠΎ ΠΏΡΠΈΡΡΠ°ΠΏ ΡΠ°ΠΌΠΎ Π·Π° ΡΠΈΡΠ°ΡΠ΅, ΠΌΠ°Π½ΠΈΡΠ΅ΡΡΠ°ΡΠΈΠΈ Π·Π° ΠΊΡΠ΅ΠΈΡΠ°ΡΠ΅ ΠΊΠΎΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π³ΠΈ Π½Π°ΡΠ΄Π΅ΡΠ΅ ΠΈ Π²ΠΎ .
ΠΠ΅Π» 5: ΠΎΡΠ»ΠΎΠ±ΠΎΠ΄ΡΠ²Π°ΡΠ΅

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

ΠΊΠ°Π΄Π΅ ΡΡΠΎ Π²Π΅ΡΠ·ΠΈΡΠ°ΡΠ° Π΅ Π²Π΅ΡΠ·ΠΈΡΠ°ΡΠ° Π½Π° Π²Π°ΡΠΈΠΎΡ ΠΏΡΠΈΠΊΠ»ΡΡΠΎΠΊ, url Π΅ Π²ΡΡΠΊΠ° Π΄ΠΎ ΡΠΊΠ»Π°Π΄ΠΈΡΡΠ΅ΡΠΎ, Π° commit Π΅ Ρ
Π°ΡΠΎΡ Π½Π° commit Π·Π° ΠΊΠΎΡ ΡΠ΅ Π±ΠΈΠ΄Π΅ Π΄ΠΎΡΡΠ°ΠΏΠ½Π° ΠΎΠ΄ΡΠ΅Π΄Π΅Π½Π° Π²Π΅ΡΠ·ΠΈΡΠ° Π½Π° ΠΏΡΠΈΠΊΠ»ΡΡΠΎΠΊΠΎΡ.
Π Π½Π° ΠΈΠ·Π»Π΅Π·ΠΎΡ ΡΠ΅ Π²ΠΈΠ΄ΠΈΡΠ΅ ΠΏΡΠ΅ΠΊΡΠ°ΡΠ½Π° ΡΠ»ΠΈΠΊΠ° ΠΊΠ°ΠΊΠΎ:

ΠΠΎΠ΄Π°ΡΠΎΡΠΈΡΠ΅ Π·Π° Π½Π΅Π³ΠΎ Π°Π²ΡΠΎΠΌΠ°ΡΡΠΊΠΈ ΡΠ΅ Π±ΠΈΠ΄Π°Ρ Π·Π΅ΠΌΠ΅Π½ΠΈ ΠΎΠ΄ Π²Π°ΡΠΈΡΠ΅ Readme.md, Changelog.md ΠΈ Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°ΡΠ° plugin.json ΡΠΎ ΠΎΠΏΠΈΡ Π½Π° ΠΏΡΠΈΠΊΠ»ΡΡΠΎΠΊΠΎΡ.
ΠΠ΅Π» 6: Π½Π°ΠΌΠ΅ΡΡΠΎ Π·Π°ΠΊΠ»ΡΡΠΎΡΠΈ
ΠΠ΅ ΠΏΡΠ΅ΡΡΠ°Π½Π°Π²ΠΌΠ΅ Π΄Π° Π³ΠΎ ΡΠ°Π·Π²ΠΈΠ²Π°ΠΌΠ΅ Π½Π°ΡΠΈΠΎΡ ΠΏΡΠΈΠΊΠ»ΡΡΠΎΠΊ ΠΏΠΎ ΠΎΠ±ΡΠ°Π²ΡΠ²Π°ΡΠ΅ΡΠΎ. Π ΡΠ΅Π³Π° ΡΠ°Π±ΠΎΡΠΈΠΌΠ΅ Π½Π° ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΎ ΡΠ»Π΅Π΄Π΅ΡΠ΅ Π½Π° ΡΠΏΠΎΡΡΠ΅Π±Π°ΡΠ° Π½Π° ΡΠ΅ΡΡΡΡΠΈΡΠ΅ Π½Π° ΡΠ°Π·Π»ΠΈΡΠ΅ Π½Π° ΠΊΠ»Π°ΡΡΠ΅ΡΠΎΡ, Π²ΠΎΠ²Π΅Π΄ΡΠ²Π°ΡΠ΅ Π½ΠΎΠ²ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Π·Π° ΠΏΠΎΠ΄ΠΎΠ±ΡΡΠ²Π°ΡΠ΅ Π½Π° UX, Π° ΠΈΡΡΠΎ ΡΠ°ΠΊΠ° ΠΈ ΡΠΎΠ±ΠΈΡΠ°ΡΠ΅ Π½Π° Π³ΠΎΠ»Π΅ΠΌ Π±ΡΠΎΡ ΠΏΠΎΠ²ΡΠ°ΡΠ½ΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ Π΄ΠΎΠ±ΠΈΠ΅Π½ΠΈ ΠΏΠΎ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΠ΅ΡΠΎ Π½Π° ΠΏΡΠΈΠΊΠ»ΡΡΠΎΠΊΠΎΡ ΠΈ ΠΎΠ΄ Π½Π°ΡΠΈΡΠ΅ ΠΊΠ»ΠΈΠ΅Π½ΡΠΈ ΠΈ ΠΎΠ΄ Π»ΡΡΠ΅ΡΠΎ Π½Π° GitHub (Π°ΠΊΠΎ Π³ΠΎ Π½Π°ΠΏΡΡΡΠΈΡΠ΅ Π²Π°ΡΠ΅ ΠΏΡΠ°ΡΠ°ΡΠ΅ ΠΈΠ»ΠΈ Π±Π°ΡΠ°ΡΠ΅, ΡΠ°Ρ ΡΠ΅ Π±ΠΈΠ΄Π°ΠΌ ΠΌΠ½ΠΎΠ³Ρ ΡΡΠ΅ΡΠ΅Π½ :)
Π‘Π΅ Π½Π°Π΄Π΅Π²Π°ΠΌΠ΅ Π΄Π΅ΠΊΠ° ΠΎΠ²Π°Π° ΡΡΠ°ΡΠΈΡΠ° ΡΠ΅ Π²ΠΈ ΠΏΠΎΠΌΠΎΠ³Π½Π΅ Π΄Π° ΡΠ°Π·Π±Π΅ΡΠ΅ΡΠ΅ ΡΠ°ΠΊΠ²Π° ΠΏΡΠ΅ΠΊΡΠ°ΡΠ½Π° Π°Π»Π°ΡΠΊΠ° ΠΊΠ°ΠΊΠΎ Grafana ΠΈ, ΠΌΠΎΠΆΠ΅Π±ΠΈ, Π΄Π° Π½Π°ΠΏΠΈΡΠ΅ΡΠ΅ ΡΠ²ΠΎΡ ΠΏΡΠΈΠΊΠ»ΡΡΠΎΠΊ.
ΠΠΈ Π±Π»Π°Π³ΠΎΠ΄Π°ΡΠ°ΠΌ!)
ΠΠ·Π²ΠΎΡ: www.habr.com
