ಗ್ರಾಫನಾಗಾಗಿ ಪ್ಲಗಿನ್‌ನ ಅಭಿವೃದ್ಧಿ: ದೊಡ್ಡ ಹೊಡೆತಗಳ ಇತಿಹಾಸ

ಎಲ್ಲರಿಗು ನಮಸ್ಖರ! ಕೆಲವು ತಿಂಗಳುಗಳ ಹಿಂದೆ, ನಾವು ನಮ್ಮ ಹೊಸ ಓಪನ್ ಸೋರ್ಸ್ ಪ್ರಾಜೆಕ್ಟ್ ಅನ್ನು ಉತ್ಪಾದನೆಗೆ ಪ್ರಾರಂಭಿಸಿದ್ದೇವೆ - ಕುಬರ್ನೆಟ್‌ಗಳನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಲು ಗ್ರಾಫನಾ ಪ್ಲಗಿನ್, ಇದನ್ನು ನಾವು ಕರೆಯುತ್ತೇವೆ DevOpsProdigy KubeGraf. ಪ್ಲಗಿನ್ ಮೂಲ ಕೋಡ್ ಇಲ್ಲಿ ಲಭ್ಯವಿದೆ GitHub ನಲ್ಲಿ ಸಾರ್ವಜನಿಕ ಭಂಡಾರ. ಮತ್ತು ಈ ಲೇಖನದಲ್ಲಿ ನಾವು ಪ್ಲಗಿನ್ ಅನ್ನು ಹೇಗೆ ರಚಿಸಿದ್ದೇವೆ, ನಾವು ಯಾವ ಸಾಧನಗಳನ್ನು ಬಳಸಿದ್ದೇವೆ ಮತ್ತು ಅಭಿವೃದ್ಧಿ ಪ್ರಕ್ರಿಯೆಯಲ್ಲಿ ನಾವು ಎದುರಿಸಿದ ಮೋಸಗಳ ಕಥೆಯನ್ನು ನಿಮ್ಮೊಂದಿಗೆ ಹಂಚಿಕೊಳ್ಳಲು ನಾವು ಬಯಸುತ್ತೇವೆ. ಹೋಗೋಣ!

ಭಾಗ 0 - ಪರಿಚಯಾತ್ಮಕ: ನಾವು ಈ ಹಂತಕ್ಕೆ ಹೇಗೆ ಬಂದೆವು?

ಗ್ರಾಫನ್‌ಗಾಗಿ ನಮ್ಮದೇ ಪ್ಲಗಿನ್ ಅನ್ನು ಬರೆಯುವ ಕಲ್ಪನೆಯು ಆಕಸ್ಮಿಕವಾಗಿ ನಮಗೆ ಬಂದಿತು. ನಮ್ಮ ಕಂಪನಿಯು 10 ವರ್ಷಗಳಿಗೂ ಹೆಚ್ಚು ಕಾಲ ಸಂಕೀರ್ಣತೆಯ ವಿವಿಧ ಹಂತಗಳ ವೆಬ್ ಪ್ರಾಜೆಕ್ಟ್‌ಗಳನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡುತ್ತಿದೆ. ಈ ಸಮಯದಲ್ಲಿ, ವಿವಿಧ ಮೇಲ್ವಿಚಾರಣಾ ವ್ಯವಸ್ಥೆಗಳನ್ನು ಬಳಸುವಲ್ಲಿ ನಾವು ಹೆಚ್ಚಿನ ಪ್ರಮಾಣದ ಪರಿಣತಿ, ಆಸಕ್ತಿದಾಯಕ ಪ್ರಕರಣಗಳು ಮತ್ತು ಅನುಭವವನ್ನು ಸಂಗ್ರಹಿಸಿದ್ದೇವೆ. ಮತ್ತು ಕೆಲವು ಹಂತದಲ್ಲಿ ನಾವು ನಮ್ಮನ್ನು ಕೇಳಿಕೊಂಡೆವು: “ಕುಬರ್ನೆಟ್‌ಗಳನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡಲು ಒಂದು ಮ್ಯಾಜಿಕ್ ಸಾಧನವಿದೆಯೇ, ಆದ್ದರಿಂದ ಅವರು ಹೇಳಿದಂತೆ, “ಅದನ್ನು ಹೊಂದಿಸಿ ಮತ್ತು ಅದನ್ನು ಮರೆತುಬಿಡಿ”?”.. k8 ಗಳನ್ನು ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡುವ ಉದ್ಯಮದ ಮಾನದಂಡವು ಬಹಳ ಹಿಂದಿನಿಂದಲೂ ಇದೆ. ಪ್ರಮೀತಿಯಸ್ + ಗ್ರಾಫನಾ ಸಂಯೋಜನೆ. ಮತ್ತು ಈ ಸ್ಟಾಕ್‌ಗೆ ಸಿದ್ಧ ಪರಿಹಾರಗಳಂತೆ, ವಿವಿಧ ರೀತಿಯ ಪರಿಕರಗಳ ದೊಡ್ಡ ಸೆಟ್ ಇದೆ: ಪ್ರಮೀತಿಯಸ್-ಆಪರೇಟರ್, ಕುಬರ್ನೆಟ್ಸ್-ಮಿಕ್ಸಿನ್ ಡ್ಯಾಶ್‌ಬೋರ್ಡ್‌ಗಳ ಸೆಟ್, ಗ್ರಾಫನಾ-ಕುಬರ್ನೆಟ್ಸ್-ಅಪ್ಲಿಕೇಶನ್.

