إحصاءات ومراقبة البرامج النصية PHP في الوقت الحقيقي. انتقل ClickHouse و Grafana إلى Pinba للحصول على المساعدة

في هذه المقالة سوف أشرح كيفية استخدام pinba مع clickhouse و grafana بدلاً من pinba_engine و pinboard.

في مشروع php ، ربما تكون pinba هي الطريقة الوحيدة الموثوقة لفهم ما يحدث مع الأداء. لكن عادةً ما يبدأ الناس في استخدام pinba فقط عند ملاحظة المشكلات بالفعل وليس من الواضح مكان البحث فيها.

غالبًا ما يكون للمطورين أي فكرة عن عدد RPS لكل برنامج نصي. لذلك يبدأون في تحسين البدء من الأماكن التي يبدو أنها تواجه مشكلة.

يقوم شخص ما بتحليل سجلات nginx ، ويقوم شخص ما باستعلامات بطيئة في قاعدة البيانات.

بالطبع لن يكون pinba لا لزوم له ، ولكن هناك عدة أسباب لعدم وجوده في كل مشروع.



والسبب الأول هو التثبيت.

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

لذلك تحتاج:

  • تثبيت الإضافة لـ php (وقد ترغب في الحصول على وحدة نمطية لـ nginx)
  • ترجمة ملحقات لماي
  • تثبيت pinboard وتكوين كرون

نظرًا لأن لدينا القليل من المعلومات حول pinba مؤخرًا ، يعتقد الكثير من الناس أنها عملت فقط على php5 وقد اختفت ، ولكن كما سنرى لاحقًا ، هذا ليس صحيحًا.

الخطوة الأولى هي الأسهل ، كل ما عليك فعله هو تنفيذ الأمر:

apt install php-pinba 

في المستودعات ، يوجد هذا الامتداد حتى php 7.3 شاملاً ولا تحتاج إلى ترجمة أي شيء.

بعد تنفيذ أمر التثبيت ، نحصل على الفور على ملحق عمل يعمل بالفعل على تجميع وإرسال مقاييس كل برنامج نصي (المدة والذاكرة وما إلى ذلك) بواسطة udp على 127.0.0.1:370002 بالتنسيق protobuf .

ليس لدينا بعد تطبيق لالتقاط ومعالجة حزم udp ، لكن هذا لا يؤثر بشكل سيء على سرعة أو استقرار البرامج النصية php الخاصة بك.

حتى وقت قريب ، لم يتمكن سوى pinba_engine من التقاط حزم UDP ومعالجتها. إن وصف التثبيت " البسيط " لا يشجع مرة أخرى على قراءته. في قوائم طويلة من التبعيات ، توجد أسماء حزم وأسماء برامج وروابط لصفحات أخرى ذات تبعيات أخرى. لا أحد لديه الوقت أو الرغبة في التعامل مع هذه حماقة.

عملية التثبيت ل pinba2 ليست أسهل بشكل خاص .

ربما في الميزة يمكن تثبيت pinba10 بأمر واحد أو اثنين وبدون قراءة مجموعة من الأشياء لمعرفة كيفية القيام بذلك ، ولكن في الوقت الحالي ، ليس الأمر كذلك.

تركيب pinba_engine هو نصف القصة فقط. بعد كل شيء ، بدون pinboard سيكون لديك بيانات محدودة للدقائق القليلة الماضية فقط. من الجيد أن pinboard بسيط جدًا في التثبيت .

لكن كل المقاييس من php تذهب بالفعل إلى منفذ udp بتنسيق protobuf وكل ما هو مطلوب هو كتابة تطبيق يمكنه التقاط حزم udp ووضعه في نوع من التخزين؟ على ما يبدو ، فإن هؤلاء المطورين الذين فكروا في ذلك قاموا بإنشاء تطبيقات خاصة ونشر بعضها على githab.

فيما يلي استعراض لأربعة مشاريع مفتوحة المصدر تقوم بتخزين المقاييس في التخزين ، والتي يمكن من خلالها الحصول على هذه البيانات وتصورها بسهولة بواسطة grafana.

olegfedoseev / pinba-influxdb (نوفمبر 2017)


خادم udp على golang ، والذي يحفظ المقاييس في OpenTSDB. ربما إذا كنت تستخدم OpenTSDB بالفعل في مشروعك ، فإن مثل هذا الحل يناسبك.

olegfedoseev / pinba-influxdb (يونيو 2018)


