إحصاءات ومراقبة البرامج النصية PHP في الوقت الحقيقي. ClickHouse وغرافانا تذهب لمساعدة بينبا

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

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

غالبًا ما لا يعلم أحد عدد المرات في الثانية / الدقيقة التي يتم فيها استدعاء نص معين ويبدأ في تحسين "باللمس" ، بدءًا من تلك الأماكن التي تبدو أكثر منطقية.

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

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



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

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

للقيام بذلك ، تحتاج إلى:

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

نظرًا لضآلة المعلومات حول pinba ، لدى الكثير منهم انطباع بأنه يعمل فقط على php5 وكان منذ فترة طويلة في الماضي ، ولكن كما سنرى لاحقًا ، هذا ليس كذلك.

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

apt install php-pinba 

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

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

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

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

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

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

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

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

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

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


udp server on go ، الذي يخزن المقاييس في OpenTSDB. ربما إذا كنت تستخدم OpenTSDB بالفعل في المشروع ، فإن مثل هذا الحل سوف يناسبك وإلا أوصي بالمرور.

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


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

الايجابيات:

  • يسمح لك InfluxDB بتجميع القياسات المستلمة وحذف الأصل بعد وقت محدد.

سلبيات:


ClickHouse-Ninja / Proton (January 2019)


udp server on go الذي يخزن المقاييس في ClickHouse. هذا هو قرار صديقي. بعد التعارف معه ، قررت أن الوقت قد حان لتناول pinbu و clickhouse.

الايجابيات:

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

سلبيات:

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

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


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

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

مبدأ العمل

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

قليلا عن clickhouse

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

إذا قررت في مرحلة ما تخزين البيانات المجمعة طوال الوقت ، والبيانات الخام فقط للأخيرة ، فيمكنك إنشاء عرض ملموس مع مجموعة ، وتنظيف الجدول الرئيسي pinba.requests بشكل دوري ، بينما ستبقى جميع البيانات في العرض المادي. علاوة على ذلك ، عند إنشاء جدول pinba.requests ، يمكنك تحديد "engine = Null" ، ثم لن يتم حفظ البيانات الخام على القرص على الإطلاق ، وفي نفس الوقت ستظل مدرجة في العرض المادي ويتم تجميعها وتخزينها. يمكنني استخدام هذا المخطط لمقاييس 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 ، استخدم اسم مستخدم المسؤول وكلمة مرور المسؤول. عند المدخل الأول ، سيطلب منك graphan تعيين كلمة مرور جديدة.

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

يدعم grafana العمل مع clickhouse من خلال مكون إضافي تابع لجهة خارجية ، ولكن بالنسبة للمكونات الإضافية من جهة خارجية ، لا تتوفر لدى grafans تنبيهات (كانت تذكرة لهذا مستمرة منذ عدة سنوات).

خادم بينبا

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

وحدة pinba تحت nginx

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

الخارقة الحياة

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

في البرامج النصية التي يمكن الوصول إليها من شبكة الإنترنت يمكنني استخدامها:

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

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

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

في لوحة المعلومات في graphan ، يوجد مفتاح ويب / وحدة تحكم لعرض الإحصائيات بشكل منفصل.

يمكنك أيضًا نقل علاماتك إلى pinbu ، على سبيل المثال:

 pinba_tag_set('country', $countryCode); 

هذا كل شيء.

طلب كبير للرد على استطلاعات الرأي بموجب المادة.

تقليديًا ، أحذر من أنني لا أنصح ولا أساعد من خلال الرسائل الشخصية للحبر والشبكات الاجتماعية.

بدء تذكرة على جيثب.

أيضا ، يرجى دعم النسخة الإنجليزية من هذه المقالة على reddit مع الإعجابات .

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


All Articles