Grafana-kubernetes-app ಪ್ಲಗಿನ್ ನಮಗೆ ಅತ್ಯಂತ ಆಸಕ್ತಿದಾಯಕ ಆಯ್ಕೆಯಾಗಿದೆ ಎಂದು ತೋರುತ್ತದೆ, ಆದರೆ ಇದು ಒಂದು ವರ್ಷಕ್ಕೂ ಹೆಚ್ಚು ಕಾಲ ಬೆಂಬಲಿತವಾಗಿಲ್ಲ ಮತ್ತು ಹೆಚ್ಚುವರಿಯಾಗಿ, node-exporter ಮತ್ತು kube-state-metrics ನ ಹೊಸ ಆವೃತ್ತಿಗಳೊಂದಿಗೆ ಕೆಲಸ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ. ಮತ್ತು ಕೆಲವು ಹಂತದಲ್ಲಿ ನಾವು ನಿರ್ಧರಿಸಿದ್ದೇವೆ: "ನಾವು ನಮ್ಮ ಸ್ವಂತ ನಿರ್ಧಾರವನ್ನು ತೆಗೆದುಕೊಳ್ಳಬಾರದು?"

ನಮ್ಮ ಪ್ಲಗಿನ್‌ನಲ್ಲಿ ನಾವು ಯಾವ ಆಲೋಚನೆಗಳನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸಲು ನಿರ್ಧರಿಸಿದ್ದೇವೆ:

  • "ಅಪ್ಲಿಕೇಶನ್ ಮ್ಯಾಪ್" ನ ದೃಶ್ಯೀಕರಣ: ಕ್ಲಸ್ಟರ್‌ನಲ್ಲಿನ ಅಪ್ಲಿಕೇಶನ್‌ಗಳ ಅನುಕೂಲಕರ ಪ್ರಸ್ತುತಿ, ನೇಮ್‌ಸ್ಪೇಸ್‌ಗಳಿಂದ ಗುಂಪು ಮಾಡಲಾಗಿದೆ, ನಿಯೋಜನೆಗಳು...;
  • “ನಿಯೋಜನೆ - ಸೇವೆ (+ಪೋರ್ಟ್‌ಗಳು)” ನಂತಹ ಸಂಪರ್ಕಗಳ ದೃಶ್ಯೀಕರಣ.
  • ಕ್ಲಸ್ಟರ್ ನೋಡ್‌ಗಳಾದ್ಯಂತ ಕ್ಲಸ್ಟರ್ ಅಪ್ಲಿಕೇಶನ್‌ಗಳ ವಿತರಣೆಯ ದೃಶ್ಯೀಕರಣ.
  • ಹಲವಾರು ಮೂಲಗಳಿಂದ ಮಾಪನಗಳು ಮತ್ತು ಮಾಹಿತಿಯ ಸಂಗ್ರಹ: ಪ್ರಮೀತಿಯಸ್ ಮತ್ತು k8s api ಸರ್ವರ್.
  • ಮೂಲಸೌಕರ್ಯ ಭಾಗ (ಸಿಪಿಯು ಸಮಯ, ಮೆಮೊರಿ, ಡಿಸ್ಕ್ ಸಬ್‌ಸಿಸ್ಟಮ್, ನೆಟ್‌ವರ್ಕ್ ಬಳಕೆ) ಮತ್ತು ಅಪ್ಲಿಕೇಶನ್ ಲಾಜಿಕ್ ಎರಡರ ಮೇಲ್ವಿಚಾರಣೆ - ಆರೋಗ್ಯ-ಸ್ಥಿತಿ ಪಾಡ್‌ಗಳು, ಲಭ್ಯವಿರುವ ಪ್ರತಿಕೃತಿಗಳ ಸಂಖ್ಯೆ, ಜೀವಂತತೆ/ಸಿದ್ಧತೆಯ ಪರೀಕ್ಷೆಗಳನ್ನು ಹಾದುಹೋಗುವ ಬಗ್ಗೆ ಮಾಹಿತಿ.

ಭಾಗ 1: "ಗ್ರಾಫನಾ ಪ್ಲಗಿನ್" ಎಂದರೇನು?

ತಾಂತ್ರಿಕ ದೃಷ್ಟಿಕೋನದಿಂದ, ಗ್ರಾಫಾನಾಗೆ ಪ್ಲಗಿನ್ ಕೋನೀಯ ನಿಯಂತ್ರಕವಾಗಿದೆ, ಇದನ್ನು ಗ್ರಾಫಾನಾ ಡೇಟಾ ಡೈರೆಕ್ಟರಿಯಲ್ಲಿ ಸಂಗ್ರಹಿಸಲಾಗಿದೆ (/var/grafana/plugins/ /dist/module.js) ಮತ್ತು SystemJS ಮಾಡ್ಯೂಲ್ ಆಗಿ ಲೋಡ್ ಮಾಡಬಹುದು. ಈ ಡೈರೆಕ್ಟರಿಯಲ್ಲಿ ನಿಮ್ಮ ಪ್ಲಗಿನ್ ಬಗ್ಗೆ ಎಲ್ಲಾ ಮೆಟಾ ಮಾಹಿತಿಯನ್ನು ಒಳಗೊಂಡಿರುವ plugin.json ಫೈಲ್ ಇರಬೇಕು: ಹೆಸರು, ಆವೃತ್ತಿ, ಪ್ಲಗಿನ್ ಪ್ರಕಾರ, ರೆಪೊಸಿಟರಿ/ಸೈಟ್/ಪರವಾನಗಿಗೆ ಲಿಂಕ್‌ಗಳು, ಅವಲಂಬನೆಗಳು, ಇತ್ಯಾದಿ.

ಗ್ರಾಫನಾಗಾಗಿ ಪ್ಲಗಿನ್‌ನ ಅಭಿವೃದ್ಧಿ: ದೊಡ್ಡ ಹೊಡೆತಗಳ ಇತಿಹಾಸ
module.ts

ಗ್ರಾಫನಾಗಾಗಿ ಪ್ಲಗಿನ್‌ನ ಅಭಿವೃದ್ಧಿ: ದೊಡ್ಡ ಹೊಡೆತಗಳ ಇತಿಹಾಸ
plugin.json

ನೀವು ಸ್ಕ್ರೀನ್‌ಶಾಟ್‌ನಲ್ಲಿ ನೋಡುವಂತೆ, ನಾವು plugin.type = ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸಿದ್ದೇವೆ. ಏಕೆಂದರೆ ಗ್ರಾಫಾನಾ ಪ್ಲಗಿನ್‌ಗಳು ಮೂರು ವಿಧಗಳಾಗಿರಬಹುದು:

ಫಲಕ: ಅತ್ಯಂತ ಸಾಮಾನ್ಯ ರೀತಿಯ ಪ್ಲಗಿನ್ - ಇದು ಯಾವುದೇ ಮೆಟ್ರಿಕ್‌ಗಳನ್ನು ದೃಶ್ಯೀಕರಿಸುವ ಫಲಕವಾಗಿದೆ, ಇದನ್ನು ವಿವಿಧ ಡ್ಯಾಶ್‌ಬೋರ್ಡ್‌ಗಳನ್ನು ನಿರ್ಮಿಸಲು ಬಳಸಲಾಗುತ್ತದೆ.
ಡೇಟಾಸೋರ್ಸ್: ಕೆಲವು ಡೇಟಾ ಮೂಲಕ್ಕೆ ಪ್ಲಗಿನ್ ಕನೆಕ್ಟರ್ (ಉದಾಹರಣೆಗೆ, Prometheus-datasource, ClickHouse-datasource, ElasticSearch-datasource).
ಅಪ್ಲಿಕೇಶನ್: ಗ್ರಾಫನಾ ಒಳಗೆ ನಿಮ್ಮದೇ ಆದ ಮುಂಭಾಗದ ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ನಿರ್ಮಿಸಲು, ನಿಮ್ಮ ಸ್ವಂತ html ಪುಟಗಳನ್ನು ರಚಿಸಲು ಮತ್ತು ವಿವಿಧ ಡೇಟಾವನ್ನು ದೃಶ್ಯೀಕರಿಸಲು ಡೇಟಾಮೂಲವನ್ನು ಹಸ್ತಚಾಲಿತವಾಗಿ ಪ್ರವೇಶಿಸಲು ನಿಮಗೆ ಅನುಮತಿಸುವ ಪ್ಲಗಿನ್. ಅಲ್ಲದೆ, ಇತರ ಪ್ರಕಾರಗಳ ಪ್ಲಗಿನ್‌ಗಳು (ಡೇಟಾಸೋರ್ಸ್, ಪ್ಯಾನಲ್) ಮತ್ತು ವಿವಿಧ ಡ್ಯಾಶ್‌ಬೋರ್ಡ್‌ಗಳನ್ನು ಅವಲಂಬನೆಗಳಾಗಿ ಬಳಸಬಹುದು.

ಗ್ರಾಫನಾಗಾಗಿ ಪ್ಲಗಿನ್‌ನ ಅಭಿವೃದ್ಧಿ: ದೊಡ್ಡ ಹೊಡೆತಗಳ ಇತಿಹಾಸ
ಮಾದರಿ=ಅಪ್ಲಿಕೇಶನ್‌ನೊಂದಿಗೆ ಉದಾಹರಣೆ ಪ್ಲಗಿನ್ ಅವಲಂಬನೆಗಳು.

ನೀವು ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ ಮತ್ತು ಟೈಪ್‌ಸ್ಕ್ರಿಪ್ಟ್ ಎರಡನ್ನೂ ಪ್ರೋಗ್ರಾಮಿಂಗ್ ಭಾಷೆಯಾಗಿ ಬಳಸಬಹುದು (ನಾವು ಅದನ್ನು ಆರಿಸಿದ್ದೇವೆ). ನೀವು ಮಾಡಬಹುದಾದ ಯಾವುದೇ ಪ್ರಕಾರದ ಹಲೋ-ವರ್ಲ್ಡ್ ಪ್ಲಗಿನ್‌ಗಳಿಗಾಗಿ ಸಿದ್ಧತೆಗಳು ಲಿಂಕ್ ಅನ್ನು ಹುಡುಕಿ: ಈ ರೆಪೊಸಿಟರಿಯು ಪೂರ್ವ-ಸ್ಥಾಪಿತ ಮತ್ತು ಕಾನ್ಫಿಗರ್ ಮಾಡಿದ ಬಿಲ್ಡರ್‌ಗಳೊಂದಿಗೆ ಹೆಚ್ಚಿನ ಸಂಖ್ಯೆಯ ಸ್ಟಾರ್ಟರ್-ಪ್ಯಾಕ್‌ಗಳನ್ನು ಒಳಗೊಂಡಿದೆ (ರಿಯಾಕ್ಟ್‌ನಲ್ಲಿ ಪ್ಲಗಿನ್‌ನ ಪ್ರಾಯೋಗಿಕ ಉದಾಹರಣೆಯೂ ಇದೆ).

ಭಾಗ 2: ಸ್ಥಳೀಯ ಪರಿಸರವನ್ನು ಸಿದ್ಧಪಡಿಸುವುದು

ಪ್ಲಗಿನ್‌ನಲ್ಲಿ ಕೆಲಸ ಮಾಡಲು, ನಮಗೆ ಸ್ವಾಭಾವಿಕವಾಗಿ ಎಲ್ಲಾ ಪೂರ್ವಸ್ಥಾಪಿತ ಸಾಧನಗಳೊಂದಿಗೆ ಕ್ಯುಬರ್ನೆಟ್ ಕ್ಲಸ್ಟರ್ ಅಗತ್ಯವಿದೆ: ಪ್ರಮೀತಿಯಸ್, ನೋಡ್-ರಫ್ತುದಾರ, ಕ್ಯೂಬ್-ಸ್ಟೇಟ್-ಮೆಟ್ರಿಕ್ಸ್, ಗ್ರಾಫನಾ. ಪರಿಸರವನ್ನು ತ್ವರಿತವಾಗಿ, ಸುಲಭವಾಗಿ ಮತ್ತು ನೈಸರ್ಗಿಕವಾಗಿ ಹೊಂದಿಸಬೇಕು ಮತ್ತು ಹಾಟ್-ರೀಲೋಡ್ ಅನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಲು, ಗ್ರಾಫನಾ ಡೇಟಾ ಡೈರೆಕ್ಟರಿಯನ್ನು ಡೆವಲಪರ್‌ನ ಯಂತ್ರದಿಂದ ನೇರವಾಗಿ ಜೋಡಿಸಬೇಕು.

