تطوير البرنامج المساعد لـ Grafana: تاريخ المخاريط المحشوة

أهلاً بكم! قبل بضعة أشهر ، أطلقنا مشروعنا الجديد مفتوح المصدر في الإنتاج - المكون الإضافي Grafana لمراقبة kubernetes ، والذي أطلقنا عليه DevOpsProdigy KubeGraf. كود مصدر البرنامج المساعد متاح في المستودع العام على جيثب. وفي هذه المقالة ، نريد أن نشارككم قصة كيفية إنشاء المكون الإضافي ، والأدوات التي استخدمناها ، والمزالق التي واجهناها في عملية التطوير. دعنا نذهب!

الجزء 0 - تمهيدي: كيف وصلنا إلى هذه النقطة؟

ولدت فكرة كتابة البرنامج الإضافي الخاص بنا لـ Grafan عن طريق الصدفة. تراقب شركتنا مشاريع الويب بمستويات مختلفة من التعقيد لأكثر من 10 سنوات. خلال هذا الوقت ، اكتسبنا الكثير من الخبرة والحالات الشيقة والخبرة في استخدام أنظمة المراقبة المختلفة. وفي وقت ما سألنا أنفسنا: "هل هناك أداة سحرية لمراقبة Kubernetes ، بحيث ، كما يقولون ،" اضبطها وانساها "؟" وكحلول جاهزة لهذه المجموعة ، هناك مجموعة كبيرة من أنواع مختلفة من الأدوات: بروميثيوس-عامل ، مجموعة من لوحات المعلومات kubernetes-mixin ، grafana-kubernetes-app.

يبدو أن المكون الإضافي grafana-kubernetes-app هو الخيار الأكثر إثارة للاهتمام بالنسبة لنا ، لكنه لم يتم دعمه لأكثر من عام ، علاوة على ذلك ، لا يعرف كيفية العمل مع الإصدارات الجديدة من node-exporter و kube-state- المقاييس. وفي مرحلة ما قررنا: "ألا يجب أن نتخذ قرارنا بأنفسنا؟"

ما هي الأفكار التي قررنا تنفيذها في المكون الإضافي الخاص بنا:

  • تصور "خريطة التطبيق": عرض مناسب للتطبيقات في مجموعة ، مجمعة حسب مساحات الأسماء وعمليات النشر… ؛
  • تصور الروابط مثل "النشر - الخدمة (+ المنافذ)".
  • تصور توزيع التطبيقات العنقودية بواسطة العقد العنقودية.
  • جمع المقاييس والمعلومات من عدة مصادر: خادم Prometheus و k8s api.
  • مراقبة كل من جزء البنية التحتية (استخدام وقت المعالج ، والذاكرة ، والنظام الفرعي للقرص ، والشبكة) ومنطق التطبيق - الحالة الصحية للقرون ، وعدد النسخ المتماثلة المتاحة ، ومعلومات حول مرور تحقيقات الحيوية / الجاهزية.

الجزء 1: ما هو "البرنامج المساعد لـ Grafana"؟

من وجهة نظر فنية ، يعد المكون الإضافي لـ Grafana عبارة عن وحدة تحكم زاوي يتم تخزينها في دليل بيانات Grafana (/ var / grafana / plugins / /dist/module.js) ويمكن تحميلها كوحدة SystemJS. في هذا الدليل أيضًا ، يجب أن يكون هناك ملف plugin.json يحتوي على جميع المعلومات الوصفية حول المكون الإضافي الخاص بك: الاسم ، والإصدار ، ونوع المكون الإضافي ، والروابط إلى المستودع / الموقع / الترخيص ، والتبعيات ، وما إلى ذلك.

تطوير البرنامج المساعد لـ Grafana: تاريخ المخاريط المحشوة
Module.ts

تطوير البرنامج المساعد لـ Grafana: تاريخ المخاريط المحشوة
plugin.json

كما ترى في لقطة الشاشة ، فقد حددنا plugin.type = app. يمكن أن تكون المكونات الإضافية لـ Grafana من ثلاثة أنواع:

لوحة: أكثر أنواع المكونات الإضافية شيوعًا - هي لوحة لتصور أي مقاييس ، تُستخدم لبناء لوحات معلومات متنوعة.
مصدر بيانات: موصل مكون إضافي إلى أي مصدر بيانات (على سبيل المثال ، مصدر بيانات Prometheus ، ClickHouse-datasource ، ElasticSearch-datasource).
التطبيق: مكوّن إضافي يسمح لك بإنشاء تطبيق الواجهة الأمامية الخاص بك داخل Grafana ، وإنشاء صفحات html الخاصة بك ، والوصول يدويًا إلى مصدر البيانات لتقديم بيانات متنوعة. يمكن أيضًا استخدام المكونات الإضافية من أنواع أخرى (مصدر البيانات واللوحة) ولوحات المعلومات المختلفة كعناصر تبعيات.

