ΠΠ΄ΡΠ°Π²Π΅ΠΉΡΠ΅ Π²ΡΠΈΡΠΊΠΈ! ΠΡΠ΅Π΄ΠΈ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΌΠ΅ΡΠ΅ΡΠ° ΡΡΠ°ΡΡΠΈΡΠ°Ρ
ΠΌΠ΅ Π½Π°ΡΠΈΡ Π½ΠΎΠ² ΠΏΡΠΎΠ΅ΠΊΡ Ρ ΠΎΡΠ²ΠΎΡΠ΅Π½ ΠΊΠΎΠ΄ Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²ΠΎ - Grafana-plugin Π·Π° Π½Π°Π±Π»ΡΠ΄Π΅Π½ΠΈΠ΅ Π½Π° kubernetes, ΠΊΠΎΠΉΡΠΎ Π½Π°ΡΠ΅ΠΊΠΎΡ
ΠΌΠ΅
Π§Π°ΡΡ 0 - Π²ΡΠ²Π΅Π΄Π΅Π½ΠΈΠ΅: ΠΊΠ°ΠΊ ΡΡΠΈΠ³Π½Π°Ρ ΠΌΠ΅ Π΄ΠΎΡΡΠΊ?
ΠΠ΄Π΅ΡΡΠ° Π΄Π° Π½Π°ΠΏΠΈΡΠ΅ΠΌ ΡΠΎΠ±ΡΡΠ²Π΅Π½ ΠΏΠ»ΡΠ³ΠΈΠ½ Π·Π° Grafan ΡΠ΅ ΡΠΎΠ΄ΠΈ ΡΡΠ²ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎ. ΠΠ°ΡΠ°ΡΠ° ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΡ Π½Π°Π±Π»ΡΠ΄Π°Π²Π° ΡΠ΅Π± ΠΏΡΠΎΠ΅ΠΊΡΠΈ Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π½ΠΈΠ²Π° Π½Π° ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΎΡ 10 Π³ΠΎΠ΄ΠΈΠ½ΠΈ. ΠΡΠ΅Π· ΡΠΎΠ²Π° Π²ΡΠ΅ΠΌΠ΅ Π½Π°ΡΡΡΠΏΠ°Ρ ΠΌΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ Π΅ΠΊΡΠΏΠ΅ΡΡΠΈΠ·Π°, ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΈ ΠΊΠ°Π·ΡΡΠΈ ΠΈ ΠΎΠΏΠΈΡ Π² ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΠΈΡΡΠ΅ΠΌΠΈ Π·Π° ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³. Π Π² Π΅Π΄ΠΈΠ½ ΠΌΠΎΠΌΠ΅Π½Ρ ΡΠ΅ Π·Π°ΠΏΠΈΡΠ°Ρ ΠΌΠ΅: βΠΠΌΠ° Π»ΠΈ ΠΌΠ°Π³ΠΈΡΠ΅ΡΠΊΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π·Π° Π½Π°Π±Π»ΡΠ΄Π΅Π½ΠΈΠ΅ Π½Π° Kubernetes, ΡΠ°ΠΊΠ° ΡΠ΅, ΠΊΠ°ΠΊΡΠΎ ΡΠ΅ ΠΊΠ°Π·Π²Π°, βΠ½Π°ΡΡΡΠΎΠΉΡΠ΅ Π³ΠΎ ΠΈ Π³ΠΎ Π·Π°Π±ΡΠ°Π²Π΅ΡΠ΅β?β Π ΠΊΠ°ΡΠΎ Π³ΠΎΡΠΎΠ²ΠΈ ΡΠ΅ΡΠ΅Π½ΠΈΡ Π·Π° ΡΠΎΠ·ΠΈ ΡΡΠ΅ΠΊ ΠΈΠΌΠ° Π³ΠΎΠ»ΡΠΌ Π½Π°Π±ΠΎΡ ΠΎΡ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π²ΠΈΠ΄ΠΎΠ²Π΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ: prometheus-operator, Π½Π°Π±ΠΎΡ ΠΎΡ ΡΠ°Π±Π»Π° Π·Π° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ kubernetes-mixin, grafana-kubernetes-app.
ΠΡΠΈΡΡΠ°Π²ΠΊΠ°ΡΠ° Π·Π° grafana-kubernetes-app ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π°ΡΠ΅ Π½Π°ΠΉ-ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½Π°ΡΠ° ΠΎΠΏΡΠΈΡ Π·Π° Π½Π°Ρ, Π½ΠΎ ΡΡ Π½Π΅ ΡΠ΅ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΎΡ Π³ΠΎΠ΄ΠΈΠ½Π° ΠΈ ΠΎΡΠ²Π΅Π½ ΡΠΎΠ²Π° Π½Π΅ Π·Π½Π°Π΅ ΠΊΠ°ΠΊ Π΄Π° ΡΠ°Π±ΠΎΡΠΈ Ρ Π½ΠΎΠ²ΠΈΡΠ΅ Π²Π΅ΡΡΠΈΠΈ Π½Π° node-exporter ΠΈ kube-state- ΠΌΠ΅ΡΡΠΈΠΊΠ°. Π Π² Π΅Π΄ΠΈΠ½ ΠΌΠΎΠΌΠ΅Π½Ρ ΡΠ΅ΡΠΈΡ ΠΌΠ΅: βΠΠ΅ ΡΡΡΠ±Π²Π° Π»ΠΈ ΡΠ°ΠΌΠΈ Π΄Π° Π²Π·Π΅ΠΌΠ΅ΠΌ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅?β
ΠΠ°ΠΊΠ²ΠΈ ΠΈΠ΄Π΅ΠΈ ΡΠ΅ΡΠΈΡ ΠΌΠ΅ Π΄Π° ΠΏΡΠΈΠ»ΠΎΠΆΠΈΠΌ Π² Π½Π°ΡΠΈΡ ΠΏΠ»ΡΠ³ΠΈΠ½:
- Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π° βΠΊΠ°ΡΡΠ° Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡΠ°β: ΡΠ΄ΠΎΠ±Π½ΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΡΠ½Π΅ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π² ΠΊΠ»ΡΡΡΠ΅Ρ, Π³ΡΡΠΏΠΈΡΠ°Π½ΠΈ ΠΏΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π° ΠΎΡ ΠΈΠΌΠ΅Π½Π°, Π²Π½Π΅Π΄ΡΡΠ²Π°Π½ΠΈΡβ¦;
- Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π° Π²ΡΡΠ·ΠΊΠΈ ΠΊΠ°ΡΠΎ "ΡΠ°Π·Π³ΡΡΡΠ°Π½Π΅ - ΡΡΠ»ΡΠ³Π° (+ΠΏΠΎΡΡΠΎΠ²Π΅)".
- Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π° ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΠΊΠ»ΡΡΡΠ΅ΡΠ½ΠΈΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΏΠΎ ΠΊΠ»ΡΡΡΠ΅ΡΠ½ΠΈ Π²ΡΠ·Π»ΠΈ.
- ΠΊΠΎΠ»Π΅ΠΊΡΠΈΡ ΠΎΡ ΠΏΠΎΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ ΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎΡ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΈΠ·ΡΠΎΡΠ½ΠΈΠΊΠ°: Prometheus ΠΈ k8s api ΡΡΡΠ²ΡΡ.
- ΡΠ»Π΅Π΄Π΅Π½Π΅ ΠΊΠ°ΠΊΡΠΎ Π½Π° ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ½Π°ΡΠ° ΡΠ°ΡΡ (ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΡΠ΅ΡΠΎΡΠ½ΠΎ Π²ΡΠ΅ΠΌΠ΅, ΠΏΠ°ΠΌΠ΅Ρ, Π΄ΠΈΡΠΊΠΎΠ²Π° ΠΏΠΎΠ΄ΡΠΈΡΡΠ΅ΠΌΠ°, ΠΌΡΠ΅ΠΆΠ°), ΡΠ°ΠΊΠ° ΠΈ Π½Π° Π»ΠΎΠ³ΠΈΠΊΠ°ΡΠ° Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ - Π·Π΄ΡΠ°Π²Π½ΠΈΡ ΡΡΠ°ΡΡΡ Π½Π° pods, Π±ΡΠΎΡ Π½Π° Π½Π°Π»ΠΈΡΠ½ΠΈΡΠ΅ ΡΠ΅ΠΏΠ»ΠΈΠΊΠΈ, ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π·Π° ΠΏΡΠ΅ΠΌΠΈΠ½Π°Π²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠΎΠ½Π΄ΠΈ Π·Π° ΠΆΠΈΠ²ΠΎΡΡ/Π³ΠΎΡΠΎΠ²Π½ΠΎΡΡ.
Π§Π°ΡΡ 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, ΠΊΠΎΠΉΡΠΎ ΠΎΠΏΠΈΡΠ²Π° ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ°, Π΄Π΅ΡΡΡΡΠΊΡΠΎΡΠ°, ΠΌΠ΅ΡΠΎΠ΄ΠΈΡΠ΅ Π·Π° Π°ΠΊΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½Π΅ ΠΈ ΠΏΡΠ΅Π²ΠΊΠ»ΡΡΠ²Π°Π½Π΅ Π½Π° Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΡΠ°. ΠΡΠ΅ΠΊΠΈ ΠΎΡ ΠΊΠ»Π°ΡΠΎΠ²Π΅ΡΠ΅ ΠΎΠΏΠΈΡΠ²Π° Π²Π»ΠΎΠΆΠ΅Π½ΠΈ Π²ΡΡΠ·ΠΊΠΈ Ρ Π΄ΡΡΠ³ΠΈ ΠΎΠ±Π΅ΠΊΡΠΈ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΡΠΏΠΈΡΡΠΊ ΠΎΡ ΠΏΠΎΠ΄ΠΎΠ²Π΅ Π·Π° ΠΎΠ±Π΅ΠΊΡ ΠΎΡ ΡΠΈΠΏ ΡΠ°Π·ΠΏΠΎΠ»Π°Π³Π°Π½Π΅.
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;
}
Pages
Π‘ΠΏΠΈΡΡΠΊΡΡ Ρ Π²ΡΠΈΡΠΊΠΈ ΡΡΡΠ°Π½ΠΈΡΠΈ Π½Π° Π½Π°ΡΠΈΡ ΠΏΠ»ΡΠ³ΠΈΠ½ ΠΏΡΡΠ²ΠΎΠ½Π°ΡΠ°Π»Π½ΠΎ Π΅ ΠΎΠΏΠΈΡΠ°Π½ Π² Π½Π°ΡΠΈΡ pluing.json Π² ΡΠ°Π·Π΄Π΅Π»Π° Π·Π° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ:
Π Π±Π»ΠΎΠΊΠ° Π·Π° Π²ΡΡΠΊΠ° ΡΡΡΠ°Π½ΠΈΡΠ° ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΠΎΡΠΎΡΠΈΠΌ ΠΠΠΠ’Π ΠΠ Π‘Π’Π ΠΠΠΠ¦ΠΠ’Π (ΡΠΎΠ³Π°Π²Π° ΡΠ΅ Π±ΡΠ΄Π΅ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ²Π°Π½ΠΎ Π² slug, ΡΡΠ΅Π· ΠΊΠΎΠΉΡΠΎ ΡΠ°Π·ΠΈ ΡΡΡΠ°Π½ΠΈΡΠ° ΡΠ΅ Π±ΡΠ΄Π΅ Π΄ΠΎΡΡΡΠΏΠ½Π°); ΠΈΠΌΠ΅ΡΠΎ Π½Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°, ΠΎΡΠ³ΠΎΠ²ΠΎΡΠ΅Π½ Π·Π° ΡΠ°Π±ΠΎΡΠ°ΡΠ° Π½Π° ΡΠ°Π·ΠΈ ΡΡΡΠ°Π½ΠΈΡΠ° (ΡΠΏΠΈΡΡΠΊΡΡ Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΈ ΡΠ΅ Π΅ΠΊΡΠΏΠΎΡΡΠΈΡΠ° Π² module.ts); ΡΠΊΠ°Π·Π²Π°Π½Π΅ Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠ°ΡΠ° ΡΠΎΠ»Ρ, Π·Π° ΠΊΠΎΡΡΠΎ Π΅ Π½Π°Π»ΠΈΡΠ½Π° ΡΠ°Π±ΠΎΡΠ° Ρ ΡΠ°Π·ΠΈ ΡΡΡΠ°Π½ΠΈΡΠ° ΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ Π·Π° Π½Π°Π²ΠΈΠ³Π°ΡΠΈΡ Π·Π° ΡΡΡΠ°Π½ΠΈΡΠ½Π°ΡΠ° Π»Π΅Π½ΡΠ°.
Π ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°, ΠΎΡΠ³ΠΎΠ²Π°ΡΡΡ Π·Π° ΡΡΡΠ°Π½ΠΈΡΠ°ΡΠ°, ΡΡΡΠ±Π²Π° Π΄Π° Π·Π°Π΄Π°Π΄Π΅ΠΌ templateUrl, ΠΊΠ°ΡΠΎ ΠΏΠΎΠ΄Π°Π΄Π΅ΠΌ ΠΏΡΡΡ Π΄ΠΎ html ΡΠ°ΠΉΠ»Π° Ρ ΠΌΠ°ΡΠΊΠΈΡΠ°Π½Π΅ΡΠΎ ΡΠ°ΠΌ. ΠΡΡΡΠ΅ Π² ΠΊΠΎΠ½ΡΡΠΎΠ»Π΅ΡΠ°, ΡΡΠ΅Π· ΠΈΠ½ΠΆΠ΅ΠΊΡΠΈΡΠ°Π½Π΅ Π½Π° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΏΠΎΠ»ΡΡΠΈΠΌ Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ 2 Π²Π°ΠΆΠ½ΠΈ ΡΠ³Π»ΠΎΠ²ΠΈ ΡΡΠ»ΡΠ³ΠΈ:
- backendSrv - ΡΡΠ»ΡΠ³Π°, ΠΊΠΎΡΡΠΎ ΠΎΡΠΈΠ³ΡΡΡΠ²Π° Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Ρ grafana api-ΡΡΡΠ²ΡΡΠ°;
- datasourceSrv β ΡΡΠ»ΡΠ³Π°, ΠΊΠΎΡΡΠΎ ΠΎΡΠΈΠ³ΡΡΡΠ²Π° Π»ΠΎΠΊΠ°Π»Π½ΠΎ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Ρ Π²ΡΠΈΡΠΊΠΈ ΠΈΠ·ΡΠΎΡΠ½ΠΈΡΠΈ Π½Π° Π΄Π°Π½Π½ΠΈ, ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½ΠΈ Π²ΡΠ² Π²Π°ΡΠ°ΡΠ° Grafana (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΠΌΠ΅ΡΠΎΠ΄ΡΡ .getAll() β Π²ΡΡΡΠ° ΡΠΏΠΈΡΡΠΊ Ρ Π²ΡΠΈΡΠΊΠΈ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½ΠΈ ΠΈΠ·ΡΠΎΡΠ½ΠΈΡΠΈ Π½Π° Π΄Π°Π½Π½ΠΈ; .get( ) - Π²ΡΡΡΠ° ΠΎΠ±Π΅ΠΊΡ Π½Π° Π΅ΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ Π½Π° ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ΅Π½ ΠΈΠ·ΡΠΎΡΠ½ΠΈΠΊ Π½Π° Π΄Π°Π½Π½ΠΈ.
Π§Π°ΡΡ 4: ΠΈΠ·ΡΠΎΡΠ½ΠΈΠΊ Π½Π° Π΄Π°Π½Π½ΠΈ
ΠΡ Π³Π»Π΅Π΄Π½Π° ΡΠΎΡΠΊΠ° Π½Π° Grafana, ΠΈΠ·ΡΠΎΡΠ½ΠΈΠΊΡΡ Π½Π° Π΄Π°Π½Π½ΠΈ Π΅ Π°Π±ΡΠΎΠ»ΡΡΠ½ΠΎ ΡΡΡΠΈΡΡ ΠΏΠ»ΡΠ³ΠΈΠ½ ΠΊΠ°ΡΠΎ Π²ΡΠΈΡΠΊΠΈ ΠΎΡΡΠ°Π½Π°Π»ΠΈ: ΠΈΠΌΠ° ΡΠ²ΠΎΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π° Π²Ρ ΠΎΠ΄Π½Π° ΡΠΎΡΠΊΠ° module.js, ΠΈΠΌΠ° ΡΠ°ΠΉΠ» plugin.json Ρ ΠΌΠ΅ΡΠ° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ. ΠΠΎΠ³Π°ΡΠΎ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ²Π°ΠΌΠ΅ ΠΏΠ»ΡΠ³ΠΈΠ½ Ρ ΡΠΈΠΏ = ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²Π°ΠΌΠ΅ ΠΊΠ°ΠΊΡΠΎ ΡΡΡ ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π°ΡΠΈ ΠΈΠ·ΡΠΎΡΠ½ΠΈΡΠΈ Π½Π° Π΄Π°Π½Π½ΠΈ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ prometheus-datasource), ΡΠ°ΠΊΠ° ΠΈ Ρ Π½Π°ΡΠΈΡΠ΅ ΡΠΎΠ±ΡΡΠ²Π΅Π½ΠΈ, ΠΊΠΎΠΈΡΠΎ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΡΡΡ ΡΠ°Π½ΡΠ²Π°ΠΌΠ΅ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ Π² Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΡΠ° Π½Π° ΠΏΠ»ΡΠ³ΠΈΠ½Π° (dist/datasource/*) ΠΈΠ»ΠΈ Π΄Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠ΅ ΠΊΠ°ΡΠΎ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ . Π Π½Π°ΡΠΈΡ ΡΠ»ΡΡΠ°ΠΉ ΠΈΠ·ΡΠΎΡΠ½ΠΈΠΊΡΡ Π½Π° Π΄Π°Π½Π½ΠΈ ΠΈΠ΄Π²Π° Ρ ΠΊΠΎΠ΄Π° Π½Π° ΠΏΡΠΈΡΡΠ°Π²ΠΊΠ°ΡΠ°. Π‘ΡΡΠΎ ΡΠ°ΠΊΠ° Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° ΠΈΠΌΠ°ΡΠ΅ ΡΠ°Π±Π»ΠΎΠ½ config.html ΠΈ ΠΊΠΎΠ½ΡΡΠΎΠ»Π΅Ρ ConfigCtrl, ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½Π°ΡΠ° ΡΡΡΠ°Π½ΠΈΡΠ° Π½Π° Π΅ΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ° Π½Π° ΠΈΠ·ΡΠΎΡΠ½ΠΈΠΊΠ° Π½Π° Π΄Π°Π½Π½ΠΈ ΠΈ ΠΊΠΎΠ½ΡΡΠΎΠ»Π΅Ρ Π½Π° ΠΈΠ·ΡΠΎΡΠ½ΠΈΠΊ Π½Π° Π΄Π°Π½Π½ΠΈ, ΠΊΠΎΠΉΡΠΎ ΠΏΡΠΈΠ»Π°Π³Π° Π»ΠΎΠ³ΠΈΠΊΠ°ΡΠ° Π½Π° Π²Π°ΡΠΈΡ ΠΈΠ·ΡΠΎΡΠ½ΠΈΠΊ Π½Π° Π΄Π°Π½Π½ΠΈ.
Π ΠΏΡΠΈΡΡΠ°Π²ΠΊΠ°ΡΠ° KubeGraf, ΠΎΡ Π³Π»Π΅Π΄Π½Π° ΡΠΎΡΠΊΠ° Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΠΊΠΈΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ, ΠΈΠ·ΡΠΎΡΠ½ΠΈΠΊΡΡ Π½Π° Π΄Π°Π½Π½ΠΈ Π΅ Π΅ΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡ Π½Π° ΠΊΠ»ΡΡΡΠ΅Ρ kubernetes, ΠΊΠΎΠΉΡΠΎ ΠΏΡΠΈΠ»Π°Π³Π° ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ (ΠΈΠ·Ρ
ΠΎΠ΄Π½ΠΈΡΡ ΠΊΠΎΠ΄ Π΅ Π½Π°Π»ΠΈΡΠ΅Π½
- ΠΈΠ·Π²Π»ΠΈΡΠ°Π½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ ΠΎΡ k8s api-ΡΡΡΠ²ΡΡ (ΠΏΠΎΠ»ΡΡΠ°Π²Π°Π½Π΅ Π½Π° ΡΠΏΠΈΡΡΠΊ Ρ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π° ΠΎΡ ΠΈΠΌΠ΅Π½Π°, Π²Π½Π΅Π΄ΡΡΠ²Π°Π½ΠΈΡ...)
- ΠΏΡΠΎΠΊΡΠΈ Π·Π°ΡΠ²ΠΊΠΈ ΠΊΡΠΌ prometheus-datasource (ΠΊΠΎΠΉΡΠΎ Π΅ ΠΈΠ·Π±ΡΠ°Π½ Π² Π½Π°ΡΡΡΠΎΠΉΠΊΠΈΡΠ΅ Π½Π° ΠΏΠ»ΡΠ³ΠΈΠ½Π° Π·Π° Π²ΡΠ΅ΠΊΠΈ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ΅Π½ ΠΊΠ»ΡΡΡΠ΅Ρ) ΠΈ ΡΠΎΡΠΌΠ°ΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΎΡΠ³ΠΎΠ²ΠΎΡΠΈΡΠ΅ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ ΠΊΠ°ΠΊΡΠΎ Π² ΡΡΠ°ΡΠΈΡΠ½ΠΈ ΡΡΡΠ°Π½ΠΈΡΠΈ, ΡΠ°ΠΊΠ° ΠΈ Π² ΡΠ°Π±Π»Π° Π·Π° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅.
- Π°ΠΊΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½Π΅ Π½Π° Π΄Π°Π½Π½ΠΈ Π½Π° ΡΡΠ°ΡΠΈΡΠ½ΠΈ ΡΡΡΠ°Π½ΠΈΡΠΈ Π½Π° ΠΏΠ»ΡΠ³ΠΈΠ½Π° (ΡΡΡ Π·Π°Π΄Π°Π΄Π΅Π½ΠΎ Π²ΡΠ΅ΠΌΠ΅ Π·Π° ΡΠ΅ΡΡΠΎΡΠ° Π½Π° ΠΎΠΏΡΠ΅ΡΠ½ΡΠ²Π°Π½Π΅).
- ΠΎΠ±ΡΠ°Π±ΠΎΡΠ²Π°Π½Π΅ Π½Π° Π·Π°ΡΠ²ΠΊΠΈ Π·Π° ΡΠΎΡΠΌΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ°Π±Π»ΠΎΠ½Π΅Π½ Π»ΠΈΡΡ Π² 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" (ΠΏΠΎΠ²Π΅ΡΠ΅ Π·Π°
/api/v8/ΠΈΠΌΠ΅Π½Π½ΠΈ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π° ΡΡΡ Π·Π°Π³Π»Π°Π²ΠΊΠ° Π£ΠΏΡΠ»Π½ΠΎΠΌΠΎΡΠ°Π²Π°Π½Π΅: ΠΠΎΡΠΈΡΠ΅Π» .
ΠΡΡΠ΅ΡΡΠ²Π΅Π½ΠΎ, Π·Π° Π΄Π° ΡΠ°Π±ΠΎΡΠΈΠΌ Ρ k8s api ΡΡΡΠ²ΡΡΠ°, ΡΠ΅ Π½ΡΠΆΠ΄Π°Π΅ΠΌ ΠΎΡ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π» Ρ Π΄ΠΎΡΡΡΠΏ ΡΠ°ΠΌΠΎ Π·Π° ΡΠ΅ΡΠ΅Π½Π΅, ΠΌΠ°Π½ΠΈΡΠ΅ΡΡΠΈΡΠ΅ Π·Π° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° ΠΊΠΎΠΈΡΠΎ ΡΡΡΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π½Π°ΠΌΠ΅ΡΠΈΡΠ΅ Π²
Π§Π°ΡΡ 5: ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π²Π°Π½Π΅
Π‘Π»Π΅Π΄ ΠΊΠ°ΡΠΎ Π½Π°ΠΏΠΈΡΠ΅ΡΠ΅ ΡΠ²ΠΎΠΉ ΡΠΎΠ±ΡΡΠ²Π΅Π½ ΠΏΠ»ΡΠ³ΠΈΠ½ Grafana, Π΅ΡΡΠ΅ΡΡΠ²Π΅Π½ΠΎ ΡΠ΅ ΠΈΡΠΊΠ°ΡΠ΅ Π΄Π° Π³ΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ ΠΏΡΠ±Π»ΠΈΡΠ½ΠΎ Π΄ΠΎΡΡΡΠΏΠ΅Π½. Π Grafana ΡΠΎΠ²Π° Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Ρ ΠΏΠ»ΡΠ³ΠΈΠ½ΠΈ, Π΄ΠΎΡΡΡΠΏΠ½Π° Π½Π° Π²ΡΡΠ·ΠΊΠ°ΡΠ°
ΠΠ° Π΄Π° Π±ΡΠ΄Π΅ Π²Π°ΡΠΈΡΡ ΠΏΠ»ΡΠ³ΠΈΠ½ Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π² ΠΎΡΠΈΡΠΈΠ°Π»Π½ΠΈΡ ΠΌΠ°Π³Π°Π·ΠΈΠ½, ΡΡΡΠ±Π²Π° Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ PR Π²
ΠΊΡΠ΄Π΅ΡΠΎ Π²Π΅ΡΡΠΈΡΡΠ° Π΅ Π²Π΅ΡΡΠΈΡΡΠ° Π½Π° Π²Π°ΡΠΈΡ ΠΏΠ»ΡΠ³ΠΈΠ½, url Π΅ Π²ΡΡΠ·ΠΊΠ° ΠΊΡΠΌ Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ, Π° commit Π΅ Ρ
Π΅ΡΡΡ Π½Π° Π°Π½Π³Π°ΠΆΠΈΠΌΠ΅Π½ΡΠ°, ΠΊΠΎΠΉΡΠΎ ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½Π°ΡΠ° Π²Π΅ΡΡΠΈΡ Π½Π° ΠΏΠ»ΡΠ³ΠΈΠ½Π° Π΄ΠΎΡΡΡΠΏΠ½Π°.
Π Π½Π° ΠΈΠ·Ρ ΠΎΠ΄Π° ΡΠ΅ Π²ΠΈΠ΄ΠΈΡΠ΅ ΠΏΡΠ΅ΠΊΡΠ°ΡΠ½Π° ΠΊΠ°ΡΡΠΈΠ½Π° Π½Π° ΡΠΎΡΠΌΠ°ΡΠ°:
ΠΠ°Π½Π½ΠΈΡΠ΅ Π·Π° Π½Π΅Π³ΠΎ ΡΠ΅ Π±ΡΠ΄Π°Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ ΠΎΠ³ΡΠ°Π±Π΅Π½ΠΈ ΠΎΡ Π²Π°ΡΠΈΡΠ΅ Readme.md, Changelog.md ΠΈ ΡΠ°ΠΉΠ»Π° plugin.json Ρ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ΡΠΎ Π½Π° ΠΏΡΠΈΡΡΠ°Π²ΠΊΠ°ΡΠ°.
Π§Π°ΡΡ 6: Π²ΠΌΠ΅ΡΡΠΎ Π·Π°ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ
ΠΠ΅ ΡΠΏΡΡΡ ΠΌΠ΅ Π΄Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ²Π°ΠΌΠ΅ Π½Π°ΡΠΈΡ ΠΏΠ»ΡΠ³ΠΈΠ½ ΡΠ»Π΅Π΄ ΠΏΡΡΠΊΠ°Π½Π΅ΡΠΎ. Π ΡΠ΅Π³Π° ΡΠ°Π±ΠΎΡΠΈΠΌ Π²ΡΡΡ Ρ ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΎΡΠΎ Π½Π°Π±Π»ΡΠ΄Π΅Π½ΠΈΠ΅ Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° ΡΠ΅ΡΡΡΡΠΈΡΠ΅ Π½Π° ΠΊΠ»ΡΡΡΠ΅ΡΠ½ΠΈΡΠ΅ Π²ΡΠ·Π»ΠΈ, Π²ΡΠ²Π΅ΠΆΠ΄Π°Π½Π΅ΡΠΎ Π½Π° Π½ΠΎΠ²ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Π·Π° ΠΏΠΎΠ΄ΠΎΠ±ΡΡΠ²Π°Π½Π΅ Π½Π° UX, Π° ΡΡΡΠΎ ΡΠ°ΠΊΠ° ΡΡΠ±ΠΈΡΠ°ΠΌΠ΅ Π³ΠΎΠ»ΡΠΌΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΎΠ±ΡΠ°ΡΠ½Π° Π²ΡΡΠ·ΠΊΠ°, ΠΏΠΎΠ»ΡΡΠ΅Π½Π° ΡΠ»Π΅Π΄ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΠΏΠ»ΡΠ³ΠΈΠ½Π° ΠΊΠ°ΠΊΡΠΎ ΠΎΡ Π½Π°ΡΠΈΡΠ΅ ΠΊΠ»ΠΈΠ΅Π½ΡΠΈ, ΡΠ°ΠΊΠ° ΠΈ ΠΎΡ ishshui Π² github (Π°ΠΊΠΎ ΠΎΡΡΠ°Π²ΠΈΡΠ΅ ΡΠ²ΠΎΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ ΠΈΠ»ΠΈ Π·Π°ΡΠ²ΠΊΠ° Π·Π° ΠΈΠ·ΡΠ΅Π³Π»ΡΠ½Π΅, ΡΠ΅ ΡΠ΅ ΡΠ°Π΄Π²Π°ΠΌ ΠΌΠ½ΠΎΠ³ΠΎ π).
ΠΠ°Π΄ΡΠ²Π°ΠΌΠ΅ ΡΠ΅, ΡΠ΅ ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ ΡΠ΅ Π²ΠΈ ΠΏΠΎΠΌΠΎΠ³Π½Π΅ Π΄Π° ΡΠ°Π·Π±Π΅ΡΠ΅ΡΠ΅ ΡΠ°ΠΊΡΠ² ΡΡΡΠ°Ρ ΠΎΡΠ΅Π½ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ ΠΊΠ°ΡΠΎ Grafana ΠΈ ΠΌΠΎΠΆΠ΅ Π±ΠΈ Π΄Π° Π½Π°ΠΏΠΈΡΠ΅ΡΠ΅ ΡΠ²ΠΎΠΉ ΡΠΎΠ±ΡΡΠ²Π΅Π½ ΠΏΠ»ΡΠ³ΠΈΠ½.
ΠΠ»Π°Π³ΠΎΠ΄Π°ΡΡ Π²ΠΈ!)
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com