ನಮ್ಮ ಅಭಿಪ್ರಾಯದಲ್ಲಿ, ಕುಬರ್ನೆಟ್ಗಳೊಂದಿಗೆ ಸ್ಥಳೀಯವಾಗಿ ಕೆಲಸ ಮಾಡುವುದು ಅತ್ಯಂತ ಅನುಕೂಲಕರ ಮಾರ್ಗವಾಗಿದೆ ಮಿನಿಕ್ಯೂಬ್. ಪ್ರಮೀತಿಯಸ್-ಆಪರೇಟರ್ ಅನ್ನು ಬಳಸಿಕೊಂಡು ಪ್ರಮೀತಿಯಸ್ + ಗ್ರಾಫನಾ ಸಂಯೋಜನೆಯನ್ನು ಸ್ಥಾಪಿಸುವುದು ಮುಂದಿನ ಹಂತವಾಗಿದೆ. IN ಈ ಲೇಖನ ಮಿನಿಕ್ಯೂಬ್‌ನಲ್ಲಿ ಪ್ರಮೀತಿಯಸ್-ಆಪರೇಟರ್ ಅನ್ನು ಸ್ಥಾಪಿಸುವ ಪ್ರಕ್ರಿಯೆಯನ್ನು ವಿವರವಾಗಿ ವಿವರಿಸಲಾಗಿದೆ. ನಿರಂತರತೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲು, ನೀವು ಪ್ಯಾರಾಮೀಟರ್ ಅನ್ನು ಹೊಂದಿಸಬೇಕು ನಿರಂತರತೆ: ನಿಜ charts/grafana/values.yaml ಫೈಲ್‌ನಲ್ಲಿ, ನಿಮ್ಮ ಸ್ವಂತ PV ಮತ್ತು PVC ಅನ್ನು ಸೇರಿಸಿ ಮತ್ತು ಅವುಗಳನ್ನು persistence.existingClaim ಪ್ಯಾರಾಮೀಟರ್‌ನಲ್ಲಿ ನಿರ್ದಿಷ್ಟಪಡಿಸಿ

ನಮ್ಮ ಅಂತಿಮ ಮಿನಿಕ್ಯೂಬ್ ಲಾಂಚ್ ಸ್ಕ್ರಿಪ್ಟ್ ಈ ರೀತಿ ಕಾಣುತ್ತದೆ:

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: ನಿಜವಾದ ಅಭಿವೃದ್ಧಿ

ವಸ್ತು ಮಾದರಿ

ಪ್ಲಗಿನ್ ಅನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸುವ ತಯಾರಿಯಲ್ಲಿ, ನಾವು ಟೈಪ್‌ಸ್ಕ್ರಿಪ್ಟ್ ತರಗತಿಗಳ ರೂಪದಲ್ಲಿ ಕೆಲಸ ಮಾಡುವ ಎಲ್ಲಾ ಮೂಲಭೂತ ಕುಬರ್ನೆಟ್ ಘಟಕಗಳನ್ನು ವಿವರಿಸಲು ನಿರ್ಧರಿಸಿದ್ದೇವೆ: ಪಾಡ್, ನಿಯೋಜನೆ, ಡೇಮನ್‌ಸೆಟ್, ಸ್ಟೇಟ್‌ಫುಲ್‌ಸೆಟ್, ಕೆಲಸ, ಕ್ರೋನ್‌ಜಾಬ್, ಸೇವೆ, ನೋಡ್, ನೇಮ್‌ಸ್ಪೇಸ್. ಈ ಪ್ರತಿಯೊಂದು ವರ್ಗಗಳು ಸಾಮಾನ್ಯ ಬೇಸ್‌ಮಾಡೆಲ್ ವರ್ಗದಿಂದ ಆನುವಂಶಿಕವಾಗಿ ಪಡೆಯುತ್ತವೆ, ಇದು ಕನ್‌ಸ್ಟ್ರಕ್ಟರ್, ಡಿಸ್ಟ್ರಕ್ಟರ್, ಗೋಚರತೆಯನ್ನು ನವೀಕರಿಸುವ ಮತ್ತು ಬದಲಾಯಿಸುವ ವಿಧಾನಗಳನ್ನು ವಿವರಿಸುತ್ತದೆ. ಪ್ರತಿಯೊಂದು ತರಗತಿಗಳು ಇತರ ಘಟಕಗಳೊಂದಿಗೆ ನೆಸ್ಟೆಡ್ ಸಂಬಂಧಗಳನ್ನು ವಿವರಿಸುತ್ತದೆ, ಉದಾಹರಣೆಗೆ, ಪ್ರಕಾರದ ನಿಯೋಜನೆಯ ಘಟಕಕ್ಕಾಗಿ ಪಾಡ್‌ಗಳ ಪಟ್ಟಿ.

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

ಗೆಟ್ಟರ್‌ಗಳು ಮತ್ತು ಸೆಟ್ಟರ್‌ಗಳ ಸಹಾಯದಿಂದ, ನಮಗೆ ಅಗತ್ಯವಿರುವ ಘಟಕದ ಮೆಟ್ರಿಕ್‌ಗಳನ್ನು ನಾವು ಅನುಕೂಲಕರ ಮತ್ತು ಓದಬಹುದಾದ ರೂಪದಲ್ಲಿ ಪ್ರದರ್ಶಿಸಬಹುದು ಅಥವಾ ಹೊಂದಿಸಬಹುದು. ಉದಾಹರಣೆಗೆ, ಹಂಚಿಕೆ ಮಾಡಬಹುದಾದ cpu ನೋಡ್‌ಗಳ ಫಾರ್ಮ್ಯಾಟ್ ಮಾಡಿದ ಔಟ್‌ಪುಟ್:

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