تطوير البرنامج المساعد لـ Grafana: تاريخ المخاريط المحشوة
مثال على تبعيات البرنامج المساعد مع type = app.

كلغة برمجة ، يمكنك استخدام كل من JavaScript و TypeScript (اخترناه). يمكنك إنشاء قوالب لإضافات hello-world من أي نوع العثور على الرابط: يحتوي هذا المستودع على عدد كبير من حزم المبتدئين (حتى أن هناك مثالًا تجريبيًا لمكوِّن إضافي لـ React) مع بنائين مُثبتين مسبقًا ومُهيئين.

الجزء الثاني: تهيئة البيئة المحلية

للعمل على المكون الإضافي ، بالطبع ، نحتاج إلى مجموعة kubernetes مع جميع الأدوات المثبتة مسبقًا: prometheus و node-exporter و kube-state-metrics و grafana. يجب إعداد البيئة بسرعة وسهولة وبشكل طبيعي ، ولضمان إعادة تحميل دليل بيانات Grafana مباشرةً ، يجب تثبيته مباشرةً من جهاز المطور.

الطريقة الأكثر ملاءمة ، في رأينا ، للعمل محليًا مع kubernetes هي ميني كيوب. الخطوة التالية هي تثبيت حزمة Prometheus + Grafana باستخدام مشغل بروميثيوس. في هذا المقال تم وصف عملية تثبيت مشغل بروميثيوس على minikube بالتفصيل. لتمكين الاستمرارية ، يجب عليك تعيين المعلمة المثابرة: صحيح في ملف الرسوم البيانية / grafana / القيم. yaml ، أضف PV و PVC الخاصة بك وحددها في المعلمة persistent.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

الجزء الثالث: التطوير المباشر

نموذج الكائن

كتحضير لتنفيذ المكون الإضافي ، قررنا وصف جميع كيانات Kubernetes الأساسية التي سنعمل معها في شكل فئات TypeScript: pod ، والتوزيع ، و 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;
}

الصفحات

تم وصف قائمة جميع صفحات المكون الإضافي في البداية في pluing.json الخاص بنا في قسم التبعيات:

تطوير البرنامج المساعد لـ Grafana: تاريخ المخاريط المحشوة

في كتلة كل صفحة ، يجب أن نحدد اسم الصفحة (سيتم تحويلها بعد ذلك إلى سبيكة والتي من خلالها ستكون هذه الصفحة متاحة) ؛ اسم المكون المسؤول عن تشغيل هذه الصفحة (يتم تصدير قائمة المكونات إلى module.ts) ؛ تحديد دور المستخدم الذي يتوفر من أجله العمل مع هذه الصفحة وإعدادات التنقل للشريط الجانبي.

في المكون المسؤول عن الصفحة ، يجب علينا تعيين templateUrl عن طريق تمرير المسار إلى ملف html مع الترميز هناك. داخل وحدة التحكم ، من خلال حقن التبعية ، يمكننا الوصول إلى ما يصل إلى خدمتين زاوية مهمتين:

  • backendSrv - خدمة توفر التفاعل مع خادم grafana api ؛
  • datasourceSrv - خدمة توفر تفاعلًا محليًا مع جميع مصادر البيانات المثبتة في Grafana (على سبيل المثال ، طريقة .getAll () - تعرض قائمة بجميع مصادر البيانات المثبتة ؛ .get ( ) - إرجاع كائن مثيل لمصدر بيانات محدد.

تطوير البرنامج المساعد لـ Grafana: تاريخ المخاريط المحشوة

تطوير البرنامج المساعد لـ Grafana: تاريخ المخاريط المحشوة

تطوير البرنامج المساعد لـ Grafana: تاريخ المخاريط المحشوة

الجزء 4: مصدر البيانات

من وجهة نظر Grafana ، فإن مصدر البيانات هو نفس المكوِّن الإضافي تمامًا مثل جميع الإضافات الأخرى: فهو يحتوي على نقطة دخول module.js خاصة به ، ويوجد ملف plugin.json به معلومات وصفية. عند تطوير مكون إضافي باستخدام type = app ، يمكننا التفاعل مع كل من مصادر البيانات الحالية (على سبيل المثال ، مصدر بيانات prometheus) ومصدرنا الخاص بنا ، والذي يمكننا تخزينه مباشرةً في دليل البرنامج المساعد (dist / datasource / *) أو تثبيته كعنصر تبعية . في حالتنا ، يأتي مصدر البيانات مع كود البرنامج المساعد. من الضروري أيضًا أن يكون لديك نموذج config.html ووحدة تحكم ConfigCtrl التي سيتم استخدامها لصفحة تكوين مثيل مصدر البيانات ووحدة تحكم مصدر البيانات التي تنفذ منطق مصدر البيانات.

في البرنامج المساعد KubeGraf ، من حيث واجهة المستخدم ، فإن مصدر البيانات هو مثيل لمجموعة kubernetes التي تنفذ الميزات التالية (يتوفر كود المصدر رابط):

  • إحضار البيانات من خادم واجهة برمجة تطبيقات k8s (الحصول على قائمة بمساحات الأسماء وعمليات النشر ...)
  • إنشاء وكيل للطلبات لمصدر بيانات بروميثيوس (الذي يتم تحديده في إعدادات البرنامج المساعد لكل مجموعة محددة) وتنسيق الاستجابات لاستخدام البيانات في كل من الصفحات الثابتة ولوحات المعلومات.
  • تحديث البيانات على الصفحات الثابتة من البرنامج المساعد (مع وقت معدل تحديث محدد).
  • معالجة الاستعلامات لتشكيل ورقة قالب في لوحات معلومات grafana (method .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"};
       })
}