خادم udp على golang ، من نفس مستخدم github ، والذي يحفظ هذه المرة المقاييس في InfluxDB. تستخدم العديد من المشروعات بالفعل InfluxDB للمراقبة ، لذلك قد يكون هذا الحل مفيدًا لهم.

الايجابيات:

  • يسمح التدفق بتجميع المقاييس الناتجة وإزالة الأصل بعد وقت محدد.

سلبيات:

  • هذا الحل لا يحفظ المعلومات لأجهزة ضبط الوقت.
  • سيوفر InfluxDB عناوين الصفحات كعلامات وإذا كان لديك الكثير من العناوين الفريدة للصفحات ، فسيؤدي ذلك إلى زيادة استهلاك ذاكرة الوصول العشوائي. من نقطة معينة ، " سيبدأ استخدام الكثير من الذاكرة ". ( المصدر )

ClickHouse-Ninja / Proton (January 2019)


udp server على golang ، والذي يحفظ المقاييس في ClickHouse. هذا هو تطبيق صديقي. بعد الاستخدام ، بدأت العمل على طلبي الخاص بـ pinba مع clickhouse.

الايجابيات:

  • تعتبر click Click مثالية لمثل هذه المهام ، فهي تتيح لك ضغط البيانات بحيث يمكنك تخزين جميع البيانات الأولية حتى بدون تجميعات
  • إذا كنت بحاجة ، يمكنك بسهولة تجميع المقاييس الناتجة
  • قالب جاهز لغرافانا
  • يحفظ المعلومات لأجهزة ضبط الوقت

سلبيات:

  • لم يخترع هنا
  • لا يوجد تكوين لاسم قاعدة البيانات والجداول ، لعنوان ومنفذ
    الخادم.
  • الأشياء الصغيرة الأخرى التي تتدفق من ناقص الأول

خادم بينبا / خادم بينبا (أبريل 2019)


خادم udp على php ، والذي يحفظ المقاييس في ClickHouse. هذا هو طلبي ، وهو نتيجة ل RND بلدي pinba ، ClickHouse و protobuf. كتبت "دليل على المفهوم" ، والذي لم يستهلك بشكل غير متوقع موارد كبيرة (30 ميغابايت من ذاكرة الوصول العشوائي وأقل من 1 ٪ من واحد من النوى الثمانية للمعالجات) ، لذلك قررت أن أشاركه مع الناس.

المزايا هي نفسها كما في الحل السابق ، كما أنني استخدمت الأسماء المعتادة من pinba_engine الأصلي. لقد أضفت أيضًا تهيئة تتيح لك تشغيل العديد من مثيلات pinbasver لحفظ المقاييس في جداول مختلفة - وهذا مفيد إذا كنت ترغب في جمع قياسات ليس فقط من php ، ولكن أيضًا من nginx.

سلبيات - "لم يخترع هنا" وتلك الأشياء الصغيرة التي لا تناسبك شخصيًا ، لكن حلي بسيط للغاية ويتألف من حوالي 100 سطر فقط من التعليمات البرمجية ، لذلك يمكن لأي مطور php تغيير أي شيء في بضع دقائق يقوم بها ليس مثل.

كيف يعمل

إنها تستمع udp-port 30002. يتم فك تشفير جميع الحزم الواردة وفقًا لنظام protobuf ويتم تجميعها. مرة واحدة في الدقيقة ، يتم إدخال مجموعة الحزم في clickhouse في جدول pinba.requests. (يتم تكوين جميع الإعدادات في التكوين )

حول ClickHouse

Clickhouse يدعم محركات تخزين البيانات المختلفة. الأكثر استخداما هو MergeTree.

إذا قررت في مرحلة ما تخزين البيانات المجمّعة طوال الوقت ، والبيانات الخام فقط للأخيرة ، يمكنك إنشاء طريقة عرض ملموسة بالتجميع والتنظيف الدوري للجدول الرئيسي pinba.requests ، بينما تظل جميع البيانات في طريقة العرض الملموسة. علاوة على ذلك ، يمكنك تحديد "engine = Null" لجدول pinba.requests ، وبالتالي لن يتم حفظ البيانات الخام على القرص على الإطلاق وفي نفس الوقت ستظل مدرجة في العرض المادي. يمكنني استخدام هذا المخطط لمقاييس nginx ، لأنه في nginx لدي 50 مرة أكثر من الطلبات على php.