ಪುಟಗಳು

ನಮ್ಮ ಎಲ್ಲಾ ಪ್ಲಗಿನ್ ಪುಟಗಳ ಪಟ್ಟಿಯನ್ನು ಆರಂಭದಲ್ಲಿ ನಮ್ಮ pluing.json ನಲ್ಲಿ ಅವಲಂಬನೆಗಳ ವಿಭಾಗದಲ್ಲಿ ವಿವರಿಸಲಾಗಿದೆ:

ಗ್ರಾಫನಾಗಾಗಿ ಪ್ಲಗಿನ್‌ನ ಅಭಿವೃದ್ಧಿ: ದೊಡ್ಡ ಹೊಡೆತಗಳ ಇತಿಹಾಸ

ಪ್ರತಿ ಪುಟದ ಬ್ಲಾಕ್‌ನಲ್ಲಿ ನಾವು PAGE NAME ಅನ್ನು ಸೂಚಿಸಬೇಕು (ನಂತರ ಅದನ್ನು ಸ್ಲಗ್ ಆಗಿ ಪರಿವರ್ತಿಸಲಾಗುತ್ತದೆ ಅದರ ಮೂಲಕ ಈ ಪುಟವನ್ನು ಪ್ರವೇಶಿಸಬಹುದು); ಈ ಪುಟದ ಕಾರ್ಯಾಚರಣೆಗೆ ಜವಾಬ್ದಾರರಾಗಿರುವ ಘಟಕದ ಹೆಸರು (ಘಟಕಗಳ ಪಟ್ಟಿಯನ್ನು module.ts ಗೆ ರಫ್ತು ಮಾಡಲಾಗುತ್ತದೆ); ಈ ಪುಟದೊಂದಿಗೆ ಕೆಲಸ ಮಾಡುವ ಬಳಕೆದಾರ ಪಾತ್ರವು ಲಭ್ಯವಿದೆ ಮತ್ತು ಸೈಡ್‌ಬಾರ್‌ಗಾಗಿ ನ್ಯಾವಿಗೇಷನ್ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ಸೂಚಿಸುತ್ತದೆ.