نقطة منفصلة مثيرة للاهتمام ، في رأينا ، هي تنفيذ آلية المصادقة والترخيص لمصدر البيانات. كقاعدة عامة ، خارج الصندوق ، لتهيئة الوصول إلى مصدر البيانات النهائي ، يمكننا استخدام مكون Grafana المدمج - مصدر البيانات - إعدادات HTTP. باستخدام هذا المكون ، يمكننا تكوين الوصول إلى مصدر بيانات http عن طريق تحديد عنوان url وإعدادات المصادقة / التفويض الأساسية: كلمة مرور تسجيل الدخول ، أو شهادة العميل / مفتاح العميل. من أجل تنفيذ القدرة على تكوين الوصول باستخدام رمز الحامل (المعيار الفعلي لـ k8s) ، كان علي أن أفعل القليل من "الغش".

لحل هذه المشكلة ، يمكنك استخدام آلية Grafana "Plugin Routes" المضمنة (المزيد حول صفحة التوثيق الرسمية). في إعدادات مصدر البيانات لدينا ، يمكننا الإعلان عن مجموعة من قواعد التوجيه التي ستتم معالجتها بواسطة خادم وكيل grafana. على سبيل المثال ، لكل نقطة نهاية فردية ، هناك إمكانية لإعداد ترويسات أو عنوان url مع إمكانية عمل قوالب ، يمكن الحصول على البيانات الخاصة بها من حقول jsonData و secureJsonData (لتخزين كلمات المرور أو الرموز المميزة في شكل مشفر). في مثالنا ، استعلامات مثل / __ proxy / api / v1 / مساحات الأسماء سيتم توكيله إلى عنوان url الخاص بالنموذج
/ api / v8 / مساحات الأسماء برأس الإذن: Bearer.

تطوير البرنامج المساعد لـ Grafana: تاريخ المخاريط المحشوة

تطوير البرنامج المساعد لـ Grafana: تاريخ المخاريط المحشوة

بطبيعة الحال ، للعمل مع خادم k8s api ، نحتاج إلى مستخدم لديه حق الوصول للقراءة فقط ، وهي بيانات للإنشاء يمكنك العثور عليها أيضًا كود مصدر البرنامج المساعد.

الجزء 5: الافراج

تطوير البرنامج المساعد لـ Grafana: تاريخ المخاريط المحشوة

بمجرد كتابة مكون Grafana الإضافي الخاص بك ، سترغب بطبيعة الحال في إتاحته للجمهور. في Grafana ، هذه مكتبة مكونة إضافية متوفرة على الرابط grafana.com/grafana/plugins

لكي يكون المكون الإضافي الخاص بك متاحًا في المتجر الرسمي ، تحتاج إلى إنشاء علاقات عامة هذا المستودع، بإضافة المحتوى التالي إلى ملف repo.json:

تطوير البرنامج المساعد لـ Grafana: تاريخ المخاريط المحشوة

حيث يكون الإصدار هو إصدار المكون الإضافي الخاص بك ، فإن url هو رابط إلى المستودع ، والتثبيت هو تجزئة الالتزام الذي سيجعل إصدار المكون الإضافي المحدد متاحًا.

وعند الإخراج سترى صورة رائعة للشكل:

تطوير البرنامج المساعد لـ Grafana: تاريخ المخاريط المحشوة

سيتم سرقة البيانات الخاصة به تلقائيًا من ملف Readme.md و Changelog.md وملف plugin.json مع وصف البرنامج المساعد.

الجزء 6: بدلا من الاستنتاجات

لم نتوقف عن تطوير المكون الإضافي الخاص بنا بعد الإصدار. والآن نحن نعمل على المراقبة الصحيحة لاستخدام موارد عقد المجموعة ، وإدخال ميزات جديدة لتحسين تجربة المستخدم ، ونقوم أيضًا بتجميع قدر كبير من التعليقات الواردة بعد تثبيت المكون الإضافي من قبل عملائنا ومنهم على حد سواء ishshui على جيثب (إذا تركت مشكلتك أو قمت بسحب الطلب ، سأكون سعيدًا جدًا 🙂).

نأمل أن تساعدك هذه المقالة في فهم أداة رائعة مثل Grafana ، وربما كتابة المكون الإضافي الخاص بك.

شكرا لك!)

المصدر: www.habr.com

إضافة تعليق