إحصائيات ومراقبة نصوص PHP في الوقت الفعلي. ClickHouse و Grafana يذهبان لمساعدة Pinba

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

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

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

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

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

إحصائيات ومراقبة نصوص PHP في الوقت الفعلي. ClickHouse و Grafana يذهبان لمساعدة Pinba

والسبب الأول هو الإعداد.

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

للقيام بذلك:

  • تثبيت امتداد php (وقد ترغب في وحدة nginx)
  • تجميع ملحق ل mysql
  • تثبيت Pinboard وإعداد cron

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

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

apt install php-pinba

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

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

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

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

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

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

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

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

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

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

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

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

خادم UDP على الذهاب، من نفسه هابروسر، والذي يقوم هذه المرة بتخزين المقاييس في InfluxDB. تستخدم العديد من المشاريع بالفعل InfluxDB للمراقبة، لذلك يمكن أن يكون هذا الحل مثاليًا لها.

الايجابيات:

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

سلبيات:

ClickHouse-Ninja / بروتون (يناير 2019)

خادم udp أثناء التنقل والذي يحفظ المقاييس في ClickHouse. هذا هو حل صديقي. بعد أن تعرفت عليه قررت أن الوقت قد حان للتغلب على pinba و clickhouse.

الايجابيات:

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

سلبيات:

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

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

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

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

كيف يعمل

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

قليلا عن بيت النقر

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

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

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

تركيب

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

PHP بينبا

بعد التثبيت ، تأكد من عدم تعليق جميع الخيارات في الملف /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 تعيين كلمة مرور للمستخدم الافتراضي. بشكل افتراضي ، يتوفر هذا المستخدم من جميع عناوين IP ، لذلك إذا لم يكن لديك جدار حماية على الخادم ، فتأكد من تعيين كلمة مرور له. يمكن القيام بذلك أيضًا بعد التثبيت في ملف /etc/clickhouse-server/users.xml.

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

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

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

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

تدعم Grafana العمل مع Clickhouse من خلال مكون إضافي تابع لجهة خارجية، ولكن بالنسبة للمكونات الإضافية التابعة لجهات خارجية، لا تحتوي Grafana على تنبيهات (تم وزن تذكرة ذلك منذ عدة سنوات).

بينبا الخادم

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

وحدة pinba ضمن nginx

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

خارقة الحياة

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

في البرامج النصية المتوفرة من الويب، أستخدم:

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

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

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

تحتوي لوحة معلومات grafana الخاصة بي على مفتاح ويب / وحدة تحكم لعرض الإحصائيات بشكل منفصل.

يمكنك أيضًا إرسال العلامات الخاصة بك إلى Pinbu ، على سبيل المثال:

pinba_tag_set('country', $countryCode);

هذا كل شيء.

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

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

إنشاء تذكرة على جيثب.

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

يمكن للمستخدمين المسجلين فقط المشاركة في الاستطلاع. تسجيل الدخول، من فضلك.

ما هو نظام التشغيل الذي تستخدمه على الخادم؟

  • أوبونتو

  • CentOS

  • ديبيان

  • جنتو

  • ريد هات

  • فيدورا

  • زحمة

  • سوزي

  • يونكس

  • Windows

  • آخر

صوت 114 مستخدمين. امتنع 11 مستخدما عن التصويت.

ما هو إصدار php الذي تستخدمه على الخادم؟

  • 7.3

  • 7.2

  • 7.1

  • 7.0

  • 5

  • آخر

صوت 105 مستخدمين. امتنع 17 مستخدما عن التصويت.

هل سبق لك استخدام بينبا؟

  • نعم

  • لا، ولكن أود أن

  • لا ولا تريد

  • لا، لم أسمع عنها قط

صوت 100 مستخدمين. امتنع 14 مستخدما عن التصويت.

ما هو إصدار خادم pinba الذي ترغب في تجربته؟

  • pinba_engine (محرك mysql)

  • pinba2 (محرك mysql)

  • لوح الدبوس (php + mysql)

  • olegfedoseev/pinba-server (اذهب + OpenTSDB)

  • olegfedoseev/pinba-influxdb (go + influxdb)

  • خادم pinba/خادم pinba (اذهب + Clickhouse)

  • خادم pinba / خادم pinba (php + clickhouse)

  • أكتب بنفسي

  • آخر

صوت 39 مستخدمين. امتنع 47 مستخدما عن التصويت.

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

إضافة تعليق