ಪುಟದ ಕಾರ್ಯಾಚರಣೆಗೆ ಜವಾಬ್ದಾರರಾಗಿರುವ ಘಟಕದಲ್ಲಿ, ನಾವು templateUrl ಅನ್ನು ಹೊಂದಿಸಬೇಕು, ಮಾರ್ಕ್ಅಪ್ನೊಂದಿಗೆ html ಫೈಲ್ಗೆ ಮಾರ್ಗವನ್ನು ಹಾದುಹೋಗಬೇಕು. ನಿಯಂತ್ರಕದ ಒಳಗೆ, ಅವಲಂಬನೆ ಇಂಜೆಕ್ಷನ್ ಮೂಲಕ, ನಾವು 2 ಪ್ರಮುಖ ಕೋನೀಯ ಸೇವೆಗಳನ್ನು ಪ್ರವೇಶಿಸಬಹುದು:

  • backendSrv - ಗ್ರಾಫನಾ API ಸರ್ವರ್‌ನೊಂದಿಗೆ ಸಂವಹನವನ್ನು ಒದಗಿಸುವ ಸೇವೆ;
  • datasourceSrv - ನಿಮ್ಮ ಗ್ರಾಫನಾದಲ್ಲಿ ಸ್ಥಾಪಿಸಲಾದ ಎಲ್ಲಾ ಡೇಟಾಮೂಲಗಳೊಂದಿಗೆ ಸ್ಥಳೀಯ ಸಂವಹನವನ್ನು ಒದಗಿಸುವ ಸೇವೆ (ಉದಾಹರಣೆಗೆ, .getAll() ವಿಧಾನ - ಎಲ್ಲಾ ಸ್ಥಾಪಿಸಲಾದ ಡೇಟಾಸೋರ್ಸ್‌ಗಳ ಪಟ್ಟಿಯನ್ನು ಹಿಂತಿರುಗಿಸುತ್ತದೆ; .get( ) - ನಿರ್ದಿಷ್ಟ ಡೇಟಾಸೋರ್ಸ್‌ನ ನಿದರ್ಶನ ವಸ್ತುವನ್ನು ಹಿಂತಿರುಗಿಸುತ್ತದೆ.

ಗ್ರಾಫನಾಗಾಗಿ ಪ್ಲಗಿನ್‌ನ ಅಭಿವೃದ್ಧಿ: ದೊಡ್ಡ ಹೊಡೆತಗಳ ಇತಿಹಾಸ

ಗ್ರಾಫನಾಗಾಗಿ ಪ್ಲಗಿನ್‌ನ ಅಭಿವೃದ್ಧಿ: ದೊಡ್ಡ ಹೊಡೆತಗಳ ಇತಿಹಾಸ

ಗ್ರಾಫನಾಗಾಗಿ ಪ್ಲಗಿನ್‌ನ ಅಭಿವೃದ್ಧಿ: ದೊಡ್ಡ ಹೊಡೆತಗಳ ಇತಿಹಾಸ

ಭಾಗ 4: ಡೇಟಾ ಮೂಲ

ಗ್ರಾಫನಾದ ದೃಷ್ಟಿಕೋನದಿಂದ, ಡೇಟಾಸೋರ್ಸ್ ಎಲ್ಲಾ ಇತರರಂತೆಯೇ ಒಂದೇ ಪ್ಲಗಿನ್ ಆಗಿದೆ: ಇದು ತನ್ನದೇ ಆದ ಪ್ರವೇಶ ಬಿಂದು module.js ಅನ್ನು ಹೊಂದಿದೆ, ಮೆಟಾ ಮಾಹಿತಿ plugin.json ಜೊತೆಗೆ ಫೈಲ್ ಇದೆ. ಟೈಪ್ = ಅಪ್ಲಿಕೇಶನ್‌ನೊಂದಿಗೆ ಪ್ಲಗ್‌ಇನ್ ಅನ್ನು ಅಭಿವೃದ್ಧಿಪಡಿಸುವಾಗ, ನಾವು ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ ಡೇಟಾಸೋರ್ಸ್‌ಗಳೊಂದಿಗೆ (ಉದಾಹರಣೆಗೆ, ಪ್ರೊಮೆಥಿಯಸ್-ಡೇಟಾಸೋರ್ಸ್) ಮತ್ತು ನಮ್ಮದೇ ಆದ ಎರಡರೊಂದಿಗೂ ಸಂವಹನ ನಡೆಸಬಹುದು, ಅದನ್ನು ನಾವು ನೇರವಾಗಿ ಪ್ಲಗಿನ್ ಡೈರೆಕ್ಟರಿಯಲ್ಲಿ (ಡಿಸ್ಟ್/ಡೇಟಾಸೋರ್ಸ್/*) ಸಂಗ್ರಹಿಸಬಹುದು ಅಥವಾ ಅವಲಂಬನೆಯಾಗಿ ಸ್ಥಾಪಿಸಬಹುದು. ನಮ್ಮ ಸಂದರ್ಭದಲ್ಲಿ, ಡೇಟಾ ಮೂಲವು ಪ್ಲಗಿನ್ ಕೋಡ್‌ನೊಂದಿಗೆ ಬರುತ್ತದೆ. config.html ಟೆಂಪ್ಲೇಟ್ ಮತ್ತು ConfigCtrl ನಿಯಂತ್ರಕವನ್ನು ಹೊಂದಿರುವುದು ಸಹ ಅಗತ್ಯವಾಗಿದೆ, ಇದನ್ನು ಡೇಟಾಸೋರ್ಸ್ ನಿದರ್ಶನ ಕಾನ್ಫಿಗರೇಶನ್ ಪುಟಕ್ಕಾಗಿ ಬಳಸಲಾಗುತ್ತದೆ ಮತ್ತು ನಿಮ್ಮ ಡೇಟಾಸೋರ್ಸ್‌ನ ತರ್ಕವನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸುವ ಡೇಟಾಸೋರ್ಸ್ ನಿಯಂತ್ರಕಕ್ಕಾಗಿ ಬಳಸಲಾಗುತ್ತದೆ.

KubeGraf ಪ್ಲಗಿನ್‌ನಲ್ಲಿ, ಬಳಕೆದಾರ ಇಂಟರ್ಫೇಸ್ ದೃಷ್ಟಿಕೋನದಿಂದ, ಡೇಟಾ ಮೂಲವು ಕೆಳಗಿನ ಸಾಮರ್ಥ್ಯಗಳನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸುವ ಕುಬರ್ನೆಟ್ಸ್ ಕ್ಲಸ್ಟರ್‌ನ ಉದಾಹರಣೆಯಾಗಿದೆ (ಮೂಲ ಕೋಡ್ ಲಭ್ಯವಿದೆ ಲಿಂಕ್):

  • k8s api-ಸರ್ವರ್‌ನಿಂದ ಡೇಟಾವನ್ನು ಸಂಗ್ರಹಿಸುವುದು (ನೇಮ್‌ಸ್ಪೇಸ್‌ಗಳ ಪಟ್ಟಿಯನ್ನು ಪಡೆಯುವುದು, ನಿಯೋಜನೆಗಳು...)
  • ಪ್ರೋಮಿಥಿಯಸ್-ಡೇಟಾಸೋರ್ಸ್‌ಗೆ ಪ್ರಾಕ್ಸಿಯಿಂಗ್ ವಿನಂತಿಗಳು (ಪ್ರತಿ ನಿರ್ದಿಷ್ಟ ಕ್ಲಸ್ಟರ್‌ಗೆ ಪ್ಲಗಿನ್ ಸೆಟ್ಟಿಂಗ್‌ಗಳಲ್ಲಿ ಆಯ್ಕೆಮಾಡಲಾಗಿದೆ) ಮತ್ತು ಸ್ಥಿರ ಪುಟಗಳಲ್ಲಿ ಮತ್ತು ಡ್ಯಾಶ್‌ಬೋರ್ಡ್‌ಗಳಲ್ಲಿ ಡೇಟಾವನ್ನು ಬಳಸಲು ಪ್ರತಿಕ್ರಿಯೆಗಳನ್ನು ಫಾರ್ಮ್ಯಾಟ್ ಮಾಡುವುದು.
  • ಸ್ಥಿರ ಪ್ಲಗಿನ್ ಪುಟಗಳಲ್ಲಿ ಡೇಟಾವನ್ನು ನವೀಕರಿಸಲಾಗುತ್ತಿದೆ (ಸೆಟ್ ರಿಫ್ರೆಶ್ ದರದೊಂದಿಗೆ).
  • ಗ್ರಾಫನಾ-ಡ್ಯಾಶ್‌ಬೋರ್ಡ್‌ಗಳಲ್ಲಿ ಟೆಂಪ್ಲೇಟ್ ಹಾಳೆಯನ್ನು ರಚಿಸಲು ಪ್ರಶ್ನೆಗಳನ್ನು ಪ್ರಕ್ರಿಯೆಗೊಳಿಸುವುದು (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"};
       })
}

ಒಂದು ಪ್ರತ್ಯೇಕ ಆಸಕ್ತಿದಾಯಕ ಅಂಶವೆಂದರೆ, ನಮ್ಮ ಅಭಿಪ್ರಾಯದಲ್ಲಿ, ಡೇಟಾಸೋರ್ಸ್‌ಗಾಗಿ ದೃಢೀಕರಣ ಮತ್ತು ದೃಢೀಕರಣ ಕಾರ್ಯವಿಧಾನದ ಅನುಷ್ಠಾನವಾಗಿದೆ. ವಿಶಿಷ್ಟವಾಗಿ, ಬಾಕ್ಸ್‌ನ ಹೊರಗೆ, ಅಂತಿಮ ಡೇಟಾ ಮೂಲಕ್ಕೆ ಪ್ರವೇಶವನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡಲು ನಾವು ಅಂತರ್ನಿರ್ಮಿತ ಗ್ರಾಫನಾ ಘಟಕ ಡೇಟಾಮೂಲHttpSettings ಅನ್ನು ಬಳಸಬಹುದು. ಈ ಘಟಕವನ್ನು ಬಳಸಿಕೊಂಡು, ನಾವು url ಮತ್ತು ಮೂಲಭೂತ ದೃಢೀಕರಣ/ಅಧಿಕೃತ ಸೆಟ್ಟಿಂಗ್‌ಗಳನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸುವ ಮೂಲಕ http ಡೇಟಾ ಮೂಲಕ್ಕೆ ಪ್ರವೇಶವನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡಬಹುದು: ಲಾಗಿನ್-ಪಾಸ್‌ವರ್ಡ್, ಅಥವಾ ಕ್ಲೈಂಟ್-ಸರ್ಟ್/ಕ್ಲೈಂಟ್-ಕೀ. ಬೇರರ್ ಟೋಕನ್ (k8s ಗಾಗಿ ವಾಸ್ತವಿಕ ಮಾನದಂಡ) ಬಳಸಿಕೊಂಡು ಪ್ರವೇಶವನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡುವ ಸಾಮರ್ಥ್ಯವನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸಲು, ನಾವು ಸ್ವಲ್ಪ ಟ್ವೀಕಿಂಗ್ ಮಾಡಬೇಕಾಗಿತ್ತು.

ಈ ಸಮಸ್ಯೆಯನ್ನು ಪರಿಹರಿಸಲು, ನೀವು ಅಂತರ್ನಿರ್ಮಿತ ಗ್ರಾಫನಾ "ಪ್ಲಗಿನ್ ಮಾರ್ಗಗಳು" ಕಾರ್ಯವಿಧಾನವನ್ನು ಬಳಸಬಹುದು (ಹೆಚ್ಚಿನ ವಿವರಗಳು ಇಲ್ಲಿ ಅಧಿಕೃತ ದಸ್ತಾವೇಜನ್ನು ಪುಟ) ನಮ್ಮ ಡೇಟಾಸೋರ್ಸ್‌ನ ಸೆಟ್ಟಿಂಗ್‌ಗಳಲ್ಲಿ, ಗ್ರಾಫನಾ ಪ್ರಾಕ್ಸಿ ಸರ್ವರ್‌ನಿಂದ ಪ್ರಕ್ರಿಯೆಗೊಳಿಸಲಾಗುವ ರೂಟಿಂಗ್ ನಿಯಮಗಳ ಗುಂಪನ್ನು ನಾವು ಘೋಷಿಸಬಹುದು. ಉದಾಹರಣೆಗೆ, ಪ್ರತಿಯೊಂದು ಅಂತಿಮ ಬಿಂದುವಿಗೆ ಟೆಂಪ್ಲೇಟಿಂಗ್‌ನ ಸಾಧ್ಯತೆಯೊಂದಿಗೆ ಹೆಡರ್‌ಗಳು ಅಥವಾ url ಗಳನ್ನು ಹೊಂದಿಸಲು ಸಾಧ್ಯವಿದೆ, ಇದಕ್ಕಾಗಿ ಡೇಟಾವನ್ನು jsonData ಮತ್ತು SecurityJsonData ಕ್ಷೇತ್ರಗಳಿಂದ ತೆಗೆದುಕೊಳ್ಳಬಹುದು (ಎನ್‌ಕ್ರಿಪ್ಟ್ ಮಾಡಿದ ರೂಪದಲ್ಲಿ ಪಾಸ್‌ವರ್ಡ್‌ಗಳು ಅಥವಾ ಟೋಕನ್‌ಗಳನ್ನು ಸಂಗ್ರಹಿಸಲು). ನಮ್ಮ ಉದಾಹರಣೆಯಲ್ಲಿ, ಪ್ರಶ್ನೆಗಳು /__proxy/api/v1/namespaces ಫಾರ್ಮ್‌ನ url ಗೆ ಪ್ರಾಕ್ಸಿ ಮಾಡಲಾಗುವುದು
ದೃಢೀಕರಣದೊಂದಿಗೆ /api/v8/namespaces: ಬೇರರ್ ಹೆಡರ್.

ಗ್ರಾಫನಾಗಾಗಿ ಪ್ಲಗಿನ್‌ನ ಅಭಿವೃದ್ಧಿ: ದೊಡ್ಡ ಹೊಡೆತಗಳ ಇತಿಹಾಸ

ಗ್ರಾಫನಾಗಾಗಿ ಪ್ಲಗಿನ್‌ನ ಅಭಿವೃದ್ಧಿ: ದೊಡ್ಡ ಹೊಡೆತಗಳ ಇತಿಹಾಸ

ಸ್ವಾಭಾವಿಕವಾಗಿ, k8s api ಸರ್ವರ್‌ನೊಂದಿಗೆ ಕೆಲಸ ಮಾಡಲು ನಮಗೆ ಓದಲು ಮಾತ್ರ ಪ್ರವೇಶವನ್ನು ಹೊಂದಿರುವ ಬಳಕೆದಾರರ ಅಗತ್ಯವಿದೆ, ಅದನ್ನು ರಚಿಸಲು ಮ್ಯಾನಿಫೆಸ್ಟ್‌ಗಳನ್ನು ನೀವು ಕಾಣಬಹುದು ಪ್ಲಗಿನ್ ಮೂಲ ಕೋಡ್.

ಭಾಗ 5: ಬಿಡುಗಡೆ

ಗ್ರಾಫನಾಗಾಗಿ ಪ್ಲಗಿನ್‌ನ ಅಭಿವೃದ್ಧಿ: ದೊಡ್ಡ ಹೊಡೆತಗಳ ಇತಿಹಾಸ

ಒಮ್ಮೆ ನೀವು ನಿಮ್ಮ ಸ್ವಂತ ಗ್ರಾಫನಾ ಪ್ಲಗಿನ್ ಅನ್ನು ಬರೆದ ನಂತರ, ನೀವು ಸ್ವಾಭಾವಿಕವಾಗಿ ಅದನ್ನು ಸಾರ್ವಜನಿಕವಾಗಿ ಲಭ್ಯವಾಗುವಂತೆ ಮಾಡಲು ಬಯಸುತ್ತೀರಿ. ಗ್ರಾಫನಾದಲ್ಲಿ ಇದು ಇಲ್ಲಿ ಲಭ್ಯವಿರುವ ಪ್ಲಗಿನ್‌ಗಳ ಲೈಬ್ರರಿಯಾಗಿದೆ grafana.com/grafana/plugins

ನಿಮ್ಮ ಪ್ಲಗಿನ್ ಅಧಿಕೃತ ಅಂಗಡಿಯಲ್ಲಿ ಲಭ್ಯವಾಗಲು, ನೀವು PR ಅನ್ನು ಮಾಡಬೇಕಾಗಿದೆ ಈ ಭಂಡಾರrepo.json ಫೈಲ್‌ಗೆ ಈ ರೀತಿಯ ವಿಷಯವನ್ನು ಸೇರಿಸುವ ಮೂಲಕ:

ಗ್ರಾಫನಾಗಾಗಿ ಪ್ಲಗಿನ್‌ನ ಅಭಿವೃದ್ಧಿ: ದೊಡ್ಡ ಹೊಡೆತಗಳ ಇತಿಹಾಸ

ಅಲ್ಲಿ ಆವೃತ್ತಿಯು ನಿಮ್ಮ ಪ್ಲಗ್‌ಇನ್‌ನ ಆವೃತ್ತಿಯಾಗಿದೆ, url ಎಂಬುದು ರೆಪೊಸಿಟರಿಯ ಲಿಂಕ್ ಆಗಿದೆ ಮತ್ತು ಕಮಿಟ್ ಎಂಬುದು ಪ್ಲಗಿನ್‌ನ ನಿರ್ದಿಷ್ಟ ಆವೃತ್ತಿಯು ಲಭ್ಯವಿರುವ ಕಮಿಟ್‌ನ ಹ್ಯಾಶ್ ಆಗಿದೆ.

ಮತ್ತು ಔಟ್ಪುಟ್ನಲ್ಲಿ ನೀವು ಅಂತಹ ಅದ್ಭುತ ಚಿತ್ರವನ್ನು ನೋಡುತ್ತೀರಿ:

ಗ್ರಾಫನಾಗಾಗಿ ಪ್ಲಗಿನ್‌ನ ಅಭಿವೃದ್ಧಿ: ದೊಡ್ಡ ಹೊಡೆತಗಳ ಇತಿಹಾಸ

ಅದರ ಡೇಟಾವನ್ನು ನಿಮ್ಮ Readme.md, Changelog.md ಮತ್ತು ಪ್ಲಗಿನ್ ವಿವರಣೆಯೊಂದಿಗೆ plugin.json ಫೈಲ್‌ನಿಂದ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಪಡೆದುಕೊಳ್ಳಲಾಗುತ್ತದೆ.

ಭಾಗ 6: ತೀರ್ಮಾನಗಳ ಬದಲಿಗೆ

ಬಿಡುಗಡೆಯ ನಂತರ ನಾವು ನಮ್ಮ ಪ್ಲಗಿನ್ ಅನ್ನು ಅಭಿವೃದ್ಧಿಪಡಿಸುವುದನ್ನು ನಿಲ್ಲಿಸಲಿಲ್ಲ. ಮತ್ತು ಈಗ ನಾವು ಕ್ಲಸ್ಟರ್ ನೋಡ್‌ಗಳ ಸಂಪನ್ಮೂಲಗಳ ಬಳಕೆಯನ್ನು ಸರಿಯಾಗಿ ಮೇಲ್ವಿಚಾರಣೆ ಮಾಡುತ್ತಿದ್ದೇವೆ, UX ಅನ್ನು ಸುಧಾರಿಸಲು ಹೊಸ ವೈಶಿಷ್ಟ್ಯಗಳನ್ನು ಪರಿಚಯಿಸುತ್ತಿದ್ದೇವೆ ಮತ್ತು ಪ್ಲಗಿನ್ ಅನ್ನು ಸ್ಥಾಪಿಸಿದ ನಂತರ ನಮ್ಮ ಕ್ಲೈಂಟ್‌ಗಳು ಮತ್ತು GitHub ನಲ್ಲಿನ ಜನರಿಂದ (ನೀವು ತೊರೆದರೆ) ಸ್ವೀಕರಿಸಿದ ಹೆಚ್ಚಿನ ಪ್ರಮಾಣದ ಪ್ರತಿಕ್ರಿಯೆಯನ್ನು ಸಂಗ್ರಹಿಸುತ್ತಿದ್ದೇವೆ. ನಿಮ್ಮ ಸಮಸ್ಯೆ ಅಥವಾ ಪುಲ್ ವಿನಂತಿ, ನಾನು ತುಂಬಾ ಸಂತೋಷಪಡುತ್ತೇನೆ :)

ಈ ಲೇಖನವು ಗ್ರಾಫಾನಾದಂತಹ ಅದ್ಭುತ ಸಾಧನವನ್ನು ಅರ್ಥಮಾಡಿಕೊಳ್ಳಲು ನಿಮಗೆ ಸಹಾಯ ಮಾಡುತ್ತದೆ ಎಂದು ನಾವು ಭಾವಿಸುತ್ತೇವೆ ಮತ್ತು ಬಹುಶಃ ನಿಮ್ಮ ಸ್ವಂತ ಪ್ಲಗಿನ್ ಅನ್ನು ಬರೆಯಿರಿ.

ಧನ್ಯವಾದ!)

ಮೂಲ: www.habr.com

ಕಾಮೆಂಟ್ ಅನ್ನು ಸೇರಿಸಿ