لقد قطعت شوطًا طويلًا ، لذلك سيكون هناك وصف تفصيلي لتركيب الحل الخاص بي وتهيئته وكل ما تحتاجه. تم وصف عملية التثبيت بأكملها لـ Ubuntu 18.04 LTS و Centos 7 ، على توزيعات وإصدارات أخرى قد تختلف العملية قليلاً.

تركيب


لقد وضعت جميع الأوامر اللازمة ل Dockerfile لاستنساخ التعليمات. سيتم وصف المشاكل فقط أدناه.

فب بينبا

بعد التثبيت ، تأكد من إلغاء جميع الخيارات في ملف /etc/php/7.2/fpm/conf.d/20-pinba.ini. في بعض التوزيعات (على سبيل المثال ، centos) يمكن تعليقها.

 extension = pinba.so pinba.enabled = 1 pinba.server = 127.0.0.1:30002 

clickhouse

أثناء التثبيت ، سيطلب منك clickhouse تعيين كلمة مرور للمستخدم الافتراضي. بشكل افتراضي ، يكون هذا المستخدم متاحًا من جميع عناوين IP. لذلك إذا لم يكن لديك جدار حماية على الخادم الخاص بك ، فيرجى تعيين كلمة مرور. يمكن القيام بذلك أيضًا بعد التثبيت في ملف /etc/clickhouse-server/users.xml.

لاحظ أيضًا أن clickhouse يستخدم عدة منافذ ، بما في ذلك 9000. يُستخدم هذا المنفذ أيضًا لـ php-fpm في بعض التوزيعات (على سبيل المثال ، centos). إذا كنت تستخدم هذا المنفذ بالفعل ، فيمكنك تغييره إلى منفذ آخر في ملف /etc/clickhouse-server/config.xml.

grafana مع البرنامج المساعد clickhouse

بعد تثبيت grafana ، استخدم اسم المستخدم "admin" وكلمة المرور "admin". عند تسجيل الدخول لأول مرة ، سيطلب منك grafana تعيين كلمة مرور جديدة.

بعد ذلك ، انتقل إلى القائمة "+" -> استيراد وحدد عدد لوحات المعلومات المراد استيرادها 10011 . لقد قمت بإعداد لوحة القيادة هذه حتى لا تحتاج إلى القيام بذلك بنفسك مرة أخرى.

يدعم Grafana ClickHouse بواسطة مكونات إضافية تابعة لجهة خارجية ، لكن grafana لا تدعم التنبيهات الخاصة بالمكونات الإضافية لجهة خارجية (التذكرة موجودة بالفعل منذ عدة سنوات).

خادم بينبا

تثبيت protobuf و libevent أمر اختياري ، لكنه يحسن أداء خادم pinba. إذا قمت بتثبيت خادم pinba في مجلد غير / opt ، فستحتاج أيضًا إلى تغيير ملف البرنامج النصي systemd .

بينبا وحدة تحت nginx

لتجميع الوحدة النمطية ، ستحتاج إلى شفرة المصدر الخاصة بنفس إصدار nginx المثبت بالفعل على الخادم الخاص بك ، وكذلك خيارات التجميع نفسها ، وإلا فإن التجميع سيكون ناجحًا ، ولكن عندما تكون الوحدة النمطية متصلة ، ستخطئ " الوحدة هي ثنائي غير متوافق. " يمكن عرض خيارات الترجمة باستخدام أمر "nginx -V".

Lifehacks

جميع مواقعي تعمل فقط على https. لذلك أستخدم الحقل "مخطط" لفصل الويب / وحدة التحكم.
في نصوص الويب التي أستخدمها:

 if (ini_get('pinba.enabled')) {    pinba_schema_set('web'); } 

وفي وحدة التحكم (على سبيل المثال ، البرامج النصية cron):

 if (ini_get ('pinba.enabled')) {    pinba_schema_set('console'); } 

في لوحة المعلومات في grafana ، يوجد مفتاح ويب / وحدة تحكم لعرض الإحصائيات بشكل منفصل.
يمكنك أيضًا إرسال علاماتك إلى pinba ، على سبيل المثال:

 pinba_tag_set('country', $countryCode); 

هذا كل شيء.

يمكنك أيضا قراءة النسخة الروسية .

الرجاء الإجابة على الاستطلاعات في إطار المقال ودعمني على رديت .

Source: https://habr.com/ru/post/ar449818/


All Articles